使用IAM认证的Node.js Lambda连接RDS MySQL遇权限拒绝
IAM认证连接RDS MySQL报错Access Denied的排查思路
1. 确认MySQL用户的IAM认证配置是否正确
执行以下SQL语句,确保用户是通过AWSAuthenticationPlugin认证的:
CREATE USER 'myuser' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'myuser'; FLUSH PRIVILEGES;
关键:不能给这个用户设置普通密码,必须用IDENTIFIED WITH AWSAuthenticationPlugin指定IAM认证方式。
2. 检查Lambda执行角色的权限
确保Lambda的IAM角色包含rds-db:connect权限,策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rds-db:connect", "Resource": "arn:aws:rds-db:你的区域:你的账号ID:dbuser:你的RDS资源ID/myuser" } ] }
RDS资源ID可以在控制台实例详情页的“配置”标签下找到,必须严格匹配格式。
3. 验证RDS实例的IAM认证已启用
在RDS控制台进入实例配置,确认“IAM数据库认证”开关已打开,未开启的话IAM认证无法生效。
4. 代码细节优化
- 简化Auth Token获取:Signer实例初始化时已传入参数,直接调用
signer.getAuthToken()即可,无需重复传参:authPlugins: { mysql_clear_password: () => () => signer.getAuthToken() } - 推荐使用mysql2库:mysql2对IAM认证的支持更完善,替换后可以简化代码,同时避免兼容性问题。
- SSL配置补全:确保SSL证书正确加载,可直接使用AWS官方提供的RDS CA证书:
const fs = require('fs'); // 注意:需要将对应的RDS CA证书文件打包到Lambda部署包中 ssl: { ca: fs.readFileSync('./rds-ca-2019-root.pem') } - 环境变量校验:确认
ENDPOINT是RDS的端点地址(不带端口),DB_PORT为数字类型(如3306),REGION与RDS实例区域一致。
5. 网络连通性检查
- 确认Lambda函数部署在RDS实例所在的VPC子网内,且RDS安全组允许Lambda安全组访问3306端口。
- 若Lambda不在VPC中,需确保RDS开启公网访问,且安全组允许Lambda的出站IP段访问,但这种方式不推荐生产环境使用。
6. 调试Auth Token有效性
在代码中添加日志打印获取到的token,确认token是否能正常生成。若token获取失败,直接排查Lambda角色的权限配置;若token生成正常,再验证MySQL用户的权限和RDS的IAM开关状态。
内容的提问来源于stack exchange,提问作者Giuseppe Alfredo Dimola
相关产品推荐
相关产品推荐

