ECS任务启动失败无日志 多次PENDING转STOPPED后才运行如何排查
AWS ECS 任务启动异常排查与配置方案
问题现象
- 服务部署在g4dn.xlarge实例,使用的Docker镜像大小约10GB
- 任务启动后3-4分钟直接从
PENDING状态切换为STOPPED,无业务日志输出 - 经过数次重试后任务可正常启动,状态直接从
PENDING转为RUNNING - 已尝试调整部分ECS Agent超时参数,但问题未解决
一、故障排查步骤
- 验证ECS Agent配置生效状态
登录异常实例,执行cat /etc/ecs/ecs.config确认写入的超时参数存在。当前配置仅做了参数追加,没有重启ECS Agent,配置不会加载,这是参数修改后不生效的最常见原因。确认配置存在后执行sudo systemctl restart ecs重启Agent,再执行curl -s http://localhost:51678/v1/metadata确认Agent正常运行。 - 查看ECS Agent debug日志
开启debug日志级别后,直接查看实例上的/var/log/ecs/ecs-agent.log,定位任务失败时间点的日志,搜索pull、timeout、stopped、error关键词,日志会明确记录失败原因:是镜像拉取超时、磁盘空间不足、ENI挂载失败还是Docker daemon响应超时。 - 检查实例基础资源与网络
- 执行
df -h确认磁盘剩余空间:10GB镜像拉取+分层解压需要至少2-3倍镜像大小的临时空间,也就是至少25GB空闲空间,根分区存储空间不足会直接中断拉取流程,且不会输出业务容器日志 - 执行
docker system df检查Docker存储占用,清理悬空镜像释放空间 - 验证镜像拉取网络连通性:如果走公网拉取确认实例公网连通性、NAT网关带宽无瓶颈;如果走VPC Endpoint拉取ECR镜像,确认安全组放通对应Endpoint的443端口,网络丢包或带宽不足会导致拉取停滞触发超时
- 执行
- 查看任务停止原因字段
在ECS控制台选中已停止的异常任务,进入详情页查看最下方的停止原因字段,该字段会直接返回ECS层面的失败原因,比如镜像拉取重试次数耗尽、资源不足等,不需要登录实例就能拿到核心报错信息。 - 匹配镜像拉取行为特征
配置了ECS_IMAGE_PULL_BEHAVIOR=prefer-cached的前提下,新启动的实例本地无任何镜像缓存,第一次启动需要全量拉取10GB镜像;多次重试后启动成功,本质是前几次失败的拉取已经把大部分镜像层缓存到了实例本地,最后一次拉取仅需拉取缺失的分层,耗时大幅降低所以能成功,这个特征和镜像拉取超时的故障表现完全一致。
二、全链路超时阈值配置方案
之前的配置遗漏了控制镜像拉取总时长的核心参数,导致调整其他参数后依然触发默认超时。正确的UserData配置如下,覆盖镜像拉取、容器创建、容器启动全流程的超时设置,配置写入后必须重启ECS Agent才会生效:
autoScalingGroup.addUserData(...[ `cat >> /etc/ecs/ecs.config << 'EOF'`, `ECS_CONTAINER_START_TIMEOUT=15m`, `ECS_CONTAINER_CREATE_TIMEOUT=15m`, `ECS_IMAGE_PULL_TIMEOUT=15m`, `ECS_IMAGE_PULL_INACTIVITY_TIMEOUT=10m`, `ECS_LOGLEVEL=debug`, `ECS_IMAGE_PULL_BEHAVIOR=prefer-cached`, `EOF`, // 重启ECS Agent加载新配置 `systemctl restart ecs`, `sleep 10` ])
关键参数说明
ECS_IMAGE_PULL_TIMEOUT:镜像拉取总流程超时时间,默认值仅为5分钟,是之前遗漏的核心参数,10GB镜像拉取+解压建议设置为15分钟ECS_IMAGE_PULL_INACTIVITY_TIMEOUT:镜像拉取过程中无数据传输的超时时间,默认1分钟,网络波动时很容易触发,建议设置为10分钟ECS_CONTAINER_START_TIMEOUT/ECS_CONTAINER_CREATE_TIMEOUT:容器创建、启动阶段的超时时间,和镜像拉取阶段独立,设置为15分钟即可覆盖大镜像的启动耗时
额外优化建议
- 镜像瘦身:10GB镜像体积过大,建议优化Dockerfile,把不常变动的系统依赖、模型文件等分层前置,减少每次部署需要拉取的分层大小,最好将镜像体积控制在2GB以内
- 预烘焙镜像:针对固定机型的Auto Scaling组,可以构建预安装了业务镜像的自定义AMI,实例启动后直接使用本地缓存镜像启动容器,从根源消除拉取耗时
- 内网拉取:配置ECR、S3的VPC Endpoint,走AWS内网拉取镜像,内网带宽可达10Gbps以上,10GB镜像拉取耗时可压缩到1分钟以内,避免公网/NAT带宽瓶颈
- 服务配置匹配:将ECS服务的健康检查宽限期调整为和超时时间一致,避免容器还在拉取镜像阶段就被健康检查判定失败终止任务
内容的提问来源于stack exchange,提问作者rishabhjainps
相关产品推荐
相关产品推荐

