如何排查 Fargate 的 Amazon ECS 任务卡在“待处理”状态的问题?

上次更新日期:2022 年 9 月 30 日

通过 AWS Fargate 运行的 Amazon Elastic Container Service (Amazon ECS) 任务卡在“待处理”状态。

解决方法

检查您的子网正在使用哪些通往互联网的路由

对于公有子网中的 Fargate 任务:

验证您的 Fargate 任务是否已分配公有 IP 地址和通往互联网网关的默认路由 (0.0.0.0/0)。为此,请于启动任务或新建服务时选中启用自动分配的公有 IPv4 地址复选框。有关更多信息,请参阅公有 IPv4 地址

注意:您不能为现有任务或服务选中启用自动分配公有 IPv4 地址复选框。

对于私有子网中的 Fargate 任务:

验证您的 Fargate 任务是否有通往 NAT 网关、AWS PrivateLink 或其他互联网连接来源的默认路由 (0.0.0.0/0)。

  • 如果您使用的是 NAT 网关,则将 NAT 网关放在公有子网中。有关详细信息,请参阅使用互联网网关和 NAT 网关的架构
  • 如果您使用的是 AWS PrivateLink,则确认您的 Fargate 架构允许为您的 Amazon Virtual Private Cloud (Amazon VPC) 端点使用安全组。

检查您的网络访问控制列表和安全组设置

验证您的网络访问控制列表 (网络 ACL) 和安全组是否不会阻止从子网对端口 443 的出站访问。有关更多信息,请参阅使用安全组控制流向资源的流量

注意:Fargate 任务必须对端口 443 具有出站访问权限,才能激活传出流量并到达 Amazon ECS 终端节点。

检查您的 VPC 端点

如果您使用的是 AWS PrivateLink,请确认您拥有所需的终端节点。

Fargate 平台版本 1.3.0 或更早版本所需的终端节点:

  • com.amazonaws.region.ecr.dkr
  • S3 网关终端节点

Fargate 平台版本 1.4.0 或更高版本所需的终端节点:

  • com.amazonaws.region.ecr.dkr
  • com.amazonaws.region.ecr.api
  • S3 网关端点

注意:如果您的任务定义使用 AWS Secrets Manager、SSM 参数或 Amazon CloudWatch Logs,则可能需要定义端点。有关更多信息,请参阅使用带有 VPC 端点的 AWS Secrets Manager使用带有接口 VPC 端点的 CloudWatch Logs

使用 PrivateLink 的过程中,请确认 VPC 端点的安全组允许 Fargate 基础设施使用这些安全组。

检查您的 AWS Identity and Access Management (IAM) 角色和权限

任务执行角色向 Amazon ECS 容器和 Fargate 代理授予代表您进行 AWS API 调用的权限。在以下情况下,Fargate 需要此角色:

  • 从 Amazon Elastic Container Registry (Amazon ECR) 中提取容器映像
  • 使用 awslogs 日志驱动程序
  • 使用私有注册表身份验证
  • 使用 Secrets Manager 密钥或 AWS Systems Manager Parameter Store 参数引用敏感数据

如果您的使用案例涉及前述任何方案,请确认您具有在任务执行角色中定义的正确权限。有关所需权限的完整列表,请参阅 Amazon ECS 任务执行 IAM 角色

检查提取图像时是否存在问题

如果收到关于 Fargate 任务的 cannotpullcontainer 的错误讯息,请在如何为 Fargate 上的 Amazon ECS 解决 "cannotpullcontainererror" 错误?中完成相关步骤

双堆栈模式下的 VPC

在 Fargate 的双堆栈模式下使用 VPC 时,您可以将 VPC 配置为互联网网关或仅出站互联网网关,用于分配 IPv6 地址以访问互联网的任务。有关更多信息,请参阅在双堆栈模式下使用 VPC

注意:要对问题进行故障排除,您还可以使用 Amazon ECS Exec 从任务或服务的容器实例中检索日志。

容器依赖项已定义

任务定义中定义的容器依赖项可能导致 Fargate 任务无限期处于 PENDING 状态。示例:如果 containerA 依赖于 containerB 的某个状态,则 containerA 应保持在 PENDING 状态,直到 containerB 达到该状态 但是,如果 containerB 从未达到所需状态,则任务将无限期地保持 PENDING 状态。 确保您具有适当的依赖项或评估依赖项。

有关更多信息,请参阅容器依赖关系


这篇文章对您有帮助吗?


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