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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:37:49