我在适用于 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 日志记录驱动程序
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择任务定义。
- 选择任务或服务使用的任务定义,然后选择任务定义名称。
- 在任务定义的容器定义部分,在容器名称列中选择容器的展开图标。
- 在日志配置子部分,检查日志驱动程序是否已设置为 awslogs。
**重要提示:**如果您的任务在没有 NAT 网关或 NAT 实例的私有子网中运行,则您必须使用 VPC 终端节点。
确认您有用于 Fargate 任务的 VPC 终端节点
- 打开 Amazon VPC 控制台。
- 在导航窗格中,选择终端节点。
- 检查服务名称字段中是否存在 com.amazonaws.region.logs。
如果终端节点不存在,请创建一个新的终端节点。
如果终端节点存在,则确认终端节点是否与 Fargate 任务正在运行的 VPC 相同。要在 VPC 控制台中执行此操作,请选择该终端节点,然后在终端节点的详细信息选项卡中查找 VPC ID。
如果 VPC 使用的终端节点与 Fargate 任务不同,请创建新的终端节点。
如果 VPC 使用的终端节点与 Fargate 任务相同,请检查与 VPC 关联的安全组的以下各项设置:
- 安全组的入口规则必须允许来自 Fargate 任务的端口 443 上的流量。
- 与 Fargate 任务关联的安全组必须具有出口规则才能将端口 443 上的流量发送到 VPC 终端节点。
现在,您的 Fargate 任务可以到达您创建的 CloudWatch 终端节点了。
相关信息
Amazon ECR 接口 VPC 终端节点 (AWS PrivateLink)