AWS Fargate - CannotPullContainerError (500)?

Posted

技术标签:

【中文标题】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 的完全权限。请帮我解决这个问题。

【问题讨论】:

STOPPED (CannotPullContainerError: API error (500): Get htt)的可能重复 【参考方案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

中执行
    转到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 访问权限)。

【讨论】:

是否需要设置主路由表? @AbhyuditJain 如果您按照手动步骤操作,那么可以。

以上是关于AWS Fargate - CannotPullContainerError (500)?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Fargate 启动时间

AWS ECS Fargate - 任务未运行

如何将 AWS-Fargate 用作 Python 脚本

AWS ECS Fargate 和端口映射

AWS Fargate 容器中的持久性

AWS Fargate - CannotPullContainerError (500)?