我的 Amazon Elastic Container Service (Amazon ECS) 任务停止了。如何解决造成 Amazon ECS 任务停止的问题?
简短描述
您的 Amazon ECS 任务可能会因多种原因而停止。最常见的原因包括:
- 基本容器已退出
- Elastic Load Balancing (ELB) 运行状况检查失败
- 容器运行状况检查失败
- 容器实例运行不正常
- 底层基础设施维护
- 已触发服务扩缩事件
- ResourceInitializationError
- CannotPullContainerError
- 任务被用户停止
了解已停止任务与停止原因之间的关联有助于减少故障排除所需的工作量。
解决方法
您可以使用 DescribeTasks API 查看已停止任务的详细信息。但是,已停止任务的详细信息只在返回的结果中显示一小时。要更长时间地查看已停止任务的详细信息,您可以使用此 AWS CloudFormation 模板存储任务停止时触发的 EventBridge 事件的 Amazon CloudWatch Logs。
停止的原因
任务中的基本容器已退出
所有任务都必须至少有一个基本容器。如果容器的基本参数标记为 true,并且该容器因任何原因失败或停止,则属于该任务的所有其他容器都会停止。要了解任务因此原因退出的原因,请使用 DescribeTasks API 标识退出代码并导航到本文的通用退出代码部分。
任务未通过 ELB 运行状况检查
当任务因 ELB 运行状况检查而失败时,请确认您的容器安全组允许源自 ELB 的流量。请考虑以下事项:
- 定义最小运行状况检查宽限期。这样,服务计划程序就会在任务实例化后,在预先定义的时间段内忽略 Elastic Load Balancing 运行状况检查。
- 默认情况下,一旦在目标组注册并通过初始运行状况检查,目标就会开始接收其全部请求。使用慢启动模式可让目标有时间在负载均衡器向其发送全部请求之前进行预热。
- 监控服务的 CPU 和内存指标。例如,CPU 较高可能会使应用程序无响应并导致 502 错误。
- 检查应用程序日志中的应用程序错误。
- 检查 ping 端口和运行状况检查路径是否配置正确。
- 从 Amazon Elastic Compute Cloud (Amazon EC2) 中卷曲运行状况检查路径并确认响应代码。
容器运行状况检查失败
可在 TaskDefinition API 或 Dockerfile 中定义运行状况检查。
您可以使用 DescribeTasks API 操作查看各个容器和任务的运行状况。
确保运行状况检查命令退出状态指示容器运行状况良好。使用任务定义中指定的日志驱动程序设置,检查容器日志中是否存在应用程序错误。以下是可能的值:
- 0:成功 – 容器运行状况良好,可供使用。
- 1:运行不正常 – 容器无法正常工作。
- 2:保留 – 不要使用此退出代码。
(实例 i-xx)(端口 x)运行不正常(原因为运行状况检查失败)
这表示容器状态不正常。要解决此问题,请执行以下操作:
- 验证附加到容器实例的安全组是否允许流量。
- 确认后端立即成功响应。
- 正确设置响应时间值。
- 有关更多信息,请查看负载均衡器的访问日志。
服务 ABCService:ECS 正在托管任务的底层基础设施上执行维护
这表示任务由于任务维护问题而停止。有关更多信息,请参阅 AWS Fargate 任务维护。
服务可确保遵循指定的调度策略,并在任务停止或失败时重新调度任务。如果容器实例是 Auto Scaling 组的一部分。必须启动新的容器实例并下达任务。有关更多信息,请参阅验证 Auto Scaling 组的扩缩活动。
已触发 ECS 服务扩缩事件
这是标准服务消息。Amazon ECS 利用 Application Auto Scaling 来提供此功能。ECS 服务可以自动增加或减少所需的任务数。请考虑执行以下操作:
ResourceInitializationError:无法提取秘钥或注册表身份验证:执行资源检索失败
要解决此错误,请参阅如何对 Amazon ECS 中的“无法提取密钥或注册表身份验证”错误进行故障排除?
CannotPullContainerError
此错误表示正在使用的任务执行角色没有与 Amazon ECS 进行通信的权限。要解决此问题,请执行以下操作:
- 验证任务执行角色是否具有所需的权限。Amazon ECS 提供了名为 AmazonECSTaskExecutionRolePolicy 的托管策略,其中包含适用于大多数使用案例的权限。
- 验证 ECR 服务终端节点是否可以访问 ecr.region.amazonaws.com 和 dkr.ecr.region.amazonaws.com
- 对于需要身份验证的私有映像,请确保使用正确的信息定义了 repositoryCredentials 和 credentialsParameter。有关更多信息,请参阅任务的私有注册表身份验证。
任务被用户停止
这表示任务收到了 StopTask 指令。通过在 CloudTrail 中查看 StopTask 以获取 userIdentity 信息,您可以确定调用的发起方。
常见退出代码
- 0 – 入口点、成功或 CMD 正在完成其执行,因此容器已停止。
- 1 – 指应用程序错误。有关更多信息,请查看应用程序日志。
- 137 – 当容器的任务被强制退出 (SIGKILL) 时发生:
未能在默认的 30 秒时间段内响应 SIGTERM,之后发送了 SIGKILL 值并强制停止容器。可以使用 ECS_CONTAINER_STOP_TIMEOUT 参数在 ECS 容器代理上配置默认的 30 秒时间段。
在内存不足 (OOM) 的情况下也可能出现这种情况。查看您的 CloudWatch 指标,以验证是否发生了 OOM。
- 139 – 当遇到分段错误时发生。应用程序很可能试图访问过不可用的内存区域,或者存在未设置或无效的环境变量。
- 255 – 当容器中的 ENTRYPOINT CMD 命令因错误而失败时发生。请查看您的 CloudWatch Logs 以进行确认。
常见错误消息
在您的集群中未找到任何容器实例
查看集群的容器实例部分。如果需要,您可以启动容器实例。
InvalidParameterException
确保 TaskDefinition 中定义的任何参数都存在,并且 ARN 正确无误。验证任务角色和任务执行角色是否具有足够的权限。
您已达到可以并行运行的任务数量的限制
有关限制的更多信息,请参阅 ECS Service Quotas。
有关所有其他配额提高请求,请在 AWS Support 控制台中创建案例,然后选择 Service limit increase(放宽服务限制)。