Amazon Elastic Container Service (Amazon ECS) タスクで、Amazon Elastic Container Registry (Amazon ECR) からイメージをプルできなかったり、「CannotPullContainerError: API エラー」というメッセージが表示されたりします。
簡単な説明
CannotPullContainerError は、次の原因で発生する場合があります。
- インターネットへのルートがないプライベートサブネットを使用しているため、起動タイプが Amazon ECR エンドポイントにアクセスできない。
- Amazon ECR リポジトリポリシーにより、リポジトリイメージへのアクセスが制限されている。
- Amazon ECS のタスク実行またはインスタンスロールで、イメージをプルするための適切なアクセス許可が欠けている。
- リクエストされたイメージ URI が存在しない。
- ディスクにイメージを保存するための空き容量が不足している。
- プルレートクォータを超過した。
- タスクと Amazon ECR エンドポイントの間のネットワークパスが欠けている。
- Docker の認証情報が期限切れとなっている。
解決策
問題の原因を特定する
AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用して問題を判断します。ランブックは、Amazon ECS クラスターリソースが配置されているリージョンと同じ AWS リージョンで実行する必要があります。さらに、最後に失敗したタスクの ID を使用します。失敗したタスクが Amazon ECS サービスに属している場合は、そのサービス内で最後に失敗したタスクを使用します。失敗したタスクは、オートメーション中に ECS:DescribeTasks で確認できる必要があります。デフォルトでは、停止した ECS タスクは Stopped 状態になってから 1 時間表示されます。
オートメーションの出力に基づいて、次の手動トラブルシューティング手順のいずれかを実行します。
プライベートサブネットに NAT ゲートウェイへのルートを確保するか、PrivateLink を使用します。
プライベートサブネットを使用することで、Amazon Elastic Compute Cloud (Amazon EC2) または AWS Fargate 起動タイプでタスクを実行できます。どちらの起動タイプでも、プライベートサブネットのルートテーブルには NAT ゲートウェイへのルートが必要です。リクエストをインターネットにルーティングするために、VPC の NAT ゲートウェイを設定します。
または、Amazon ECR 仮想プライベートクラウド (VPC) のエンドポイントと Amazon Simple Storage Service (Amazon S3) ゲートウェイのエンドポイントで AWS PrivateLink を使用します。
VPC エンドポイントのセキュリティグループでは、プライベートサブネットまたは Amazon ECS タスク VPC からの受信接続をポート 443 で許可する必要があります。
注: Windows では、ECS_IMAGE_PULL_INACTIVITY_TIMEOUT の値はデフォルトで 3 分に設定されています。大きなイメージをプルする場合、イメージの取り込みが 3 分以内に完了せず、リクエストがタイムアウトする可能性があります。
Amazon ECR リポジトリポリシーを確認する
Amazon ECR リポジトリポリシーによりリポジトリイメージへのアクセスが制限されている場合、403 Forbidden エラーが発生します。Amazon ECR リポジトリポリシーを参照し、リポジトリイメージに制限がないことを確認します。アクセスポリシーの例については、「Amazon ECR でのプライベートリポジトリポリシー例」を参照してください。
タスク実行またはコンテナインスタンスの IAM ロールのアクセス許可を確認する
Amazon EC2 起動タイプを使用する場合は、コンテナインスタンスの AWS Identity and Access Management (IAM) ロールに Amazon ECR リポジトリへのアクセス許可があることを確認してください。AmazonEC2ContainerRegistryReadOnly ポリシーは、イメージをプルするために最低限必要なアクセス許可を付与します。
Fargate 起動タイプを使用する場合は、イメージを取得するためのタスク実行ロールに AmazonECSTaskExecutionRolePolicy がアタッチされていることを確認してください。
正しいイメージ URI を使用していることを確認する
タスク定義のコンテナ定義セクションにある イメージパラメータを参照し、URI に指定したイメージ名が適切であることを確認します。
注: タグ別にプルするには、イメージ名形式に registry/repository[:tag] を使用します。ダイジェスト別に取得するには、Amazon ECR リポジトリから直接コピーできる registry/repository[@digest] 形式を使用します。
ディスク容量を確認する
プルしたイメージを保存するための十分なディスク容量がない場合、「CanNotPullContainerError: デバイスに空き容量がありません」というエラーメッセージが表示されます。この問題を解決するには、「write /var/lib/docker/tmp/GetImageBlob111111111: デバイスに空き容量がありません」を参照してください。
プルレートのクォータを超えているかどうかを確認する
イメージをプルするのに Docker Hub を使用しており、イメージのプルクォータを超えた場合、「CannotPullContainerError: toomanyrequests: プルレートの制限に達しました」というエラーメッセージが表示されます。プルレートのクォータに関する詳細は、Docker Docs のウェブサイトで「プルレート制限」を参照してください。この問題の解決方法については、「ERROR: toomanyrequests: リクエストが多すぎるか、プルレート制限に達しました」を参照してください。
ネットワーク設定を確認する
タスクと Amazon ECR エンドポイントの間にネットワークパスがない場合、次の例のようなエラーが表示されます。
Cannotpullcontainererror: デーモンでエラー応答発生
または、
ヘッダーの待機中に Client.Timeout が超過しました
この問題を解決するには、タスクが NAT ゲートウェイまたは PrivateLink 経由で Amazon ECR リポジトリにアクセスできるかどうかを確認します。
Amazon ECS サービスの作成時に、[ネットワーク] で次の設定を行います。
- パブリックサブネット内のタスクでは、[パブリック IP] で [パブリック IP の自動割り当て] を有効にします。
- プライベートサブネットのタスクでは、[パブリック IP の自動割り当て] を無効に設定し、NAT ゲートウェイまたは PrivateLink を設定します。
Docker のログイン認証情報を更新する
Docker 認証情報が期限切れの場合、「リポジトリが存在しないか、'docker login' が必要な可能性があります」というエラーメッセージが表示されます。プライベートリポジトリの認証用に Docker ログイン認証情報を更新する方法については、「認証トークンを使用する」を参照してください。
関連情報
Amazon ECS でタスクエラー CannotPullContainer が発生する