CodeBuild で Docker イメージを使用する際に発生する「イメージ設定のプルエラー: toomanyrequests」というエラーを解決するにはどうすればよいですか?

最終更新日: 2021 年 5 月 18 日

AWS CodeBuild で Docker イメージを使用する際に発生する「イメージ設定のプルエラー: toomanyrequests」というエラーを解決したいと考えています。

簡単な説明

CodeBuild で Docker イメージを使用する場合、パブリック DockerHub リポジトリからレイヤーをプルするときにスロットルが発生する可能性があります。

スロットルが発生したときに表示されるエラーを解決するには、DockerHub アカウントの認証情報を使用してレイヤープルを認証するように CodeBuild を設定する必要があります。

重要: 次の手順を完了するには、DockerHub アカウントと、アカウントのユーザー名とパスワードが必要です。

解決方法

AWS Secrets Manager で DockerHub 認証情報を保存する

1.    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 ポリシーに置き換えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "YOUR_SECRET_ARN*"
            ]
        }
    ]
}

注: 前述のコードでは、YOUR_SECRET_ARN を書き留めておいたシークレット ARN に置き換えます。

9.    [ポリシーの確認] をクリックします。

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 アクションを実行する前に、次のコマンドを追加します。

docker login -u $dockerhub_username -p $dockerhub_password

例:

version: 0.2

phases:
  install:
    commands:
      - docker login -u $dockerhub_username -p $dockerhub_password
 
  build:
    commands:
      - docker pull docker:dind

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


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