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

最終更新日: 2020 年 1 月 27 日

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

簡単な説明

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

  • Amazon ECR エンドポイントと通信できない。
  • 特定の 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) の Ingress ルールと Egress ルールは、インターネットへのアクセスを許可します。

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

ワーカーノードのインスタンスプロファイルに 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 ポリシーを使用することをがベストプラクティスです。

更新されたインスタンスプロファイルは、Amazon ECR にアクセスし、kubelet を通じてイメージをプルする許可をワーカーノードに付与します。kubelet は、Amazon ECR 認証情報の取得と定期的な更新を担います。詳細については、Kubernetes Images を参照してください。

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

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

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

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

3.    ナビゲーションペインで [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"
      ]
    }
  ]
}

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

改善できることはありますか?


さらにサポートが必要な場合