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

Amazon EKS によるの Amazon ECR の問題をトラブルシューティングする方法を教えてください。

所要時間3分
0

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

簡単な説明

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

  • Amazon ECR エンドポイントと通信できない。
  • ワーカーノードのノードインスタンスロールに適切な権限がない。
  • インターフェイス VPC エンドポイントが作成されていない。

ユースケースに応じて、以下の解決策を 1 つ以上実行してください。

解決策

ワーカーノードと 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 ロールの更新

以下の例では、ワーカーノードのインスタンスの AWS Identity and Access Management (AWS 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 credentialsWarning  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 のAWS Identity and Access Management (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 ウェブサイトの「Images」を参照してください。

リポジトリポリシーが正しいことを確認する

リポジトリポリシーは、個々の Amazon ECR リポジトリへのアクセスを制御する IAM ポリシーのサブセットです。IAM ポリシーは通常、Amazon ECR サービス全体にアクセス権限を適用するために使用されますが、特定のリソースへのアクセスを制御することもできます。

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

EKS が別の AWS アカウントにある場合は、リポジトリポリシーがアクセスを許可していることを確認します。

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

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::<aws-account-containing-eks-cluster>:assumed-role/<node-instance-role-for-worker-node is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name

次のポリシー例では、ある AWS アカウントのインスタンス IAM ロールが、別の AWS アカウントの ECR リポジトリからコンテナイメージを記述して取り出せるようにします。

{
  "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": "*"
    }
  ]
}

注: ECR ポリシーでは、インスタンスプロファイル ARN ではなく、インスタンス IAM ロールの ARN を使用してください。

インターフェイス VPC エンドポイントの作成

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

Fargate ポッド実行ロールが正しく設定されていることを確認する

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 を使用するように Fargate ポッド実行ロールを設定してください。次のような信頼ポリシーがロールに添付されていることも確認してください。

{  
  "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": "*"
    }
  ]
}

**注:**example-region は AWS リージョンの名前に置き換えます。1111222233334444 はアカウント番号に、example-cluster はクラスターの名前に置き換えてください。

AWS公式
AWS公式更新しました 10ヶ月前
コメントはありません

関連するコンテンツ