AWS ECS容器任务卡在Provisioning状态的排查与重启建议
问题背景
通过Terraform管理AWS ECS(EC2实例模式)部署应用,此前运行正常。近期后端代码修改引入超时bug导致服务崩溃,ECS服务事件显示旧任务已停止并启动新任务,但新任务始终卡在Provisioning状态无法推进。相同版本与配置的其他环境可正常重启,Prod环境问题持续。
服务事件日志
service backend instance i-000a000b0b0000c port 8000 is unhealthy in target-group backend-prod-backend L due to (reason Request timed out)
service backend has stopped 1 running tasks: task a000000f000f00000000ffef00a0f0af.
service backend deregistered 1 targets in target-group backend-prod-backend
(service backend, taskSet ecs-svc/0000000000000000000) has begun draining connections on 1 tasks.
service backend deregistered 1 targets in target-group backend-prod-backend
service backend has started 1 tasks: task a111111f111f111231241ffef00a0f0af.
已尝试操作
- 重启EC2实例
- 删除并重建整个ECS集群后重新执行Terraform,问题未解决
排查方法
1. 检查EC2实例资源状态
- 登录EC2实例,通过
top/htop或AWS CloudWatch指标查看CPU、内存、磁盘使用率是否过载 - 对比任务定义中的
cpu和memory配置,确认实例有足够剩余资源分配给新任务
2. 验证任务定义与容器配置
- 检查任务定义中的镜像地址是否正确,确认ECS实例有权限访问镜像仓库(如ECR的IAM权限配置)
- 核对容器启动命令、环境变量(如数据库连接、配置路径)与正常环境是否一致
- 查看容器启动日志:执行
aws ecs logs get-log-events --cluster <集群名> --task <卡住的任务ID> --container <容器名>,排查启动阶段是否有报错
3. 检查ECS Agent状态
- 在EC2实例上执行
sudo systemctl status ecs确认Agent是否正常运行,异常则重启:sudo systemctl restart ecs - 查看Agent日志:
tail -f /var/log/ecs/ecs-agent.log,排查任务调度相关错误(如资源不足、注册失败)
4. Terraform配置差异排查
- 用
terraform state show对比Prod环境与正常环境的资源配置(ECS服务、任务定义、安全组等),找出潜在差异 - 检查Terraform apply过程是否有报错,确认所有资源已正确创建
有效重启方案
1. 强制触发新部署
- 手动停止卡住的任务:
aws ecs stop-task --cluster <集群名> --task <卡住的任务ID> - 强制服务重新部署:
aws ecs update-service --cluster <集群名> --service <服务名> --force-new-deployment
2. 调整服务部署参数
- 临时修改服务的健康阈值,避免资源竞争:
问题解决后再恢复原有配置aws ecs update-service --cluster <集群名> --service <服务名> --minimum-healthy-percent 0 --maximum-percent 100
3. 清理残留资源
- 手动清理集群中残留的僵尸任务或终止中的任务
- 检查目标组,手动注销未正确移除的旧目标后再尝试部署
内容的提问来源于stack exchange,提问作者CurlyError

