如何解决 Amazon ECS 中的 Amazon ECR 错误“CannotPullContainerError: API error”?

上次更新时间:2020 年 5 月 15 日

当我使用 Amazon Elastic Container Registry(Amazon ECR)提取映像时,出现以下错误:“CannotPullContainerError: API error.” 如何在 Amazon Elastic Container Service (Amazon ECS)中解决此错误?

简短描述

您可能会由于以下某个问题收到此错误:

  • 您的启动类型无权访问 Amazon ECR 终端节点
  • 您的 Amazon ECR 存储库策略限制对存储库映像的访问
  • 您的 AWS Identity and Access Management (IAM) 角色不具有提取或推送映像的相应权限
  • 无法找到映像
  • Amazon Virtual Private Cloud (Amazon VPC) 网关终端节点策略拒绝 Amazon Simple Storage Service (Amazon S3) 访问

要提取映像,Amazon ECS 必须与 Amazon ECR 终端节点通信。

解决方法

您的启动类型无权访问 Amazon ECR 终端节点

1.    如果您使用 Amazon Elastic Compute Cloud (Amazon EC2) 启动类型运行任务并且您的容器实例位于私有子网中,或者您在私有子网中使用 AWS Fargate 启动类型运行任务,请确认您的子网在路由表中具有到 NAT 网关的路由。

2.    如果您要使用 EC2 启动类型运行任务,并且您的容器实例位于公有子网中,请确认该实例具有公有 IP 地址。

-或者-

如果您要在公有子网中使用 Fargate 启动类型运行任务,请在启动任务时为自动分配公有 IP选择已启用。这将允许您的任务拥有提取映像所需的出站网络访问权限。

3.    在 VPC 中配置 NAT 网关以将请求路由到互联网。

注意:您可以使用 AWS PrivateLink 作为 NAT 网关的替代方案。

4.    如果您要使用适用于 Amazon ECR 的 AWS PrivateLink,请确认与 Amazon ECR 的接口 VPC 终端节点关联的安全组允许来自 VPC CIDR、ECS 容器实例或 Fargate 任务或服务的安全组内的入站 HTTPS(端口 443)流量。

5.    确认附加到您的实例和 Fargate 任务的安全组允许以下内容的出站访问:端口 443 上的 HTTPS,端口 53 上的 DNS(UDP 和 TCP)以及子网的网络访问控制列表(网络 ACL)。

您的 Amazon ECR 存储库策略限制对存储库映像的访问

检查您的Amazon ECR 存储库策略,以了解访问存储库的限制。

以下存储库策略示例允许 IAM 用户推送和提取映像:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "AllowPushPull",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123456789012:user/push-pull-user-1",
          "arn:aws:iam::123456789012:user/push-pull-user-2"
        ]
      },
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "ecr:BatchCheckLayerAvailability",
        "ecr:PutImage",
        "ecr:InitiateLayerUpload",
        "ecr:UploadLayerPart",
        "ecr:CompleteLayerUpload"
      ]
    }
  ]
}

您的 IAM 角色不具有提取映像的相应权限

如果您要使用 Amazon EC2 启动类型运行任务,请确认与实例配置文件关联的实例 IAM 角色有权访问 Amazon ECR 存储库。

注意:AWS 托管策略 AmazonEC2ContainerRegistryReadOnly 提供提取映像所需的最低权限。

如果您要使用 Fargate 启动类型运行任务,请确认 AmazonECSTaskExecutionRolePolicy 具有所需的权限。

无法找到映像

要确认 URI 中的映像名称是否正确,请检查任务定义的容器定义部分中的映像参数

注意:要按标记提取,请使用以下映像名称格式:registry/repository[:tag]。要按摘要提取,请使用 registry/repository[@digest] 格式。

您的 Amazon VPC 网关终端节点策略拒绝 Amazon S3 访问

如果路由表中有通往 Amazon S3 的 Amazon VPC 网关终端节点的路由,请完成以下操作:

1.    验证 Amazon VPC 网关终端节点的访问策略

2.    请确认 Amazon VPC 网关终端节点具有访问 S3 存储桶的正确策略


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?