无法从EC2实例连接到RDS,配置安全组规则后仍失败求助
排查步骤
第一步:先验证网络层连通性
在EC2实例上执行以下命令测试端口连通性:nc -zv rdsdb.abcdefg.us-east-1.rds.amazonaws.com 3306
如果返回连接失败,属于网络层面问题,按以下方向排查:
- 确认RDS实例的公网访问属性:如果RDS未开启公网访问,仅允许同VPC内资源访问。若EC2与RDS不在同一VPC,即使配置了安全组规则也无法连通。
- 核对RDS安全组入站规则:确认源地址为EC2私有IP+
/32后缀,协议为TCP、端口为3306,规则状态为生效。 - 确认EC2网络能力:如果RDS开启了公网访问,需确认EC2具备公网访问能力(绑定了弹性公网IP/所在子网有NAT网关),否则RDS域名解析到公网地址后EC2无法访问。你配置的EC2安全组3306出站规则是合理的,无需修改。
- 检查VPC DNS配置:确认EC2所在VPC开启了DNS解析与DNS主机名选项,避免RDS域名解析错误。
第二步:网络连通正常时排查上层配置
如果上述端口测试返回连通成功,属于应用/权限层面问题,按以下方向排查:
- 核对RDS账号访问权限:本地登录RDS后执行
SELECT host, user FROM mysql.user WHERE user='root';,确认root账号允许访问的主机列表包含EC2的IP,或配置了%通配规则。 - 核对EC2 Python依赖版本:执行
pip list | grep -E "PyMySQL|SQLAlchemy",确认EC2上安装的PyMySQL、SQLAlchemy版本和本地运行正常的版本一致,避免版本兼容问题。 - 用原生pymysql测试连接:可以直接运行以下简化脚本排查sqlalchemy配置问题:
import pymysql try: conn = pymysql.connect( host='rdsdb.abcdefg.us-east-1.rds.amazonaws.com', port=3306, user='root', password='password', database='database' ) print("连接成功") conn.close() except Exception as e: print(f"连接报错:{e}")
根据返回的具体报错信息即可定位最终问题,比如报access denied就是账号权限问题,报未知数据库就是库名填写错误。
内容的提问来源于stack exchange,提问作者stubbsy
相关产品推荐
相关产品推荐

