AWS ECS EC2实例未拉取运行任务定义容器问题求助
解决AWS ECS EC2任务Pending且未拉取镜像的问题
1. 验证ECS代理状态与配置
- 登录EC2实例,执行
systemctl status ecs检查ECS代理是否正常运行。若代理未启动,执行systemctl start ecs并设置开机自启systemctl enable ecs。 - 查看ECS代理配置文件
/etc/ecs/ecs.config,确认关键配置:ECS_CLUSTER=<你的集群名称>:必须与任务指定的集群完全一致ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE=true:确保任务执行角色能调用日志服务(若配置了日志)- 若用awsvpc模式,确认
ECS_AWSVPC_BLOCK_IMDS=false(避免实例元数据访问限制)
2. 检查实例与集群的关联状态
- 登录AWS控制台,进入ECS集群的「ECS实例」标签页,确认该t2.micro实例已成功注册到目标集群。若未注册:
- 执行
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ecsInstanceRole验证实例能否获取角色临时凭证,返回错误则检查IAM角色关联是否正确。 - 测试实例访问ECS服务端点:执行
curl https://ecs.<你的区域>.amazonaws.com,返回403为正常(无签名),超时则说明网络存在出站限制(即使安全组全开,可能是NACL或VPC端点问题)。
- 执行
3. 任务定义关键配置检查
- 确认容器镜像地址完全正确:
nginx:latest是公共镜像,需确保ecsTaskExecutionRole拥有ecr-public:GetDownloadUrlForLayer、ecr-public:BatchGetImage权限(即使附加FullAccess,也可直接添加ECR Public托管策略验证)。 - 调整任务资源分配:t2.micro实例仅有1vCPU和1GB内存,任务配置1vCPU+1GB内存会占满资源,导致调度失败。尝试改为0.5vCPU和512MB内存后重新部署。
- 确认网络模式匹配:awsvpc模式需要子网有可用IP,且ecsTaskExecutionRole需有
ec2:CreateNetworkInterface等权限(FullAccess已包含,可确认策略生效)。
4. 深入排查ECS相关日志
- 查看ECS代理日志:
tail -f /var/log/ecs/ecs-agent.log,这里会记录代理与ECS服务的通信、任务调度、镜像拉取细节,即使无nginx相关内容,也能找到任务未调度的原因(如资源不足、集群不匹配、权限错误)。 - 查看Docker守护进程日志:
journalctl -u docker,检查Docker是否有异常,对比手动拉取记录确认Docker本身正常。 - 查看系统日志:
journalctl -f,搜索ecs相关条目,排查实例启动时ECS代理的初始化问题。
5. 隐性网络问题排查
- 检查VPC网络ACL:即使安全组全开,若NACL限制了出站443端口(访问ECR、ECS服务),会导致实例无法拉取镜像或通信。确保NACL允许所有出站流量(0.0.0.0/0,端口443)。
- 验证实例DNS配置:执行
nslookup public.ecr.aws,若无法解析,说明DNS设置有问题,可手动设置DNS为VPC默认DNS(通常是VPC网段+2)。
内容的提问来源于stack exchange,提问作者nullUser
相关产品推荐
相关产品推荐

