エラー "CannotPullContainerError を解決するには: Amazon ECS の「プルレート上限」に達しましたか?

所要時間3分
0

Docker Hub からイメージをプルしようとすると、Amazon Elastic Container Service (Amazon ECS) タスクが失敗し、次のエラーが表示されます。 CannotPullContainerError: 検査イメージが 5 回再試行されました: httpReaderSeeker: 開くのに失敗しました: 予期しないステータスコード https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429要求が多すぎます - サーバーメッセージ: toomanyrequests: プルレートの上限に達しました。認証とアップグレードにより、上限を引き上げることができます。https://www.docker.com/increase-rate-limit"

簡単な説明

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

起動に失敗する Amazon ECS タスクのエラーをトラブルシューティングするには、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用してください。このオートメーションでは以下の構成を確認します。

  • 設定したコンテナレジストリへのネットワーク接続
  • 実行ロールに必要な AWS ID とアクセス管理 (IAM) 権限がない
  • 仮想プライベートクラウド (VPC) エンドポイント接続
  • セキュリティグループルール設定
  • AWS Secrets Manager のシークレットリファレンス
  • ロギング設定

解決策

重要:

  • ECS クラスターリソースが配置されているのと同じ AWS リージョンで、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを起動してください。
  • ランブックを使用するときは、最近失敗したタスク ID を使用する必要があります。失敗したタスクが Amazon ECS の一部である場合は、サービス内で最後に失敗したタスクを使用してください。失敗したタスクは、オートメーションの実行中に ECS:DescribeTasks に表示される必要があります。デフォルトでは、停止した ECS タスクは、停止状態になってから 1 時間表示されます。最近失敗したタスク ID を使用すると、タスク状態のクリーンアップによってオートメーション中に分析が中断されるのを防ぐことができます。

**注:**ランブックの出力に推奨事項が記載されていない場合は、次のセクションにある手動によるトラブルシューティング方法のいずれかを使用してください。

AWSSupport-TroubleshootECSTaskFailedToStart ランブックを実行するには、次の手順に従います。

1.    AWS Systems Manager コンソールを開きます。

2.    ナビゲーションペインで、[変更管理] から [オートメーション] を選択します。

3.    [オートメーションの実行] を選択します。

4.    [Amazon が所有] タブを選択します。

5.    [オートメーションドキュメント] で**「TroubleshootECSTaskFailedToStart」**を検索します。

6.    AWSSupport-TroubleshootECSTaskFailedToStart カードを選択します。
**注:**ハイパーリンクされたオートメーション名ではなく、カード上のラジオボタンを選択します。

7.    [次へ] を選択します。
: 実行後、分析結果は グローバル出力セクションに入力されます。ただし、ドキュメントのステータスが [成功] に移行するまでお待ちください。また、[出力] セクションに例外がないかどうかも確認してください。

8.    [オートメーションドキュメントを実行] で、[シンプルな実行] を選択します。

9.    [入力パラメーター] セクションの [AutomationAssumeRole] に、システムマネージャーオートメーションがアクションを実行できるようにするロールの ARN を入力します。
**注:**AutomationAssumeRole または IAM ユーザーまたはロールのいずれかに、AWSSupport-TroubleshootECSTaskFailedToStart ランブックを実行するために必要な IAM 権限があることを確認してください。IAM ロールを指定しない場合、Systems Manager オートメーションは IAM ユーザーまたはランブックを実行するロールの権限を使用します。Systems Manager オートメーションの assume ロールの作成については、「タスク 1: オートメーション用のサービスロールを作成する」を参照してください。

10.    [ClusterName] には、タスクを開始できなかったクラスター名を入力します。

11.    [TaskId] には、最近失敗したタスクの ID を入力します。

12.    [実行] を選択します。

オートメーションの出力に基づいて、次のいずれかの手動トラブルシューティング手順を実行します。

パブリックイメージを 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.    次のようなコマンドを実行して、Docker イメージを Amazon ECR レジストリにプッシュします。

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 ハブのプルの認証

Docker Hub で認証すると、認証済みユーザーとしてレート制限が増え、Docker ユーザー名に基づいてレート制限されます。Docker Hub のユーザー名とパスワードを AWS Secrets Manager にシークレットとして保存し、このシークレットを使用して Docker Hub に対する認証を行います。

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

Docker Hub 認証情報のシークレットを作成するには、「プライベートレジストリ認証を有効にする」の**「基本シークレットを作成するには」**のセクションに記載された手順に従ってください。

**タスク実行 IAM ロールの更新 **

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

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

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

3.    ecsTaskExecutionRole のロールのリストを検索し、ロールを選択すると、接続されているポリシーが表示されます。

4.    [権限] タブで [権限の追加] を選択し、[インラインポリシーの作成] を選択します。

5.    [ポリシーの作成] ページで、[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 に置き換える
  • us-east-1 を希望するリージョンに置き換える
  • mykey を自分の AWS KMS キーに置き換える

**注:**KMS:Decrypt を含めるのは、キーがカスタム AWS Key Management Service (AWS KMS) キーを使用している場合のみです。カスタムキーの ARN をリソースとして追加します。

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

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

8.    [ポリシーを作成] を選択します。

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

クラシックコンソールを使用してタスク定義を作成する」の手順に従って、Amazon ECS タスク定義を作成します。[タスク実行ロール] で前のセクションで更新したタスク実行 IAM ロールを選択します。

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

1.     [コンテナを追加] を選択します。

2.    [コンテナ名] にコンテナの名前を入力します。

3.     [イメージ] には、イメージの名前を入力するか、プライベートイメージへのパス(例:****repository-url/image.tag)を含めてください。

4.    プライベートリポジトリ認証を選択します。

5.    シークレットマネージャーの ARN または名前には、作成したシークレットの ARN を入力します。

6.    [追加] を選択します。

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

Amazon ECS クラスター を作成します。次に、作成したタスク定義を使用してタスクを実行します

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

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

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

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

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

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

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

さらにプルが必要な場合は、24 時間で 50,000 回のプルが可能な Docker **Pro ** または **Team ** サブスクリプションにプランをアップグレードしてください。料金プランの詳細については、「価格設定とサブスクリプション」を参照してください(Docker Hub ウェブサイトから)。

関連情報

Amazon ECR 価格設定

Amazon ECR パブリック Service Quotas

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ