Amazon ECS で EC2 タスクを起動すると発生する、CannotPullContainerError エラーを解決する方法を教えてください。
Amazon Elastic Container Service (Amazon ECS) で Amazon Elastic Compute Cloud (Amazon EC2) タスクを起動すると、"CannotPullContainerError" というエラーが発生します。
簡単な説明
CannotPullContainerError は、次の理由で発生します。
- ネットワークの設定が誤っているため、Amazon EC2 起動タイプのタスクがイメージをプルできない。
- AWS Identity and Access Management (IAM) ロールに、イメージをプルするためのアクセス許可が欠けている。
- DockerHub のレートクォータに達している。
- イメージの名前またはタグが存在しない。
- タスク定義が、別の AWS アカウントにあるイメージを参照している。
- ファイルシステムの空き容量が不足している。
解決策
AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用してトラブルシューティングする
起動できない Amazon ECS タスクをトラブルシューティングするには、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用します。ランブックの実行時には、最後に失敗したタスク ID を指定する必要があります。失敗したタスクが Amazon ECS サービスに属している場合は、サービス内で最後に失敗したタスクを指定します。失敗したタスクは、オートメーション中に ECS:DescribeTasks で確認できる必要があります。デフォルトでは、Amazon ECS タスクは Stopped 状態になってから 1 時間表示されます。
ランブックの開始方法については、AWSSupport-TroubleshootECSTaskFailedToStart を参照してください。オートメーションの出力に基づいて、次のいずれかの解決策を実施します。
重要: Amazon ECS クラスターのリソースが配置されたリージョンと同じ AWS リージョンで、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用します。
Amazon ECS コンテナインスタンスのネットワーク設定が誤っている
Amazon ECS コンテナインスタンスがインターネットに接続されていない場合、そのインスタンスは Amazon Elastic Container Registry (Amazon ECR) エンドポイントに到達できません。エンドポイントに接続できない場合は、インスタンスはイメージをプルできません。Amazon ECS コンテナインスタンスがインターネットにアクセスできることを確認するには、次のアクションを実行します。
- インスタンスがインターネットゲートウェイまたは NAT ゲートウェイ経由でインターネットにアクセスできることを確認します。NAT ゲートウェイ接続の問題をトラブルシューティングするには、「プライベートサブネット内の EC2 インスタンスが、NAT を使用してインターネットに接続できない原因を教えてください。」を参照してください。
注: NAT ゲートウェイの代わりに、AWS PrivateLink を使用できます。エラーを避けるには、PrivateLink を適切に設定する必要があります。 - インスタンス、セキュリティグループ、ネットワークアクセスコントロールリスト (ネットワーク ACL) レベルで、ポート 443 経由のインバウンド HTTPS アクセスを許可していることを確認します。インターネットゲートウェイの接続に関する問題のトラブルシューティング方法については、「Amazon EC2 インスタンスがインターネットゲートウェイ経由でインターネットにアクセスできない理由を知りたいです」を参照してください。
- 仮想プライベートクラウド (VPC) エンドポイントを使用して Amazon ECR エンドポイントに接続する場合は、Amazon ECS コンテナインスタンスのセキュリティグループを確認します。Amazon ECS コンテナインスタンスが VPC エンドポイントのセキュリティグループにトラフィックを送信できるようにします。
- CannotPullContainerError: API エラーが発生した場合は、「Amazon ECS タスクが Amazon ECR からイメージをプルできない場合の解決方法を教えてください」を参照してください。
IAM ロールにイメージをプルするためのアクセス許可が欠けている
インスタンスプロファイルに関連付けられているインスタンス IAM ロールに、Amazon ECR リポジトリへのアクセス許可があることを確認します。
注: AWS マネージドポリシー AmazonEC2ContainerRegistryReadOnly では、イメージをプルするための最小限必要なアクセス許可が付与されます。
DockerHub のプルレートクォータに達した
DockerHub からイメージをプルする際に、プルレートのクォータに達している場合は、次のエラーが発生します。
"CannotPullContainerError: inspect image has been retried 5 time(s): httpReaderSeeker: failed open: unexpected status code https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Too Many Requests - Server message: toomanyrequests:"
この問題を解決するには、「エラー "CannotPullContainerError を解決するには: Amazon ECS の「プルレート上限」に達しましたか?」を参照してください。
イメージの名前またはタグが存在しない
Amazon ECR でホストされているイメージまたはタグを定義したが、そのイメージまたはタグが存在しない場合、次のエラーが発生します。
"Cannotpullcontainererror: pull image manifest has been retried 1 time(s): failed to resolve ref 123456789.dkr.ecr.ap-southeast-2.amazonaws.com/image-name:tag: 123456789**.dkr.ecr.ap-southeast-2.amazonaws.com/image-name:tag: not found**"
この問題を解決するには、タスク定義の image フィールドに正しい値が含まれていることを確認してください。対応するリポジトリとタグが、プル元のコンテナレジストリ内にあることを確認します。
タスクが Amazon ECR 以外のレジストリからイメージを取得しており、タスクに情報が不足している場合は、別のエラーが表示されます。次のエラーは、イメージが存在しないか、タグが存在しないか、レジストリ認証情報を指定していない場合に発生します。
"Cannotpullcontainererror: pull image manifest has been retried 1 time(s): failed to resolve ref docker.io/library/invalid-name:non-existenttag: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed"
この問題を解決するには、タスク定義の image フィールドを確認します。イメージが対応するコンテナレジストリ内にあることを確認します。イメージがある場合は、正しい認証情報を入力していることを確認します。詳細については、「Amazon ECS での AWS 以外のコンテナイメージの使用」を参照してください。
タスク定義で参照されているイメージが別のアカウント内にある
イメージが別のアカウントにある場合、次のエラーメッセージが表示される場合があります。
"Cannotpullcontainererror: pull access denied for 123456789***.dkr.ecr.us-east-1.amazonaws.com/image-name:tag, repository does not exist or may require 'docker login': denied: User: arn:aws:sts::012345678**:assumed-role/role-name/ec2 instance id is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:us-east-1:123456789*:repository/image-name:tag because no resource-based policy allows the ecr:BatchGetImage action"
この問題を解決するには、イメージが配置されているアカウントのリポジトリポリシーで ecr:batchGetImage アクションを許可する必要があります。
例えば、Amazon ECS クラスターに関連付けられたインスタンスがアカウント A にあり、タスク定義がアカウント B にあるイメージを参照している場合は、アカウント B のリポジトリポリシーにより、アカウント A にあるインスタンス IAM ロールに ecr:batchGetImage を許可する必要があります。さらに、リポジトリポリシーでクロスアカウントアクセス許可を有効にする必要があります。次に、アカウント A のインスタンスがアカウント B からイメージをプルできることを確認します。詳細については、「Amazon ECR イメージリポジトリ内のイメージをセカンダリアカウントにプッシュまたはプルできるようにする方法を教えてください」を参照してください。
ファイルシステムの空き容量が不足している
ファイルシステムの空き容量が不足している場合、次のエラーが発生します。
"CannotPullContainerError: write /var/lib/docker/tmp/GetImageBlob2923440728: no space left on device"
この問題を解決するには、次の手順を実行します。
関連するコンテンツ
- 質問済み 4ヶ月前

