已停止(CannotPullContainerError:API 错误(500)?

Posted

技术标签:

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

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

【问题讨论】:

看起来你在你的 repo 中将http 错误输入为htt,很可能 github.com/aws/amazon-ecs-agent/issues/1128 这个可能有帮助 我也在解决这个问题...这不是错字@MrDuk,只是他们截断了 ECS 控制台中的日志 Austin,你找到解决办法了吗?我正在尝试解决同样的问题——所有 SG 都是正确的,路由到 NAT 实例是正确的,等等 相关:AWS Fargate - CannotPullContainerError (500)? 【参考方案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

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

您放入 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】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于已停止(CannotPullContainerError:API 错误(500)?的主要内容,如果未能解决你的问题,请参考以下文章

显示器驱动程序已停止响应 并且已成功恢复 这是啥原因

为什么TwinCAT3老是已停止工作

C++ “**.exe已停止工作”是啥原因?

clover已停止工作怎么处理

WINDOWS 服务主进程已停止工作?

CDR已停止工作,怎么破?