You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

配置ECS_CONTAINER_STOP_TIMEOUT为1h后,Amazon ECS Agent仍每2-3分钟停止应用

排查ECS_CONTAINER_STOP_TIMEOUT配置未生效的问题

我之前也碰到过类似的困扰,咱们一步步来拆解可能的原因和解决办法:

1. 确认配置的设置位置和单位是否正确

ECS_CONTAINER_STOP_TIMEOUT是ECS Agent容器的环境变量,不是你应用容器的配置,这点很容易搞混:

  • 如果是通过ECS任务定义设置,要在代理配置(Agent configuration)里添加这个环境变量,而不是应用容器的环境变量列表中。
  • 另外,这个配置的单位是,不是小时!如果你设置的是1而不是3600,那实际超时时间只有1秒,Agent会很快触发停止操作。
  • 验证方式:登录ECS实例,执行docker inspect ecs-agent,在输出的Env字段里确认ECS_CONTAINER_STOP_TIMEOUT=3600是否存在。

2. 检查ECS Agent版本是否支持该配置

这个超时配置是在ECS Agent版本1.22.0之后才引入的,如果你的Agent版本太老,这个参数会被直接忽略:

  • 查看Agent版本:执行docker logs ecs-agent | grep "Agent version"
  • 如果版本低于1.22.0,建议升级Agent(可以通过重启ECS实例或者手动更新Agent容器来完成)。

3. 确认任务停止的真实原因

有时候看起来是Agent提前停止容器,但实际是任务本身触发了终止:

  • 去ECS控制台查看对应任务的事件日志,或者用AWS CLI执行:
    aws ecs describe-tasks --cluster <你的集群名称> --tasks <任务ID>
    
  • 检查stoppedReason字段,看看是健康检查失败、资源超限、手动停止,还是服务部署策略触发了任务替换,这些情况都会让容器提前停止,和Agent的超时配置无关。

4. 验证容器是否正确处理SIGTERM信号

ECS Agent发送SIGTERM信号后,会等待配置的超时时间,之后才会发送SIGKILL强制终止。如果你的应用没有监听SIGTERM信号,可能收到信号后直接退出,看起来像是Agent提前动手:

  • 检查你的应用代码,确保它能捕获SIGTERM信号,并在收到后完成当前正在处理的任务再优雅退出。

内容的提问来源于stack exchange,提问作者Guilherme Spadaccia

火山引擎 最新活动