You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:43:23