16

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

4

7 回答 7

6

转到文档以获取此问题的答案。

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 ...

  • 对于私有子网中的任务,在启动任务时将自动分配公共 IP指定为DISABLED,并在您的 VPC 中配置 NAT 网关以将请求路由到互联网...

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

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

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

{
  "Effect": "Allow",
  "Principal": {
    "Service": "ecs-tasks.amazonaws.com"
  },
  "Action": "sts:AssumeRole"
}

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

于 2018-11-15T15:39:53.247 回答
5

Fargate 必须分配公共 IP。有关详细信息,请参阅https://github.com/aws/amazon-ecs-agent/issues/1128

于 2018-05-09T10:22:12.693 回答
5

公共 IP不是强制性的,缺少创建工作 NAT 网关的规范。在GitHub 问题上,亚马逊技术人员不断重复您“只是”需要私有 IP + NAT,但事实并非如此。我自己为此苦苦挣扎,但最终在不为我的 Fargate 服务使用公共 IP 的情况下让它正常工作

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

  • 带有允许双向Internet 访问的 Internet 网关的公共子网
  • 带有 NAT 网关的私有子网,仅允许传出Internet 访问

您可以通过 2 种方式创建这样的 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,并将其附加到焦点所在的 VPCActionsAttach to 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子网中的每项服务都将仅具有传出privateInternet 访问权限(是的,没有公共 IP的子网中的 Fargate 和 EC2 服务将具有 Internet 访问权限)。

于 2019-12-06T10:42:32.990 回答
2

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

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

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

于 2019-09-11T13:38:32.780 回答
0

如果您在无法访问 Internet 的私有 VPC 中运行 ECS,请先为 ECR 和 S3设置VPC 终端节点。

于 2019-04-25T16:16:08.377 回答
0

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

于 2018-11-05T11:34:19.677 回答