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

最終更新日: 2021年12月17日

Amazon Elastic Kubernetes Service (Amazon EKS) を使用するときに Amazon Elastic Container Registry (Amazon ECR) からイメージをプルできません。

簡単な説明

Amazon ECR からイメージをプルできない理由は、次のいずれかになります:

  • Amazon ECR エンドポイントと通信できない。
  • ワーカーノードのノードインスタンスロールに適切な許可がありません。
  • インターフェイス VPC エンドポイントを作成していません。

これらの問題を解決するには、以下のセクションのいずれかにあるステップを完了してください:

  • ワーカーノードと Amazon ECR エンドポイント間の通信をトラブルシューティングします
  • ワーカーノードのノードインスタンスロールを更新します
  • リポジトリポリシーが正しいことを確認します
  • EKS が別の AWS アカウントにある場合、リポジトリポリシーでアクセスが許可されているかどうかを確認します
  • インターフェイス VPC エンドポイントを作成します

解決方法

ワーカーノードと 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) の Ingress ルールと Egress ルールは、インターネットへのアクセスを許可します。

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

ワーカーノードのインスタンスIAMロールに Amazon ECR からイメージをプルする許可がない場合、Amazon EKS ポッドから次のエラーメッセージを受け取る可能性があります:

Warning  Failed     14s (x2 over 28s)  kubelet, ip-000-000-000-000.us-west-2.compute.internalFailed 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 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 のイメージ (Kubernetes Web サイトから) を参照してください。

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

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

1.    プライマリアカウントの Amazon ECR コンソールを開きます。

2.    ECR リポジトリを含む AWS リージョンに移動します。

3.    ナビゲーションペインで [Repositories] を選択し、チェックしたいリポジトリを選択します。

4.    ナビゲーションペインで [Permissions] を選択し、リポジトリに正しいアクセス許可があるかどうかをチェックします。

次のポリシー例は、特定の IAM ユーザーがリポジトリ、およびリポジトリ内のイメージを記述できるようにします:

{
  "Version": "2008-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<br>

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

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

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

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

Amazon ECR からイメージをプルするには、インターフェイス VPC エンドポイントを設定する必要があります。Amazon ECR インターフェイスVPC エンドポイント (AWS PrivateLink) Amazon ECS 用の VPC エンドポイントの作成セクションを参照してください。   


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?