スキップしてコンテンツを表示

Amazon EKS を使用する際に Amazon ECR からイメージを取得できない原因を教えてください。

所要時間3分
0

Amazon Elastic Kubernetes Service (Amazon EKS) を使用しているときに、Amazon Elastic Container Registry (Amazon ECR) からイメージを取り出すことができません。

簡単な説明

次のいずれかの理由により、Amazon ECR から画像を取得することができません。

ユースケースに応じて、次のいずれかの解決策を実行してください。

解決策

ワーカーノードと Amazon ECR エンドポイント間の通信をトラブルシューティングする

ワーカーノードが Amazon ECR エンドポイントと通信できない場合、次のエラーメッセージが表示されます。

"Failed to pull image 'ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag': rpc error: code = Unknown desc = Error response from daemon: Get https://ACCOUNT.dkr.ecr.REGION.amazonaws.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)"

このエラーを解決するには、以下を確認します。

  • ワーカーノードのサブネットにインターネットへのルートがあり、サブネットに関連付けられたルートテーブルが正しく設定されている。
  • ワーカーノードに関連付けられているセキュリティグループで、アウトバウンドのインターネットトラフィックが許可されている。
  • ネットワークアクセスコントロールリスト (ACL) のイングレスルールおよびエグレスルールにより、インターネットへのアクセスが許可されている。

ワーカーノードのインスタンス IAM ロールを更新する

ワーカーノードのインスタンスの IAM ロールに Amazon ECR からイメージを取得するアクセス許可がない場合、Amazon EKS ポッドで次のエラーが発生します。

"Warning Failed 14s (x2 over 28s) kubelet, ip-000-000-000-000.us-west-2.compute.internal Failed to pull image 'ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag': rpc error: code = Unknown desc = Error response from daemon: Get https://ACCOUNT.dkr.ecr.REGION.amazonaws.com/v2/imagename/manifests/tag: no basic auth credentials Warning Failed 14s (x2 over 28s) kubelet, ip-000-000-000-000.us-west-2.compute.internal Error: ErrImagePull Normal BackOff 2s (x2 over 28s) kubelet, ip-000-000-000-000.us-west-2.compute.internal Back-off pulling image 'ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag' Warning Failed 2s (x2 over 28s) kubelet, ip-000-000-000-000.us-west-2.compute.internal Error: ImagePullBackOff"

このエラーを解決するには、ワーカーノードが AmazonEC2ContainerRegistryReadOnly IAM マネージドポリシーを使用していることを確認します。または、次の IAM アクセス許可を使用してワーカーノードの Amazon Elastic Compute Cloud (Amazon EC2) インスタンスプロファイルを更新します。

"ecr:GetAuthorizationToken","ecr:BatchCheckLayerAvailability","ecr:GetDownloadUrlForLayer","ecr:GetRepositoryPolicy","ecr:DescribeRepositories","ecr:ListImages","ecr:DescribeImages","ecr:BatchGetImage","ecr:GetLifecyclePolicy","ecr:GetLifecyclePolicyPreview","ecr:ListTagsForResource","ecr:DescribeImageScanFindings"

重要: AmazonEC2ContainerRegistryReadOnly ポリシーを使用し、ポリシーの重複を避けることがベストプラクティスです。

更新されたインスタンスの IAM ロールにより、Amazon ECR にアクセスし、kubelet を介してイメージを取得するアクセス許可がワーカーノードに付与されます。kubelet は Amazon ECR 認証情報を取得し、定期的に更新します。詳細については、Kubernetes のウェブサイトの「イメージ」を参照してください。

リポジトリポリシーを検証する

リポジトリポリシーが正しいことを確認するには、次の手順を実行します。

  1. AWS アカウントの Amazon ECR コンソールを開きます。
  2. Amazon ECR リポジトリを含む AWS リージョンに移動します。
  3. ナビゲーションペインで [リポジトリ] をクリックし、確認するリポジトリを選択します。
  4. ナビゲーションペインで [アクセス許可] をクリックし、リポジトリに正しいアクセス許可があるかどうかを確認します。次のポリシーの例では、特定の IAM ユーザーがリポジトリとリポジトリ内のイメージを記述できます。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ECR Repository Policy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/username"
            },
            "Action": [
                "ecr:DescribeImages",
                "ecr:DescribeRepositories"
            ],
            "Resource": "arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name"
        }
    ]
}

注: 123456789012 をアカウント ID に、username を IAM ユーザーまたはロール名に置き換えてください。REGION を実際のリージョンに、cross-aws-account-id をアカウント ID に、repo-name を Amazon ECR リポジトリの名前に置き換えてください。

クロスアカウントの Amazon ECR アクセスを許可するようにリポジトリポリシーを設定する

別のアカウントのコンテナイメージにアクセスできない場合、kubelet は失敗し、次のエラーメッセージが表示されます。

<aws-account-containing-eks-cluster><node-instance-role-for-worker-node>"Failed to pull image 'cross-aws-account-id:.dkr.ecr.REGION.amazonaws.com/repo-name:image-tag': rpc error: code = Unknown desc = Error response from daemon: pull access denied for arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name, repository does not exist or may require 'docker login': denied: User: arn:aws:sts:::assumed-role/ is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name"

このエラーを解決するには、次のポリシーを使用します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/eksctl-cross-account-ecr-access-n-NodeInstanceRole"
            },
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:GetLifecyclePolicy",
                "ecr:GetLifecyclePolicyPreview",
                "ecr:ListTagsForResource",
                "ecr:DescribeImageScanFindings"
            ],
            "Resource": "*"
        }
    ]
}

注: 123456789012 をアカウント ID に、eksctl-cross-account-ecr-access-n-NodeInstanceRole をノードインスタンスの IAM ロールに置き換えてください。Amazon ECR ポリシーでは、インスタンスのプロファイル ARN ではなく、インスタンスの IAM ロールの Amazon リソースネーム (ARN) を使用してください。

このポリシーでは、あるアカウントのインスタンスの IAM ロールが、別のアカウントの Amazon ECR リポジトリからコンテナイメージを記述して取得することを許可します。

インターフェイス VPC エンドポイントを作成する

Amazon ECR からイメージを取得するには、Amazon ECS のインターフェイス VPC エンドポイントを作成して設定する必要があります。

ポッド実行ロールの設定を検証する

Amazon がホストするリポジトリからイメージを取得するときに、Fargate CoreDNS ポッドが ImagePullBackOff 状態のままになっている場合は、次のエラーメッセージが表示されます。

"Warning Failed 27s (x2 over 40s) kubelet Failed to pull image '151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest': rpc error: code = Unknown desc = failed to pull and unpack image '151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest': failed to resolve reference '151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest': pulling from host 151284513677.dkr.ecr.eu-central-1.amazonaws.com failed with status code [manifests latest]: 401 Unauthorized"

このエラーを解決するには、AmazonEKSFargatePodExecutionRolePolicy を使用するようにポッド実行ロールを設定します。

ポリシー例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/eksctl-cross-account-ecr-access-n-NodeInstanceRole"
            },
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetRepositoryPolicy",
                "ecr:DescribeRepositories",
                "ecr:ListImages",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:GetLifecyclePolicy",
                "ecr:GetLifecyclePolicyPreview",
                "ecr:ListTagsForResource",
                "ecr:DescribeImageScanFindings"
            ],
            "Resource": "*"
        }
    ]
}

注: 123456789012 をアカウント ID に、eksctl-cross-account-ecr-access-n-NodeInstanceRole をノードインスタンスの IAM ロールに置き換えてください。

AWS公式更新しました 7ヶ月前
1コメント

This article was reviewed and updated on 2026-03-02.

エキスパート

応答済み 1ヶ月前

関連するコンテンツ