Terraform部署ECS任务拉取容器镜像失败排查求助
问题定位与排查步骤
1. 先确认镜像仓库的权限状态
- 本地执行
docker pull public.ecr.aws/j0m1s7l0/la-client-api:latest测试拉取。如果本地也返回DENIED: Not Authorized,说明该ECR仓库未设置为公共可见:- 登录AWS控制台,找到对应公共ECR仓库,检查
Repository visibility是否为Public; - 确认
latest标签的镜像确实存在于仓库中,避免标签不存在导致的拉取失败。
- 登录AWS控制台,找到对应公共ECR仓库,检查
- 注意:公共ECR仓库的地址格式是
public.ecr.aws/<alias>/<image-name>,别混淆成私有ECR的地址(通常是<account-id>.dkr.ecr.<region>.amazonaws.com)。
2. 排查网络配置(核心,换Docker Hub也失败说明大概率是网络问题)
2.1 NAT网关配置验证
- 检查Terraform中
aws_nat_gateway的subnet_id是否关联到ECS任务所在的私有子网; - 确认NAT网关已绑定弹性IP(
aws_eip资源正确关联); - 私有子网的路由表必须包含默认路由:
0.0.0.0/0 -> NAT网关ID,且该路由表已与私有子网关联(Terraform中aws_route_table_association资源配置正确)。
2.2 VPC DNS设置
- 确保VPC的
enable_dns_support和enable_dns_hostnames参数都设为true(Terraform中aws_vpc的这两个字段配置)。DNS解析失败会导致无法解析镜像仓库域名,出现dial tcp ... i/o timeout。
2.3 安全组与网络ACL
- ECS任务使用的安全组必须允许出站HTTPS(443端口)流量到0.0.0.0/0;
- 私有子网的网络ACL需配置:
- 出站规则允许443端口流量;
- 入站规则允许临时端口(1024-65535)的响应流量(网络ACL是无状态,需双向放行)。
3. ECS任务相关配置检查
- 任务定义的网络模式为
awsvpc时,任务会直接使用子网的网络配置,需确保子网、安全组关联正确; - 任务执行角色需附加
AmazonECSTaskExecutionRolePolicy托管策略(虽然公共镜像拉取不需要身份验证,但该角色负责镜像拉取的基础操作); - 核对任务定义中的镜像地址拼写,避免仓库ID、镜像名、标签错误。
4. 直接测试私有子网的网络连通性
在任务所在的私有子网中启动一台EC2实例,使用相同的安全组和子网配置,执行以下测试:
- 解析域名:
nslookup public.ecr.aws,确认能正常返回IP; - 测试HTTPS访问:
curl -v https://public.ecr.aws/v2/j0m1s7l0/la-client-api/manifests/latest,根据返回结果定位是网络问题还是镜像权限问题。
内容的提问来源于stack exchange,提问作者zakzak
相关产品推荐
相关产品推荐

