AWS ECS中Nginx无法解析Service Connect DNS问题排查
核心问题分析
127.255.0.1是AWS Service Connect注入到容器的本地代理地址,Nginx解析到这个地址说明Service Connect的DNS生效了,但请求超时大概率是Nginx配置没适配Service Connect的代理逻辑,或是端口映射配置错误。
具体解决步骤
检查Nginx的proxy_pass配置
确保proxy_pass使用Service Connect定义的服务名和端口,比如Service B的Service Connect服务名是service-B、端口为8080,配置需写成:proxy_pass http://service-B:8080;必须保留服务名和对应端口,不能省略端口或直接用IP地址。
修正Nginx resolver配置
Service Connect的本地DNS地址是容器内的127.0.0.1,如果之前指定了外部resolver会导致解析异常。调整resolver配置为:resolver 127.0.0.1 valid=30s;也可以直接删除resolver配置,让Nginx使用容器默认的DNS解析规则。
核对Service Connect端口映射
确认Service B的Service Connect配置中,portMapping的containerPort和Service A请求的端口完全一致;同时检查Service A的任务角色是否拥有ecs-service-connect相关权限,确保能正常访问Service Connect代理服务。调整Nginx超时参数
若因代理转发超时导致失败,可增加Nginx的超时设置:proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s;避免默认超时时间过短引发请求失败。
验证Service Connect代理状态
进入Service A容器,执行curl http://127.255.0.1:<ServiceB的ServiceConnect端口>,如果能正常访问,说明代理本身无问题,问题出在Nginx的解析或转发配置;如果不通,检查两个服务是否在同一个Service Connect命名空间下,以及服务关联配置是否正确。
额外排查点
- 确认Nginx容器的网络模式为
awsvpc,Service Connect仅支持该网络模式的ECS服务。 - 检查安全组配置,确保Service A容器可访问127.255.0.1的代理端口(Service Connect默认会开放对应端口,若有自定义防火墙规则需放行)。
内容的提问来源于stack exchange,提问作者iqueqiorio

