STOPPED(CannotPullContainerError:API错误(500)?

时间:2018-01-21 15:37:21

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

我在Amazon Fargate群集上运行任务时遇到此错误。有没有人见过这个呢?

7 个答案:

答案 0 :(得分:6)

Farget必须使用公共IP。 有关详细信息https://github.com/aws/amazon-ecs-agent/issues/1128

答案 1 :(得分:3)

转到文档以获取对此答案。

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 指定已启用 ...

  •   
  • 对于专用子网中的任务,在启动任务时为自动分配公用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 :(得分:1)

公共IP不是强制性的,缺少用于创建有效NAT网关的规范。在GitHub issue,Amazon技术人员会不断重复您“只是”需要私有IP + NAT的事实,但是事实并非如此。我为此进行了很多努力,但最终使它正常工作,而未在我的Fargate服务中使用公共IP。

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

  • 具有Internet网关的公共子网,允许双向互联网访问
  • 具有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. 底部的
      4. Routes标签,Edit routes
      5. Add route,目标:0.0.0.0/0,目标是先前创建的NAT网关和Save routes
      6. 仍然选择了路由表 ActionsSet Main Route Table(如果尚未选择)
    2. public 路由表
      1. 将其聚焦到VPC
      2. 回到列表中,选择路由表
      3. 底部的
      4. Routes标签,Edit routes
      5. Add route,目标:0.0.0.0/0,定位到先前创建的Internet网关和Save routes
      6. 底部的
      7. Subnet Associations标签,Edit subnet associations
      8. 选择 public 子网Save
  6. 将黄瓜放在眼睛上

您放置在 public 子网中的每个服务将具有双向互联网访问权限,并且您放置在 private中的每个服务< / strong>子网将仅具有传出互联网访问权限(是的, private 子网中具有公网IP的Fargate和EC2服务将具有互联网访问权限。)

答案 3 :(得分:0)

当容器无法从注册表中拉出容器时,会发生此错误。

  1. 检查是否正在为容器分配公共IP地址。当前,AWS容器注册表没有内部vpn终端节点。
  2. 检查您的容器是否可以连接到Internet(例如nat实例或类似实例)。
  3. 检查与容器关联的安全组是否允许出站流量。如果您使用terraform或类似格式创建SG,则可能会发现它默认没有出站规则。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

确保您的子网可以访问Internet。以我为例,fargate任务已部署到专用子网。虽然此子网配置了nat网关,但公共子网没有通往Internet网关的路由。