如何解决适用于 Fargate 的 Amazon ECS 中的“dockertimeouterror unable transition start timeout after wait 3m0s”错误?

上次更新日期:2020 年 12 月 17 日

我在适用于 AWS Fargate 的 Amazon Elastic Container Service (Amazon ECS) 中执行任务时收到“dockertimeouterror unable transition start timeout after wait 3m0s”错误。

简短描述

当 Fargate 任务存在网络配置问题时,就会出现此错误。对于 Fargate,默认的启动超时值为 3 分钟。如果任务在 3 分钟内未从待处理状态切换至运行状态,则该任务将失败并切换为已停止状态。

如果您的 Fargate 任务在没有配置 NAT 实例或网关的私有子网中运行,则必须设置正确的 Amazon Virtual Private Cloud (Amazon VPC) 终端节点。其中涉及以下各项服务的 VPC 终端节点:

  • Amazon Elastic Container Registry (Amazon ECR):从 ECR 存储库中提取映像时,必须为该服务设置终端节点。
  • Amazon Simple Storage Service (Amazon S3):因为 Amazon ECR 需要使用 Amazon S3 来存储映像层,因此必须为该服务设置终端节点。当容器从 Amazon ECR 下载映像时,容器必须访问 Amazon ECR 来获取映像清单,然后 Amazon S3 才能下载实际映像层。
  • AWS Secrets Manager 和/或 AWS Systems Manager如果您在任务定义中引用 Secrets Manager 密钥或 Systems Manager Parameter Store 参数以将敏感数据注入容器,必须为这两项服务设置终端节点。您必须为 Secrets Manager 或 Systems Manager 创建接口 VPC 终端节点,以便这些任务能够访问这些服务。您必须仅从托管敏感数据的特定服务(Secrets Manager 或 System Manager)创建终端节点。
  • Amazon CloudWatch:当 Fargate 任务使用 awslogs 作为日志记录驱动程序时,必须为该服务设置终端节点。这是因为使用 awslogs 作为日志记录驱动程序的任务会将其日志导出到 CloudWatch。如果您使用 awslogs 并且已为 CloudWatch 创建 VPC 终端节点但未设置,则您的任务将无法到达终端节点。您会收到以下错误:“DockerTimeoutError: Could not transition to started; timed out after waiting 3m0s.”。

解决方法

检查您的任务定义是否使用 awslogs 日志记录驱动程序

  1. 打开 Amazon ECS 控制台
  2. 在导航窗格中,选择任务定义
  3. 选择任务或服务使用的任务定义,然后选择任务定义名称。
  4. 在任务定义的容器定义部分,在容器名称列中选择容器的展开图标。
  5. 日志配置子部分,检查日志驱动程序是否已设置为 awslogs

重要提示:如果您的任务在没有 NAT 网关或 NAT 实例的私有子网中运行,则您必须使用 VPC 终端节点。

确认您有用于 Fargate 任务的 VPC 终端节点

  1. 打开 Amazon VPC 控制台
  2. 在导航窗格中,选择终端节点
  3. 检查服务名称字段中是否存在 com.amazonaws.region.logs

如果终端节点不存在,请创建一个新的终端节点

如果终端节点存在,则确认终端节点是否与 Fargate 任务正在运行的 VPC 相同。要在 VPC 控制台中执行此操作,请选择该终端节点,然后在终端节点的详细信息选项卡中查找 VPC ID

如果 VPC 使用的终端节点与 Fargate 任务不同,请创建新的终端节点

如果 VPC 使用的终端节点与 Fargate 任务相同,请检查与 VPC 关联的安全组的以下各项设置:

  • 安全组的入口规则必须允许来自 Fargate 任务的端口 443 上的流量。
  • 与 Fargate 任务关联的安全组必须具有出口规则才能将端口 443 上的流量发送到 VPC 终端节点。

现在,您的 Fargate 任务可以到达您创建的 CloudWatch 终端节点了。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?