如何诊断 ECS Fargate 任务启动失败?
Posted
技术标签:
【中文标题】如何诊断 ECS Fargate 任务启动失败?【英文标题】:How to diagnose ECS Fargate task failing to start? 【发布时间】:2019-10-07 07:16:49 【问题描述】:我正在尝试使用他们的 ECS 服务在 AWS 上启动/运行 Dockerfile。我可以很好地在本地运行我的 docker 映像,但它在 Fargate 启动类型上失败。我已将 Docker 映像上传到 ECR,并从中创建了一个集群/服务/任务。
但是,我的集群的任务状态只是读取“DEPROVISIONING(任务无法启动)”,但它没有提供运行映像输出的日志或详细信息,所以我不知道出了什么问题。如何找到更多信息并诊断 ECS 无法运行我的映像的原因?
【问题讨论】:
我正在使用 Fargate,但我的知识有限,因为部署管道是为我构建的。我们有容器/dev/stdout
去 CloudWatch 日志记录 - 你也可以这样吗?
根据我的经验,故障排除是使用 Fargate 启动映像时最困难的任务之一。我总是不得不通过检查网络设置和图像配置来进行测试。您可以在任务定义中配置 CloudWatch 并查看那里的日志。对我来说,CloudWatch 仅在容器至少启动一次后创建日志,您仍然可以尝试一下。
【参考方案1】:
请转到集群 > 任务 > 详细信息 > 容器
您可以在图中“错误消息”中的红色矩形周围看到一些错误消息。
任务详情:
错误信息:
【讨论】:
是的,我知道如何找到任务状态。那是我找到文本“DEPROVISIONING(任务无法启动)”的地方。不幸的是,这不是一个有用的错误消息。我需要知道为什么它无法启动。【参考方案2】:我可能会迟到,但您可以查看容器日志而不是任务。
转到失败的任务 -> 详细信息 -> 容器(在底部)并打开它。在详细信息下方,您会看到Status reason
。
打开容器详情
获取失败原因
注意:如果您的任务运行多个容器,请按照上面的屏幕截图检查每个容器的“状态原因”,因为它们之间可能不同。
【讨论】:
看来这一天可能会被挽救。谢谢。【参考方案3】:正如 Abhinav 所说,该消息不是很具有描述性(并且使用 CLI aws ecs describe-tasks
不会添加更多内容)。唯一的可能是登录主机 EC2 实例并读取那里的日志,或者将这些日志发送到 CloudWatch https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_cloudwatch_logs.html#cwlogs_user_data
最可能的原因(在 ECS 中)是集群没有足够的资源来启动新任务。您有时可以从 Metrics 选项卡中找出原因,或者从 2019 年中期开始(我猜取决于您所在的地区),您可以从 ECS 帐户设置中启用“CloudWatch Container Insights”,以获取有关内存和 CPU 预留的更多详细信息。
【讨论】:
【参考方案4】:您可以在服务仪表板的“事件”选项卡下获取有关任务失败的一些信息。虽然那里的信息描述性不是很强,但它们可以让您大致了解问题究竟出在哪里。
【讨论】:
日志对我来说完全是空的 :( 我让它达到稳定状态,但仍然失败,退出代码为 7(我找不到任何信息)。【参考方案5】:这些方法都不适合我。 行之有效的方法是只将其中一项服务设为必不可少(只有您确定可以使用的一项),然后查看 Cloudwatch 日志,最终甚至查看 EC2 实例中的 ECS 日志。
# ecs-params.yml
version: 1
task_definition:
services:
myservice1:
essential: true
myservice2:
essential: false
myservice3:
essential: false
myservice4:
essential: false
myservice5:
essential: false
ECS的黑匣子毕竟不是很友好。
【讨论】:
【参考方案6】:转到 ECS -> 集群 -> 服务(选择您的服务名称)-> 事件
然后点击其中一个启动失败的任务(事件列表中的长UUID):像这样:
确保选择一个已经失败的任务,以便您了解它失败的原因——不要选择 ECS 服务仍在尝试启动且尚未失败的任务之一(请记住ECS 将继续尝试启动任务,直到超时时间结束)。因此,失败的任务将如下面的屏幕截图所示,您应该看到它无法启动的原因。例如,在我的情况下,此任务无法启动,因为它没有正确的 IAM 角色:
有了这些详细信息,您就可以进行修复(在我的例子中,我只需要更新我的 ECS 任务角色以包含一堆 secretsmanager 访问权限和 kms:Decrypt)。
【讨论】:
以上是关于如何诊断 ECS Fargate 任务启动失败?的主要内容,如果未能解决你的问题,请参考以下文章
如何从运行 Fargate ECS 任务中查看 Python 打印语句?