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 Simple Storage Service (Amazon S3) アクセス許可が、Amazon Virtual Private Cloud (Amazon VPC) ゲートウェイエンドポイントポリシーによって拒否されている

イメージをプルするには、Amazon ECS が Amazon ECR エンドポイントと通信する必要があります。

解決方法

発生している問題の種類に基づいて解決方法を選択します。

起動タイプに Amazon ECR エンドポイントへのアクセス権がない

1.    Amazon Elastic Compute Cloud (Amazon EC2) 起動タイプを使用し、タスクを実行していて、コンテナインスタンスがプライベートサブネットにあるか、プライベートサブネットで AWS Fargate 起動タイプを使用してタスクを実行している場合は、そのサブネットにルートテーブルの NAT ゲートウェイへのルートがあることを確認してください。

2.    EC2 起動タイプを使用し、タスクを実行していて、コンテナインスタンスがパブリックサブネットにある場合は、インスタンスにパブリック IP アドレスが割り当てられていることを確認してください。

- または -

パブリックサブネットで Fargate 起動タイプを使用してタスクを実行している場合は、タスクを起動する際、自動割り当てパブリック IP に [ENABLED] を選択します。これにより、イメージを取得するためのアウトバウンドネットワークアクセスをタスクに付与できます。

3.    インターネットにリクエストをルーティングするように VPC の NAT ゲートウェイを設定します。

注意: NAT ゲートウェイの代わりに AWS PrivateLink を使用できます。

4.    AWS PrivateLink for Amazon ECR を使用している場合は、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 ロールにイメージを取得するための適切なアクセス許可がない

EC2 起動タイプを使用してタスクを実行している場合は、インスタンスプロファイルに関連付けられているインスタンス IAM ロールに Amazon ECR リポジトリへのアクセス許可があることを確認してください。

注意:AWS 管理ポリシー AmazonEC2ContainerRegistryReadOnly は、イメージを取得するために必要な最小限のアクセス許可を提供します。

Fargate 起動タイプを使用してタスクを実行している場合は、AmazonECSTaskExecutionRolePolicy に必要なアクセス許可があることを確認してください。

イメージが見つからない

URI で正しいイメージ名を確認するには、タスク定義のコンテナ定義セクションにあるイメージパラメータを確認してください。

注: タグでプルするには、次のイメージ名フォーマットを使用してください。registry/repository[:tag]ダイジェストでプルするには、registry/repository[@digest] 形式を使用します。

Amazon S3 アクセスが Amazon VPC ゲートウェイエンドポイントポリシーによって拒否されている

ルートテーブルに Amazon S3 の Amazon VPC ゲートウェイエンドポイントへのルートがある場合は、以下の手順を実行します。

1.    Amazon VPC ゲートウェイエンドポイントのアクセスポリシーを確認します。

2.    Amazon VPC ゲートウェイエンドポイントに S3 バケットへアクセスするための正しいポリシーがあることを確認してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?