Python+Serverless连接AWS RDS MySQL遇1045访问拒绝问题排查
排查RDS访问拒绝错误的可能配置缺失
针对你遇到的本地运行(serverless offline)和部署到AWS后均无法连接RDS,报Access denied for user 'myuser'@'[IP]'的问题,结合提供的配置信息,以下是关键排查点:
1. MySQL用户权限未覆盖应用访问IP
Workbench能正常连接,说明myuser仅被授权从Workbench的IP访问,但应用的访问IP(本地公网IP152.241.43.211、Lambda的VPC私网IP172.31.x.x)不在授权列表中。
- 解决步骤:
登录MySQL执行授权命令,允许用户从任意IP访问(测试用,后续可限制特定IP段):
或针对Lambda的VPC网段授权:GRANT ALL PRIVILEGES ON dev.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword'; FLUSH PRIVILEGES;GRANT ALL PRIVILEGES ON dev.* TO 'myuser'@'172.31.0.0/16' IDENTIFIED BY 'mypassword'; FLUSH PRIVILEGES;
2. RDS安全组未允许Lambda或本地IP的流量
从配置看,RDS绑定的安全组是sg-99999999,而Lambda使用的是sg-9187d5f4,两者未建立互通规则:
- 解决步骤:
- 进入AWS控制台的EC2安全组页面,找到
sg-99999999(RDS的安全组)。 - 添加入站规则:
- 对于Lambda:选择
MySQL/Aurora(3306端口),源地址设为Lambda的安全组IDsg-9187d5f4。 - 对于本地运行:选择
MySQL/Aurora,源地址设为你的公网IP152.241.43.211/32。
- 对于Lambda:选择
- 进入AWS控制台的EC2安全组页面,找到
3. Lambda所在VPC子网无公网访问能力(针对部署后的场景)
RDS配置了PubliclyAccessible=true,但Lambda在VPC子网内,若子网未配置NAT网关,Lambda的私网IP无法访问公网RDS:
- 解决步骤:
要么为Lambda的子网配置NAT网关(需配合路由表指向NAT),要么改为让Lambda通过私网访问RDS:- 确认RDS的VPC与Lambda的VPC是同一个(从配置看都是
vpc-f01de59b),直接在RDS安全组中允许Lambda所在VPC的CIDR172.31.0.0/16访问3306端口即可,无需公网访问。
- 确认RDS的VPC与Lambda的VPC是同一个(从配置看都是
4. MySQL 8.0认证插件兼容性问题
RDS使用MySQL 8.0.36,默认认证插件为caching_sha2_password,而pymysql对该插件的支持可能存在问题:
- 解决步骤:
方法一:修改用户的认证插件为mysql_native_password:
方法二:在pymysql连接时指定认证插件:ALTER USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypassword'; FLUSH PRIVILEGES;conn = pymysql.connect( host=db_endpoint, user=db_username, passwd=db_password, db=db_name, connect_timeout=5, cursorclass=pymysql.cursors.DictCursor, auth_plugin='mysql_native_password' )
5. 代码中数据库参数错误
虽然Workbench能连接,仍需确认代码中的参数是否完全匹配:
- 检查
db_password是否与Workbench使用的密码一致(注意大小写、特殊字符)。 - 确认
db_name='dev'是实际存在的数据库(Workbench连接时是否选择了dev库)。
内容的提问来源于stack exchange,提问作者jhorta
相关产品推荐
相关产品推荐

