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

上次更新时间:2020 年 8 月 20 日

当我使用 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 存储桶的正确策略


这篇文章对您有帮助吗?


您是否需要账单或技术支持?