AWS CodeBuild で Docker イメージを使用したときに表示される「イメージ設定のプルエラー: toomanyrequests」というエラーを解決する方法を教えてください。

所要時間2分
0

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.    お客様のビルドプロジェクトを選択します。

  1. [ビルドの詳細] タブを選択します。

  2. [環境] セクションの [サービスロール] で、サービスロール ARN を選択します。IAM コンソールが開きます。

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

  4. [JSON] タブを選択します。

  5. テキストエディターでコードを次の IAM ポリシーに置き換えます。

注: [YOUR_SECRET\ _ARN] を、先ほど書き留めておいたシークレット ARN に置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue"
      ],
      "Resource": [
        "YOUR_SECRET_ARN*"
      ]
    }
  ]
}
  1. [ポリシーの確認] を選択します。

  2. [名前] にポリシーの名前を入力します。例:[dockerhub\ _secret_access] 注: ポリシーには任意の名前を選択できます。この名前は、あくまでも自分のメモ用です。

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

シークレットを取得するように CodeBuild を設定する

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

2.    ナビゲーションペインで [ビルド] を選択し、次に [ビルドプロジェクト] を選択します。

3.    お客様のビルドプロジェクトを選択します。

4.    [編集] を選択し、次いで [環境] を選択します。

  1. [追加の設定] セクションを展開します。

  2. 環境変数を追加するには、[環境変数] セクションの [名前] に [DOCKERHUB_USERNAME] を入力します。

  3. [] に、シークレットの名前に続けて [:username] を入力します。例: [dockerhub:username]

  4. [タイプ] で [シークレットマネージャー] を選択します。

  5. 次の環境変数を追加するには、[環境変数の追加] を選択します。

  6. [名前] に [DOCKERHUB_PASSWORD] を入力します。

  7. [] に、シークレットの名前に続けて [:password] を入力します。例: [dockerhub:password]

  8. [タイプ] で [シークレットマネージャー] を選択します。

13.    [環境の更新] を選択します。

  1. 他の 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
AWS公式
AWS公式更新しました 10ヶ月前
コメントはありません

関連するコンテンツ