STOPPED(CannotPullContainerError:API错误(500):获取htt)

Aus*_*n K 15 amazon-web-services amazon-ecs docker aws-fargate

我在Amazon Fargate集群上运行任务时遇到此错误.有没有人见过这个?提前致谢.

man*_*ish 6

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


Tim*_*ein 5

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

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
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以:

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

  • 对于专用子网中的任务,在启动任务时为自动分配公用IP指定禁用,并在VPC中配置NAT网关以将请求路由到Internet。

如果您遇到其他与ECS任务没有启动有关的问题,或者启动时表现出奇怪的行为,请查看ECS故障排除主题的完整列表。

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

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

{
  "Effect": "Allow",
  "Principal": {
    "Service": "ecs-tasks.amazonaws.com"
  },
  "Action": "sts:AssumeRole"
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参见任务执行角色上的特定页面。


eni*_*njo 5

公共 IP不是强制性的,缺乏创建工作 NAT 网关的规范。在GitHub 问题上,亚马逊技术人员不断重复您“只”需要私有 IP + NAT,但事实并非如此。我与这个自己奋斗了很多,但终于得到了它正常工作,而无需使用公共IP为我Fargate服务。

要让 Fargate 服务在没有公共 IP 的情况下访问互联网,您需要设置一个具有 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 subnet2次
    1. private 子网
      1. 将其附加到焦点 VPC。无论 CIDR 块,任何您喜欢的可用区
    2. public 子网
      1. 将其附加到焦点 VPC。无论 CIDR 块,任何您喜欢的可用区
  3. Internet GatewaysCreate internet gateway
    1. 随意命名
    2. 选择新创建的Internet Gateway, ActionsAttach to VPC并将其附加到焦点 VPC
  4. NAT GatewaysCreate NAT Gateway
    1. 重要:选择public子网
    2. Create New EIP 或者使用现有的,因为你有一个
    3. 等待网关成为 Available
  5. Route TablesCreate route table2次
    1. private 路由表
      1. 将其附加到焦点 VPC
      2. 返回列表,选择路由表
      3. Routes 底部的标签, Edit routes
      4. Add route, 目的地: 0.0.0.0/0, 目标是之前创建的 NAT 网关和Save routes
      5. 仍然选择了路由表,Actions并且Set 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子网中的每个服务都将具有双向Internet 访问权限,您放置在private子网中的每个服务都只能访问传出Internet(是的,private没有公共 IP的子网中的 Fargate 和 EC2 服务将具有 Internet 访问权限)。