AWS CodeBuild で Docker イメージを使用したときに表示される「イメージ設定のプルエラー: toomanyrequests」というエラーを解決したいと考えています。
簡単な説明
CodeBuild で Docker イメージを使用する場合、パブリックの DockerHub リポジトリ からレイヤーをプルするときにスロットリングが発生する可能性があります。
スロットリング発生時に表示されるエラーを解決するには、DockerHub アカウントの認証情報を使用してレイヤーのプルを認証するように CodeBuild を設定する必要があります。
重要: 以下の手順を実行するには、DockerHub アカウントと、アカウントのユーザー名とパスワードが必要です。
解決方法
DockerHub の認証情報を AWS Secrets Manager に保存する
1. AWS Secrets Manager コンソールを開きます。
2. [新しいシークレットを保存する] を選択します。
3. [シークレットの種類を選択]] セクションで、[その他のシークレットのタイプ] を選択します。
4. [このシークレットに保存するキー/値のペアを指定してください] セクションで、[シークレットキー/値] タブを選択します。
5. 最初のテキストボックスに [ユーザー名] を入力します。2 番目のテキストボックスに DockerHub ユーザー名を入力します。次に、[行の追加] を選択します。
6. 新しい行の最初のテキストボックスに [パスワード] を入力します。2 番目のテキストボックスに DockerHub のパスワードを入力します。次に、[行の追加] を選択します。
7. [次へ] を選択します。
8. [シークレットの名前] にシークレットの名前を入力します。例: [dockerhub]
9. [次へ] を選択します。
10. [自動ローテーションを無効にする] でデフォルト設定が選択されていることを確認します。
11. [次へ] を選択します。
12. [保存] を選択します。
13. [シークレットの名前] 列からシークレットを選択します。
14. [シークレットの詳細] セクションに表示される、[シークレットのARN] の Amazon リソースネーム (ARN)を書き留めておきます。
注: お客様がシークレットを作成し、管理している暗号化キーをシークレットに設定した場合は、設定したキーを使って [kms:Decrypt] アクションに対する権限を追加する必要があります。
プロビジョニングフェーズで発生するスロットリングを解決
1. CodeBuild コンソールを開きます。
2. ナビゲーションペインで [ビルド] を選択し、次に [ビルドプロジェクト] を選択します。
3. お客様のビルドプロジェクトを選択します。
4. [編集] を選択し、次いで [環境] を選択します。
5. [イメージの上書き] を選択します。
6. [新しい環境イメージ] で [カスタムイメージ] を選択します。
7. [環境タイプ] でカスタムイメージを選択します。
8. [イメージレジストリ] で [その他のレジストリ] を選択します。
9. [外部レジストリの URL] に Docker イメージの名前を入力します。
10. [レジストリの認証情報] に、先ほど書き留めておいたシークレットの ARN を入力します。
11. [環境の更新] を選択します。
他のフェーズで発生するスロットリングを解決
重要: シークレットにアクセスするには、CodeBuild サービスロールに AWS Identity and Access Management (IAM) 権限を付与しておく必要があります。
1. CodeBuild コンソールを開きます。
2. ナビゲーションペインで [ビルド] を選択し、次に [ビルドプロジェクト] を選択します。
3. お客様のビルドプロジェクトを選択します。
-
[ビルドの詳細] タブを選択します。
-
[環境] セクションの [サービスロール] で、サービスロール ARN を選択します。IAM コンソールが開きます。
-
[権限] タブで [インラインポリシーを追加] を選択します。
-
[JSON] タブを選択します。
-
テキストエディターでコードを次の IAM ポリシーに置き換えます。
注: [YOUR_SECRET\ _ARN] を、先ほど書き留めておいたシークレット ARN に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": [
"YOUR_SECRET_ARN*"
]
}
]
}
-
[ポリシーの確認] を選択します。
-
[名前] にポリシーの名前を入力します。例:[dockerhub\ _secret_access] 注: ポリシーには任意の名前を選択できます。この名前は、あくまでも自分のメモ用です。
-
[ポリシーを作成] を選択します。
シークレットを取得するように CodeBuild を設定する
1. CodeBuild コンソールを開きます。
2. ナビゲーションペインで [ビルド] を選択し、次に [ビルドプロジェクト] を選択します。
3. お客様のビルドプロジェクトを選択します。
4. [編集] を選択し、次いで [環境] を選択します。
-
[追加の設定] セクションを展開します。
-
環境変数を追加するには、[環境変数] セクションの [名前] に [DOCKERHUB_USERNAME] を入力します。
-
[値] に、シークレットの名前に続けて [:username] を入力します。例: [dockerhub:username]
-
[タイプ] で [シークレットマネージャー] を選択します。
-
次の環境変数を追加するには、[環境変数の追加] を選択します。
-
[名前] に [DOCKERHUB_PASSWORD] を入力します。
-
[値] に、シークレットの名前に続けて [:password] を入力します。例: [dockerhub:password]
-
[タイプ] で [シークレットマネージャー] を選択します。
13. [環境の更新] を選択します。
- 他の Docker アクションを実行する場合は、その前に buildspec を変更して次のコマンドを追加します。
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