AWS CodeBuild で Docker イメージを使用する際に発生する「イメージ設定のプルエラー: toomanyrequests」というエラーを解決したいと考えています。
簡単な説明
CodeBuild で Docker イメージを使用する場合、パブリック DockerHub リポジトリからレイヤーをプルするときにスロットルが発生する可能性があります。
スロットルが発生したときに表示されるエラーを解決するには、DockerHub アカウントの認証情報を使用してレイヤープルを認証するように CodeBuild を設定する必要があります。
重要: 次の手順を完了するには、DockerHub アカウントと、アカウントのユーザー名とパスワードが必要です。
解決方法
AWS Secrets Manager で DockerHub 認証情報を保存する
1. AWS Secrets Manager コンソールを開きます。
2. [Store a new secret] (新しいシークレットを保存する) を選択します。
3. [Select secret type] (シークレットの種類を選択) セクションで、[Other type of secrets] (その他のシークレット) を選択します。
4. [Specify the key/value pairs to be stored in this secret] (このシークレットに格納するキーと値のペアを指定する) セクションで、[Secret key/value] (シークレットキー/値) タブを選択します。
5. 最初のテキストボックスに、ユーザー名を入力します。2 つ目のテキストボックスに、DockerHub ユーザー名を入力します。その後、[Add row] (行を追加) を選択します。
6. 新しい行の最初のテキストボックスに、パスワードを入力します。2 つ目のテキストボックスに、DockerHub パスワードを入力します。その後、[Add row] (行を追加) を選択します。
7. [次へ] を選択します。
8. [Secret name] (シークレット名) に、シークレットの名前を入力します。例: dockerhub
9. [次へ] を選択します。
10. [Disable automatic rotation] (自動ローテーションを無効にする) のデフォルト設定が選択されていることを確認します。
11. [次へ] を選択します。
12. [Store] (保存) を選択します。
13. [Secret name] (シークレット名) 列から、シークレットを選択します。
14. [Secret details] (シークレットの詳細) セクションで、シークレット ARN の Amazon リソースネーム (ARN) を書き留めます。
プロビジョニングフェーズで発生するスロットリングを解決する
1. CodeBuild コンソールを開きます。
2. ナビゲーションウィンドウで、[Build] (ビルド) を選択し、[Build projects] (ビルドプロジェクト) を選択します。
3. ビルドプロジェクトを選択します。
4. [Edit] (編集)、[Environment] (環境) の順に選択します。
5. [Override image] (イメージの上書き) を選択します。
6. [New environment image] (新しい環境イメージ) で、[Custom image] (カスタムイメージ) を選択します。
7. [Environment type] (環境タイプ) で、 カスタムイメージを選択します。
8. [Image registry] (イメージレジストリ) で、[Other registry] (その他のレジストリ) を選択します。
9. [External registry URL] (外部レジストリ URL) で、Docker イメージの名前を入力します。
10. [Registry credential] (レジストリの認証情報) には、前に書き留めたシークレットの ARN を入力します。
11. [Update environment] (環境の更新) を選択します。
他のフェーズで発生するスロットリングを解決する
重要: シークレットにアクセスするには、CodeBuild サービスロールに AWS Identity and Access Management (IAM) のアクセス許可を付与する必要があります。
1. CodeBuild コンソールを開きます。
2. ナビゲーションウィンドウで、[Build] (ビルド) を選択し、[Build projects] (ビルドプロジェクト) を選択します。
3. ビルドプロジェクトを選択します。
4. [Build details] (ビルドの詳細) タブを選択します。
5. [Environment] (環境) セクションの [Service role] (サービスロール) で、サービスロール ARN を選択します。これにより、IAM コンソールが開きます。
6. [Permissions] (アクセス許可) タブで [Add inline policy] (インラインポリシーを追加) を選択します。
7. [JSON] タブを選択します。
8. テキストエディタのコードを次の IAM ポリシーに置き換えます。
重要: YOUR_SECRET_ARN を書き留めておいたシークレット ARN に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"YOUR_SECRET_ARN*"
]
}
]
}
9. [Review policy] (ポリシーの確認) をクリックします。
10. [Name] (名前) で、ポリシーの名前を入力します。例: dockerhub_secret_access 注: ポリシーの名前を任意に選択できます。この名前は、今後の参考のみを目的とするものです。
11. [Create policy] (ポリシーを作成) を選択します。
シークレットを取得するように CodeBuild を設定する
1. CodeBuild コンソールを開きます。
2. ナビゲーションウィンドウで、[Build] (ビルド) を選択し、[Build projects] (ビルドプロジェクト) を選択します。
3. ビルドプロジェクトを選択します。
4. [Edit] (編集)、[Environment] (環境) の順に選択します。
5. [Additional configuration] (追加設定) セクションを展開します。
6. 環境変数を追加するには、[Environment] (環境) 変数セクションの [Name] (名前) に DOCKERHUB_USERNAME と入力します。
7. [Value] (値) で、:username の前にシークレットの名前を入力します。例: dockerhub:username
8. [Type] (タイプ) で、[Secrets Manager] を選択します。
9. 次の環境変数を追加するには、[Add environment variable] (環境変数の追加) を選択します。
10. [Name] (名前) に、DOCKERHUB_PASSWORD と入力します。
11. [Value] (値) で、 :password の前にシークレットの名前を入力します。例: dockerhub:password
12. [Type] (タイプ) で、[Secrets Manager] を選択します。
13. [Update environment] (環境の更新) を選択します。
14. buildspec を変更し、他の Docker アクションを実行する前に、次のコマンドを追加します。
echo "${DOCKERHUB_PASSWORD}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin
警告: このコマンドは、Docker ログインユーザー名とパスワードの詳細をビルドログに記録できます。スロットルエラーを解決したら、Docker パスワードをリセットします。
例:
version: 0.2
phases:
install:
commands:
- echo "${DOCKERHUB_PASSWORD}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin
build:
commands:
- docker pull docker:dind