AWS ECS部署后pymysql无法解析MySQL服务域名错误求助
排查AWS ECS中MySQL域名解析失败问题
核心问题分析
错误Can't connect to MySQL server on 'master_mysql' ([Errno -2] Name does not resolve)说明应用容器无法将目标主机名解析为有效IP,本质是ECS网络环境与本地Docker Compose的DNS解析逻辑存在差异,再加上代码硬编码配置导致的适配问题。
具体排查与修复步骤
1. 修复代码硬编码,改用环境变量动态配置
你的代码直接硬编码了数据库主机名im_master_database:3306,但Docker Compose已定义DB_HOST等环境变量,代码应读取这些变量适配不同部署环境:
import os connection_string = "mysql+pymysql://{user}:{password}@{host}:{port}/{database}?charset=utf8mb4".format( user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), host=os.getenv('DB_HOST'), port=os.getenv('DB_PORT', '3306'), database=os.getenv('DB_NAME') )
后续在ECS中只需调整DB_HOST的环境变量值,无需修改代码。
2. 根据ECS部署模式调整DB_HOST值
- 同一ECS任务(Sidecar模式):若应用与MySQL容器属于同一个ECS任务定义,二者共享网络命名空间,直接将
DB_HOST设为localhost即可,无需依赖DNS解析。 - 独立ECS服务:若应用和MySQL是两个分开的ECS服务:
- 确保两个服务处于同一VPC、子网,且安全组允许应用容器访问MySQL的3306端口。
- 将
DB_HOST设为MySQL服务的服务发现DNS名称(需提前配置ECS服务发现),或MySQL服务的私有IP/负载均衡DNS名称。
3. 检查ECS任务定义的网络模式
- 优先使用
awsvpc网络模式(ECS官方推荐):同一任务内的容器共享网络栈,用localhost即可连通;不同任务的容器需通过VPC私有IP或服务发现DNS通信。 - 避免使用
bridge模式,其DNS解析逻辑与本地Docker差异极大,易引发解析失败。
4. 清理Docker Compose冗余配置
- 本地设置的
container_name: master_mysql在ECS中无效,ECS会自动分配容器名称,无需依赖该名称进行连接。 - Docker Compose中的
depends_on健康检查逻辑无法直接复用至ECS,需通过任务定义的启动顺序或自定义脚本实现依赖控制。
5. 验证DNS解析与网络连通性
若调整配置后仍有问题,可在应用容器内执行以下命令排查:
# 测试域名解析 nslookup <目标主机名> # 测试端口连通性 telnet <mysql-ip> 3306
若nslookup失败,说明ECS环境中该域名不存在,需重新确认DB_HOST的配置值。
内容的提问来源于stack exchange,提问作者Krishna Mouli Jala
相关产品推荐
相关产品推荐

