Amazon ECS で「CannotPullContainerError: You have reached your pull rate limit」(CannotPullContainerError: プルレート制限に到達しました) エラーを解決するにはどうすればよいですか?

最終更新日: 2022 年 3 月 25 日

Docker Hub からイメージをプルしようとすると、Amazon Elastic Container Service (Amazon ECS) タスクが失敗し、次のエラーが表示されます。

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: You have reached your pull rate limit.認証とアップグレードにより、上限を引き上げることができます: https://www.docker.com/increase-rate-limit

簡単な説明

このエラーは、Docker のプルレート制限に到達した後でパブリック Docker Hub リポジトリからイメージをプルしようとする場合に発生し、http ステータスコード 429 が返されます。Docker Hub は IP アドレスを使用してユーザーを認証し、プルレート制限は個々の IP アドレスに基づいています。匿名ユーザーの場合、レート制限は IP アドレスごとに、6 時間あたり 100 プルに設定されています。Docker ID を持つ認証済みユーザーの場合、プルレートは 6 時間あたり 200 プルに設定されています。イメージのプルリクエストがこれらの制限を超えると、6 時間が経過するまでこれらのリクエストが拒否されます。Amazon ECS/Amazon EKS ワークロードを実行している場合、データの大部分は固定 IP アドレスが設定された NAT ゲートウェイ経由でプルされます。この場合、プル制限を超えると、リクエストがスロットルされます。

解決方法

この問題をトラブルシューティングするには、次のいずれかの回避策を使用します。

パブリックイメージを Amazon ECR プライベートレジストリにコピーする

Amazon Elastic Container Registry (Amazon ECR) リポジトリを作成し、この新しいリポジトリにイメージをプッシュします。この手法では、Amazon ECR リポジトリからイメージをプルすることによって Docker Hub のプル制限の超過を回避できる可能性があります。

1.    次のようなコマンドを実行して、Docker Hub からイメージをプルします。

docker pull example-image

2.    次のようなコマンドを実行して、Docker クライアントが Amazon ECR レジストリにアクセスできるように認証します。

aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com

3.    次のようなコマンドを実行して、リポジトリにプッシュするイメージにタグを付けます。

docker tag myrepository:latest 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

4.    次のようなコマンドを実行して、Amazon ECR レジストリに Docker イメージをプッシュします。

docker push 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

5.    次のようなコマンドを実行して、新たにプッシュされた Amazon ECR イメージをベースイメージとして使用するように Docker ファイルを更新します。

FROM 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:tag

上記のコマンドでは、以下の項目を置き換えるようにしてください。

  • example-image は、プッシュするパブリックイメージの名前に置き換えます
  • 1111222233334444 は、アカウント ID に置き換えます
  • myrepository:latest は、Amazon ECR レジストリの名前に置き換えます
  • eu-west-1 は、目的のリージョンに置き換えます

Docker Hub のプルを認証する

Docker Hub で認証すると、認証済みユーザーとしてレート上限が引き上げられ、Docker ユーザーネームに基づいてレートが制限されます。AWS Secrets Manager で Docker Hub のユーザーネームとパスワードをシークレットとして保存してから、このシークレットを使用して Docker Hub に認証できます。

Docker Hub 認証情報用の Secrets Manager シークレットを作成する

Docker Hub 認証情報用のシークレットを作成するには、「プライベートレジストリの認証の有効化」の「基本的なシークレットを作成するには」セクションにある手順を使用します。

タスク実行 AWS Identity and Access Management (AWS IAM) ロールを更新する

作成したシークレットに Amazon ECS タスクへのアクセス権を付与するには、必要な許可をインラインポリシーとしてタスク実行ロールに手動で追加する必要があります。

1.    IAM コンソールを開きます。

2.    ナビゲーションペインで [Roles] を選択します。

3.    ロールのリストで ecsTaskExecutionRole を検索し、このロールを選択してアタッチされたポリシーを表示します。

4.    [アクセス許可] タブで [アクセス許可の追加] を選択し、[Create inline policy] (インラインポリシーの作成) を選択します。

5.    [Create policy] (ポリシーの作成) ページで [JSON] を選択し、次のポリシーをコピーして貼り付けます。

{
 "Version": "2012-10-17",
 "Statement": [{
  "Effect": "Allow",
  "Action": [
   "secretsmanager:GetSecretValue",
   "kms:Decrypt"
  ],
  "Resource": [
   "arn:aws:secretsmanager:eu-west-1:1111222233334444:secret:dockerhub-0knT",
   "arn:aws:kms:eu-west-1:1111222233334444:key/mykey"
  ]
 }]
}

ポリシーで、次の項目を置き換えてください。

  • 1111222233334444 は、アカウント ID に置き換えます
  • eu-west-1 は、希望するリージョンに置き換えます
  • mykey は、AWS KMS キーに置き換えます

注: kms:Decrypt を含めるのは、キーでデフォルトのキーを使用せず、カスタムの AWS Key Management Service (AWS KMS) キーを使用する場合のみです。カスタムキーの ARN をリソースとして追加します。

6.    [Review policy] (ポリシーの確認) を選択します。

7.    [Name] (名前) に、ポリシーの名前 (ECSSecrets) を入力します。

8.    [Create policy] (ポリシーの作成) を選択します。

Docker 認証用のシークレットを使用するタスク定義を作成する

Creating a task definition using the classic console (クラシックコンソールを使用したタスク定義の作成)」の説明に従って、Amazon ECS タスク定義を作成します。[タスク実行ロール] では、前のセクションで更新したタスク実行 IAM ロールを必ず選択してください。

[コンテナの定義] セクションで、次を行います。

  1. [コンテナの追加] を選択します。
  2. [コンテナ名] に、コンテナの名前を入力します。
  3. [イメージ] には、イメージの名前を入力するか、プライベートイメージへのパス (例: repository-url/image.tag) を含めます。
  4. [Private repository authentication] (プライベートリポジトリ認証) を選択します。
  5. [Secrets Manager ARN or name] (Secrets Manager の ARN または名前) には、作成したシークレットの ARN を入力します。
  6. [追加] を選択します。

Amazon ECS クラスターを作成して Amazon ECS タスクを実行する

Amazon ECS クラスターを作成します。その後、前のセクションで作成したタスク定義を使用してタスクを実行します。

パブリックコンテナイメージに Amazon ECR パブリックレジストリを使用する

Docker ファイルで使用しているパブリックイメージを特定します。適切な検索フィルターを使用して、Amazon ECR パブリックギャラリーでこれらのイメージを検索します。パブリックリポジトリを参照してイメージをプルするために認証する必要はありません。Amazon ECR パブリックレジストリには、オペレーティングシステム、AWS が公開したイメージ、Kubernetes アドオン、およびアーティファクトなどの一般的なベースイメージが含まれています。Amazon ECR パブリックレジストリからイメージをプルすることで、Docker Hub のレート制限に到達することを回避できます。

これらのイメージは、タスク定義内のコンテナイメージのソースとして使用できます。

ContainerDefinitions: [
 {
 ...
 Image: 'public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest'
 ...
 }
 ]

これらのイメージを Docker ファイル内のベースイメージとして使用することも選択できます。

Docker File
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

Docker Pro または Team サブスクリプションにアップグレードする

プランを Docker Pro または Team サブスクリプションにアップグレードすると、24 時間で 50,000 プルが提供されます。料金プランの詳細については、「Docker Hub の料金」を参照してください。


Amazon ECR の料金

Amazon ECR Public service quotas (Amazon ECR Public のサービスクォータ)

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


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