在使用Amazon ECS (Elastic Container Service)时,我们可能会遇到服务异常的情况。本文将通过一个实际案例,介绍如何及时发现ECS服务异常,以及如何解决这类问题。
案例背景
我们的ECS服务在2024年7月12日出现了异常。以下是事件的时间轴:
- 2024-07-11 03:25:06 UTC: 旧镜像(sha:43058863a4a6...)推送至ECR,标签为pro
- 2024-07-12 02:29:15 UTC: 新镜像(sha:d70787e91645...)推送至ECR,标签同样为pro
- 2024-07-12 03:25:15 UTC: 旧镜像因无标签被ECR生命周期策略清除
- 2024-07-12 10:00:10 UTC: 一个使用旧镜像的任务因"Essential container in task exited"而停止
- 之后: ECS不断尝试启动新任务,但因找不到旧镜像而失败
- 2024-07-15 02:27:10 UTC: 用户手动执行UpdateService,服务恢复
问题原因
这个问题的根源在于ECS最近推出的"Container image resolution"功能。该功能旨在确保ECS服务中所有任务使用相同的容器镜像。具体来说:
- ECS会将任务定义中指定的镜像名称和标签解析为具体的镜像摘要(digest)。
- 除非手动触发UpdateService并强制执行新部署,否则即使推送了新镜像,ECS仍会使用之前解析的镜像摘要来运行新任务。