AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

Amazon ECR でエラー「CannotPullContainerError: API error」を解決する方法を教えてください。

所要時間2分
0

Amazon Elastic Container Registry (Amazon ECR) を使用してイメージをプルすると、次のエラーが表示されます。 「CannotPullContainerError: API error.」

簡単な説明

このエラーは、次のいずれかの問題が原因で発生する可能性があります。

  • 使用している起動タイプに 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 ECS タスクの開始に失敗するエラーをトラブルシューティングするには、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用します。その後、問題に該当するトラブルシューティングのステップを参照します。

解決策

重要:

  • ECS クラスターのリソースが配置されているのと同じ AWS リージョンで、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用してください。
  • ランブックを使用する際は、最近失敗したタスクの ID を使用する必要があります。失敗したタスクが Amazon ECS サービスの一部である場合は、サービス内で最後に失敗したタスクを使用してください。失敗したタスクは、オートメーション中に ECS:DescribeTasks で確認できる必要があります。デフォルトで、停止した ECS タスクは停止状態になってから 1 時間以内であれば確認できます。最近失敗したタスク ID を使用すると、オートメーション中にタスク状態のクリーンアップにより分析が中断するのを防ぐことができます。

ランブックを開始する方法については、「AWSSupport-TroubleshootECSTaskFailedToStart」を参照してください。オートメーションの出力に基づいて、次の手動のトラブルシューティングステップのいずれかを実行してください。

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

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

2.    タスクが EC2 起動タイプで、コンテナインスタンスが公開サブネットにある場合、インスタンスには公開 IP アドレスが必要です。

-または-

公開サブネットで Fargate 起動タイプを使用してタスクを実行している場合は、起動する際に [公開 IPの自動割り当て] で [有効] を選択します。これにより、タスクがアウトバウンドのネットワークにアクセスしてイメージをプルできるようになります。

3.    リクエストをインターネットにルーティングするように VPC の NAT ゲートウェイを設定します。
注: NAT ゲートウェイの代わりに AWS PrivateLink を使用できます。

4.    Amazon ECR 用の AWS PrivateLink を使用している場合は、Amazon ECR の VPC エンドポイントに関連付けられているセキュリティグループの設定を確認します。VPC CIDR、コンテナインスタンス、または Fargate タスクまたはサービスのセキュリティグループ内からの HTTPS (ポート 443) 経由のインバウンドトラフィックを許可する必要があります。

5.    インスタンスと Fargate タスクにアタッチされたセキュリティグループが、次のアウトバウンドアクセスを許可していることを確認します。 HTTPS でポート 443、DNS で(UDP および TCP) ポート 53、サブネットのネットワークアクセスコントロールリスト (ネットワーク ACL)。

Amazon ECR リポジトリポリシーにより、リポジトリイメージへのアクセスが制限されている

リポジトリへのアクセスに関する制限については、Amazon ECR リポジトリポリシーを確認します。次のリポジトリポリシーの例は、IAM ユーザーによるイメージのプッシュおよびプルを許可するものです。

{  "Version": "2012-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 VPC ゲートウェイエンドポイントポリシーにより Amazon S3 へのアクセスが拒否されている

ルートテーブルに Amazon S3 の Amazon VPC ゲートウェイエンドポイントへのルートがある場合、次のステップを実行してください。

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

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

関連情報

CannotPullContainer タスクエラー

2コメント
  1. インスタンスと Fargate タスクにアタッチされたセキュリティグループが、次のアウトバウンドアクセスを許可していることを確認します。 HTTPS でポート 443、DNS で(UDP および TCP) ポート 53、サブネットのネットワークアクセスコントロールリスト (ネットワーク ACL)。

上記に対して質問です。 前提として、NATGatewayは使用していません。VPCエンドポイント、またそのセキュリティグループは正しく設定しています。fargateタスクはprivateサブネットで構築します。 コンテナイメージはプライベートレポジトリ(ECR)から取得します。

fargateタスクのセキュリティグループアウトバウンドにVPCエンドポイントのセキュリティグループへのHTTPS でポート 443、DNS で(UDP および TCP) ポート 53を許可しました。 しかしタスクは起動しません。 アウトバウンドで、0.0.0.0/0へHTTPS でポート 443、DNS で(UDP および TCP) ポート 53を許可したところ、タスクは起動しました。 fargateタスクのセキュリティグループのアウトバウンドをVPCエンドポイントのセキュリティグループ、またはVPC CIDRに限定することは不可能なのでしょうか?

応答済み 1年前

コメントをお寄せいただき、ありがとうございます。確認させていただいた後で、必要に応じて情報センターを更新いたします。

profile pictureAWS
エキスパート
応答済み 1年前

関連するコンテンツ