【问题标题】:STOPPED (CannotPullContainerError: API error (500)?已停止(CannotPullContainerError:API 错误(500)?
【发布时间】:2018-06-30 07:29:13
【问题描述】:

在我的 Amazon Fargate 集群上运行任务时出现此错误。有没有人见过这种情况?

【问题讨论】:

  • 看起来你在你的 repo 中将http 错误输入为htt,很可能
  • 我也在解决这个问题...这不是错字@MrDuk,只是他们截断了 ECS 控制台中的日志
  • Austin,你找到解决办法了吗?我正在尝试解决同样的问题——所有 SG 都是正确的,路由到 NAT 实例是正确的,等等

标签: amazon-web-services docker amazon-ecs aws-fargate


【解决方案1】:

转到文档以获取此问题的答案。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_cannot_pull_image.html

由于您遇到500 错误,我会听取第一个错误描述“连接超时”的建议:

启动 Fargate 任务时,其弹性网络接口需要到 Internet 的路由来拉取容器映像。如果您在启动任务时收到类似以下的错误,那是因为不存在到 Internet 的路由:

CannotPullContainerError: API error (500): Get https://111122223333.dkr.ecr.us-east-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection

要解决此问题,您可以:

  • 对于公共子网中的任务,在启动任务时为 自动分配公共 IP 指定 ENABLED...

  • 对于私有子网中的任务,在启动任务时为 Auto-assign public IP 指定 DISABLED,并在您的 VPC 中配置 NAT 网关以将请求路由到互联网...

如果您遇到与 ECS 任务无法启动或启动时出现奇怪行为有关的任何其他问题,请查看ECS troubleshooting topics 的完整列表。

我遇到了类似的错误(404 而不是500),但是,即使详细状态列出了错误,任务仍显示它正在运行。

事实证明,ecs-tasks 无法承担与任务关联的角色(在这种情况下,与运行它的 EC2 实例的角色相同)。向角色添加以下信任关系声明解决了该问题:

{
  "Effect": "Allow",
  "Principal": {
    "Service": "ecs-tasks.amazonaws.com"
  },
  "Action": "sts:AssumeRole"
}

更多详情请查看Task Execution Roles上的具体页面。

【讨论】:

    【解决方案2】:

    公共 IP 不是强制性的,缺少创建工作 NAT 网关的规范。在GitHub issue Amazon 技术人员不断重复您“只是”需要私有 IP + NAT,但事实并非如此。我自己为此苦苦挣扎了很多,但最终在不为我的 Fargate 服务使用公共 IP 的情况下让它正常工作。

    要让 Fargate 服务在没有公共 IP 的情况下访问互联网,您需要设置一个具有 2 个子网的 VPC:

    • 带有互联网网关的公共子网允许双向互联网访问
    • 带有 NAT 网关的私有子网允许仅传出互联网访问

    您可以通过两种方式创建这样的 VPC:转到 Services > VPC > VPC Dashboard,点击 Launch VPC Wizard 并选择 "VPC with Public and Private Subnets";或手动:

    注意:以下所有步骤均在 Services > VPC

    中执行
    1. 转到Your VPCsCreate a VPC
    2. 转到SubnetsCreate subnet 2 次
      1. private 子网
        1. 将其附加到焦点所在的 VPC。任何 CIDR 块,任何您喜欢的可用区
      2. public 子网
        1. 将其附加到焦点所在的 VPC。任何 CIDR 块,任何您喜欢的可用区
    3. 转到Internet GatewaysCreate internet gateway
      1. 随意命名
      2. 选择新创建的Internet GatewayActionsAttach to VPC并将其附加到焦点所在的VPC
    4. 转到NAT GatewaysCreate NAT Gateway
      1. 重要提示:选择public子网
      2. Create New EIP 或使用现有的,因为你有一个
      3. 等待网关变成Available
    5. 转到Route TablesCreate route table 2 次
      1. private 路由表
        1. 将其附加到焦点所在的 VPC
        2. 返回列表,选择路由表
        3. Routes 底部标签,Edit routes
        4. Add route,目标:0.0.0.0/0,目标是先前创建的 NAT 网关和 Save routes
        5. 仍然有路由表选中ActionsSet Main Route Table(如果还没有)
      2. public 路由表
        1. 将其附加到焦点所在的 VPC
        2. 返回列表,选择路由表
        3. Routes 底部标签,Edit routes
        4. Add route,目标:0.0.0.0/0,目标是先前创建的 Internet 网关和 Save routes
        5. Subnet Associations 底部标签,Edit subnet associations
        6. 选择public子网Save
    6. 把黄瓜放在眼睛上。

    您放入 public 子网的每个服务都将具有 双向 互联网访问权限,并且您放入 private 子网的每个服务将具有仅传出 Internet 访问权限(是的,private 子网中没有公共 IP 的 Fargate 和 EC2 服务将具有 Internet 访问权限)。

    【讨论】:

      【解决方案3】:

      分配 公共 IP 对于 Fargate 是强制性的。 详情见https://github.com/aws/amazon-ecs-agent/issues/1128

      【讨论】:

      • 我相信 Fargate 启动类型不需要分配公共 IP。在this Doc page 的“任务网络注意事项”下,它显示“您可以配置 [Fargate 启动类型] 任务以接收公共 IP 地址”,暗示它是可选的。如果您想在 vpc 的私有子网中部署任务(使用“awsvpc”网络模式),这将是有意义的。
      【解决方案4】:

      当容器无法从注册表中拉取容器时会出现此错误。

      1. 检查您是否为容器分配了公共 IP 地址。目前,AWS 容器注册表没有 internal-in-vpn 端点。
      2. 检查您的容器是否可以连接到互联网(例如:nat 实例或类似的。
      3. 检查您与容器关联的安全组是否允许出站流量。如果您使用 terraform 或类似工具创建 SG,您可能会发现它默认没有出站规则。

      【讨论】:

        【解决方案5】:

        您必须为您的服务分配一个公共 IP,您可以在服务定义期间执行此操作,但据我所知,您无法从更新菜单更新您的服务。

        【讨论】:

          【解决方案6】:

          如果您在无法访问 Internet 的私有 VPC 中运行 ECS,请设置VPC endpoint for ECR and S3 first

          【讨论】:

            【解决方案7】:

            确保您的子网可以访问互联网。在我的例子中,fargate 任务被部署到一个私有子网。虽然此子网配置了 nat 网关,但公共子网没有到 Internet 网关的路由。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多