当我在 Amazon Elastic Container Service (Amazon ECS) 集群中部署新服务时,任务被错误部署或终止。
解决方法
确保您使用的容器具有足够的资源容量
如果新部署始终无法通过负载均衡器运行状况检查,请检查 Amazon ECS Container Insights 指标 CpuUtilized、CpuReserved 和 MemoryUtilized。如果您使用应用程序负载均衡器,也请检查 TargetResponseTime。
此外,请将 HealthCheckGracePeriodSeconds 属性的值配置为大于应用程序的启动时间。运行状况检查响应延迟可能会导致失败,并导致 Amazon ECS 循环执行任务。
检查容器状态和退出代码
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,确保您使用的是最新版本的 AWS CLI。
对于意外终止的任务,请运行以下 describe-tasks 命令来检查容器退出代码:
aws ecs describe-tasks --cluster ECS_CLUSTER --tasks TASK_ARN -- region REGION
**注意:**请将 ECS_CLUSTER 替换为您的集群名称,将 TASK_ARN 替换为任务 ARN,将 REGION 替换为您的 AWS 区域。
如果上述命令的输出为 0,则表示任务已成功启动。如果输出为 1,则表示存在应用程序错误,您必须检查应用程序日志。如果输出为 137,则表示容器收到了 SIGKILL 信号,这通常是由内存不足问题引起的。要解决此问题,请参阅如何解决 Amazon ECS 中的 OutOfMemory 错误?以及为什么我的 Amazon ECS 任务停止了?
查看任务定义配置
确保所有任务定义配置均有效,尤其是在修改或创建新的任务定义之后。要验证您的任务定义配置,请运行独立任务。
配置负载均衡器设置
根据您的需求,在负载均衡器中配置 deregistration_delay.timeout_seconds。对于长期存在的请求,请使用更高的值。对于 Amazon Elastic Compute Cloud (Amazon EC2) 竞价型实例,该值必须低于 120 秒。
要修改 deregistration_delay.timeout_seconds,请运行以下 modify-target-group-attributes 命令:
aws elbv2 modify-target-group-attributes --target-group-arn
EXAMPLE_ARN --attributes Key=deregistration_delay.timeout_seconds,Value=120
**注意:**请将 EXAMPLE_ARN 替换为您的负载均衡器 ARN,将 120 替换为注销延迟超时(以秒为单位)。
此外,请优化负载均衡器的运行状况检查设置。如果设置对于应用程序太过严格,负载均衡器可能会经常将目标标记为运行状况不佳。
配置应用程序的正常关闭时间
默认情况下,ECS_CONTAINER_STOP_TIMEOUT 设置为 30 秒。当您在新 Amazon ECS 部署中的先前任务的耗尽阶段访问应用程序时,您可能会收到 5xx 错误。如果您在访问应用程序时遇到问题,请根据应用程序的正常关闭需求增加 ECS_CONTAINER_STOP_TIMEOUT 的值。最佳做法是在部署更新后的值之前在测试环境中对其进行测试。
要更新该值,请在任务定义中添加与以下示例类似的代码:
{
"containerDefinitions": [
{
"name": "your-container",
"image": "your-image",
"stopTimeout": 120
}
]
}
**注意:**请将 120 替换为您的 ECS_CONTAINER_STOP_TIMEOUT 值。
要配置正常关闭,请在您的应用程序中添加 SIGTERM 处理程序。对于 AWS Fargate Spot,请设置配置以在 SIGTERM 处理程序操作期间调用 DeregisterTargets。这可确保 Amazon ECS 从负载均衡器的目标组中注销 FARGATE_SPOT 任务。
相关信息
优化 Amazon ECS 的负载均衡器连接耗尽参数