如何解决IAM认证连接MySQL RDS时的1045访问拒绝错误
看起来你已经完成了基础配置,但还是遇到了1045访问拒绝错误,我之前排查过类似的问题,给你几个关键的排查步骤,按顺序来大概率能解决:
1. 确认RDS实例的IAM认证确实处于启用状态
虽然你说创建时勾选了,但有时候配置可能被意外修改。可以通过两种方式验证:
- 在RDS控制台,找到你的实例,进入「配置」标签,查看「IAM数据库认证」的状态是否为「已启用」
- 用AWS CLI执行命令:
如果返回aws rds describe-db-instances --db-instance-identifier <你的RDS实例名> --query 'DBInstances[0].IAMDatabaseAuthenticationEnabled'true才是正确的,否则需要重新启用IAM数据库认证。
2. 验证数据库用户的认证插件配置
登录你的RDS数据库(用有管理员权限的账号),执行以下SQL查询:
SELECT user, plugin FROM mysql.user WHERE user='lambda';
确保返回的plugin字段值是AWSAuthenticationPlugin。如果不是,需要重新设置用户的认证方式:
ALTER USER 'lambda' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'; FLUSH PRIVILEGES;
有时候CREATE USER语句可能因为某些原因没有生效,重新执行ALTER USER能确保配置正确。
3. 检查IAM策略的Resource ARN是否正确
这是最容易出错的地方!你之前用的<DB-ARN>/lambda格式是错误的,IAM策略中rds-db:connect对应的Resource必须是dbuser的ARN,而不是RDS实例的ARN。正确的ARN格式是:
arn:aws:rds-db:<区域>:<AWS账号ID>:dbuser:<DB资源ID>/lambda
获取正确的DB资源ID(DbiResourceId)可以用CLI:
aws rds describe-db-instances --db-instance-identifier <你的RDS实例名> --query 'DBInstances[0].DbiResourceId'
比如你的区域是us-east-1,账号ID是123456789012,DbiResourceId是db-ABCDEFGHIJKLMNOPQRST,那么正确的Resource应该是:
arn:aws:rds-db:us-east-1:123456789012:dbuser:db-ABCDEFGHIJKLMNOPQRST/lambda
修改IAM策略后,记得重新附加到Lambda执行角色和EC2的IAM角色上,等待策略生效(通常几分钟)。
4. 验证MySQL客户端版本兼容性
AWSAuthenticationPlugin对MySQL客户端版本有要求:
- 如果是MySQL 5.6版本的RDS,客户端版本需要至少是5.7.19或更高
- 如果是MySQL 5.7/8.0,客户端版本至少是对应大版本的更新版本
你可以在EC2上执行mysql --version查看客户端版本,如果版本过低,建议升级客户端。比如在Amazon Linux 2上可以用yum install mysql-community-client来安装较新的版本。
5. 排除网络和安全组的潜在问题
虽然你的错误是Access Denied(不是连接超时),但还是要快速确认:
- Lambda/EC2的安全组是否允许出站访问RDS实例的3306端口
- RDS实例的安全组是否允许来自Lambda/EC2安全组的3306端口入站流量
- 如果RDS是私有访问模式,Lambda/EC2是否在同一个VPC的私有子网中,能正常解析RDS的endpoint
按照以上步骤逐一排查,应该能解决你的访问拒绝问题。
内容的提问来源于stack exchange,提问作者NBajanca

