【问题标题】:AWS Fargate - CannotPullContainerError (500)?AWS Fargate - CannotPullContainerError (500)?
【发布时间】:2018-06-21 22:23:18
【问题描述】:

我正在使用 AWS ECS 来托管我的服务。当我尝试用 Fargate 定义任务时,我遇到了以下问题。

CannotPullContainerError: API 错误 (500): Get https://xxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/v2/: net/http: 请求在等待连接时取消(Client.Timeout 在等待标头时超出)

此外,我还授予了 IAM 用户访问 ECR 的完全权限。请帮我解决这个问题。

【问题讨论】:

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


【解决方案1】:

看看这里:https://github.com/aws/amazon-ecs-agent/issues/1128

特别是samuelkarp的评论

您在下面看到的错误通常是由于缺乏互联网 访问以提取图像。图像拉取发生在网络上 任务使用的接口,因此共享安全组和 路由规则。

请检查您的以下配置:

如果您在没有公共 IP 的情况下启动任务,请确保 子网上的路由表有“0.0.0.0/0”去一个 NAT 网关或 NAT 实例以确保访问 Internet。如果您的路由表有 一个互联网网关,它就像一个防火墙并阻止 从被建立的连接。如果您要与公众一起启动任务 IP,确保子网上的路由表有“0.0.0.0/0”去 到 Internet 网关,以确保您能够使用公共 IP 成功用于入口流量。验证您的安全组规则 任务允许出站访问。这里的默认值通常是 All 到 0.0.0.0/0 的流量。如果这些网络更改都不适用于 您或如果他们没有解决您的问题,请告诉我们,以便我们可以 进一步的帮助。

【讨论】:

  • 我想补充一点:还要注意不要不小心将您的容器放入无法访问互联网的私有子网中。
  • 为什么 AWS 在简化其服务的使用方面如此糟糕?
  • 我突然看到了这个;它在历史上一直有效,我认为我们的基础设施没有任何变化......
  • @kev 很多,因为它不仅仅是“易于使用”。简单性总是存在权衡,导致灵活性有限。 AWS 基本上是在租用你的基础设施,而它的管理是你的责任。不过,它们正在推出更易于使用的服务,例如带有 ECS 的 Fargate 启动类型(但价格比管理您自己的 EC2 基础设施要高)。
  • 我有时也会在正常工作的服务中看到此错误。我有自动公共 IP 和连接到 Fargate 的 NAT 网关。当错误确实出现时,它喜欢持续一段时间。
【解决方案2】:

我已经回答了这个here,但是复制粘贴并没有什么坏处。

缺少创建工作 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 访问权限)。

【讨论】:

  • 是否需要设置主路由表?
  • @AbhyuditJain 如果您按照手动步骤操作,那么可以。
猜你喜欢
  • 1970-01-01
  • 2021-07-04
  • 2021-04-11
  • 2023-03-10
  • 2021-04-16
  • 2019-05-14
  • 1970-01-01
  • 2020-12-26
  • 2020-02-11
相关资源
最近更新 更多