AWS Lambda Node.js(v16)无法访问Aurora MySQL问题求助
问题分析与排查建议
问题概述
部署在AWS Lambda的Node.js 16应用连接Aurora MySQL时出现权限拒绝错误:
{ "errorType": "Error", "errorMessage": "ER_ACCESS_DENIED_ERROR: Access denied for user 'mailQueue'@'172.31.40.76' (using password: YES)", "trace": [ "Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'mailQueue'@'172.31.40.76' (using password: YES)", " at Handshake.Sequence._packetToError (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)", " at Handshake.ErrorPacket (/var/task/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)", " at Protocol._parsePacket (/var/task/node_modules/mysql/lib/protocol/Protocol.js:291:23)", " at Parser._parsePacket (/var/task/node_modules/mysql/lib/protocol/Parser.js:433:10)", " at Parser.write (/var/task/node_modules/mysql/lib/protocol/Parser.js:43:10)", " at Protocol.write (/var/task/node_modules/mysql/lib/protocol/Protocol.js:38:16)", " at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:88:28)", " at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:526:10)", " at Socket.emit (node:events:527:28)", " at Socket.emit (node:domain:475:12)", " --------------------", " at Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol/Protocol.js:144:48)", " at Protocol.handshake (/var/task/node_modules/mysql/lib/protocol/Protocol.js:51:23)", " at PoolConnection.connect (/var/task/node_modules/mysql/lib/Connection.js:116:18)", " at Pool.getConnection (/var/task/node_modules/mysql/lib/Pool.js:48:16)", " at Runtime.exports.handler (/var/task/index.js:15:10)", " at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1028:29)" ] }
已确认Aurora安全组允许172.31.0.0/16网段连接,用户mailQueue配置了@%的访问权限且拥有emailTransactions库的全部权限。
排查步骤
1. 核对Lambda的数据库密码配置
- Lambda环境变量可能与本地不一致,检查密码是否正确设置:
- 若用环境变量存密码,确认无拼写错误、特殊字符未被意外转义(比如
$、!等在环境变量中需特殊处理)。 - 若用AWS Secrets Manager,确认Lambda的IAM权限允许读取Secret,且Secret内密码与本地测试用的一致。
- 若用环境变量存密码,确认无拼写错误、特殊字符未被意外转义(比如
- 可临时在Lambda代码中打印连接配置(屏蔽敏感密码),验证是否正确读取到预期的用户名和密码。
2. 检查MySQL用户的主机条目冲突
MySQL会优先匹配最具体的主机规则,若存在多个mailQueue用户条目(比如mailQueue@localhost、mailQueue@172.31.%),可能导致认证时使用了非@%的条目:
- 执行SQL查看所有相关用户:
SELECT user, host FROM mysql.user WHERE user = 'mailQueue'; - 若存在多余的主机条目,删除后刷新权限:
DROP USER 'mailQueue'@'localhost'; -- 替换为实际多余的主机值 FLUSH PRIVILEGES;
3. 重置用户密码并刷新权限
即使权限显示正确,密码哈希可能存在不匹配的情况:
- 执行SQL重置密码并刷新权限:
ALTER USER 'mailQueue'@'%' IDENTIFIED BY 'your-secure-password'; FLUSH PRIVILEGES; - 更新Lambda的密码配置后重新测试连接。
4. 验证Lambda的VPC网络配置
- 确认Lambda部署在允许访问Aurora的VPC子网中,且Lambda的安全组允许出站访问Aurora的3306端口(或自定义MySQL端口)。
- 可通过Lambda执行简单的端口测试(比如用Node.js的
net模块)确认是否能连接到Aurora的端口。
5. 检查MySQL的连接认证插件
部分Aurora版本默认使用caching_sha2_password插件,而旧版Node.js的mysql库可能不兼容:
- 查看用户的认证插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'mailQueue'; - 若插件为
caching_sha2_password,修改为兼容的mysql_native_password:ALTER USER 'mailQueue'@'%' IDENTIFIED WITH mysql_native_password BY 'your-password'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者AtWrkTech
相关产品推荐
相关产品推荐

