最近、AWSのCodeBuildプロジェクトで、以下のようなエラーが散見されるようになりました

1
toomanyrequests: Too Many Requests. Please see https://docs.docker.com/docker-hub/download-rate-limit/

これは最近、Docker Hub側に実装されたPull回数制限によるもので、Docker Hub側に弾かれているのが原因です

調べた

Pull回数は以下の通り制限がかかるようです

プラン Pull回数制限 カウント単位
無料ユーザ(非ログイン) 6時間あたり100回まで IP毎
無料ユーザ(ログイン) 6時間あたり200回まで アカウント毎
Pro/Teamユーザ(ログイン) 無制限 アカウント毎

なんとかしたい

非ログイン状態の場合、 IP毎に制限されるという所がポイントのようで、これがおそらく、AWSのCodeBuild実行時に生成されるコンテナにAWSから割り振られたIPが、たまたまこの制限に引っかかったIPだったと。率直に言うと、運悪かったって事になりますね(やり直したら通ったりする)

とりあえず、 ログインすれば、IPで制限される事はなくなるため、こういったIPガチャを回避する事ができそうです

今回は、6時間に200回もビルド実行するようなプロジェクトではなかったため、無料ユーザでログインする方法で対処します

buildspec.ymlでDocker Hubにログインする

  1. Docker Hubのアカウントを作る(無い場合)
  2. AWSの「Key Management Service」にアクセスし、KMSキーを作成する
項目 入力値
キーのタイプ 対称
エイリアス (任意)
キー管理者 CodeBuildのビルドプロジェクトに設定してあるサービスロールにチェックをいれる
キーユーザー(※1) CodeBuildのビルドプロジェクトに設定してあるサービスロールにチェックをいれる

(※1) 登録画面では「このアカウント」っていうタイトルになってましたが、一覧では「キーユーザー」と同義のようです

  1. KMSキーが作成出来たら、「KMSキーのARN」を覚えておく
  2. AWS Systems Managerにアクセスし、「パラメータストア」を選択
  3. パラメータを作成する
項目 入力値
名前 (※2)
利用枠 (任意) ※今回は「標準」
タイプ 安全な文字列(SecureString)
KMSキーソース 別のアカウント
KMSキーID 3で覚えておいた「KMSキーのARN」
(※2)

(※2) 1で作成したDocker Hubのアカウントをそれぞれ登録します

名前
DOCKER_HUB_USER (Docker Hubのユーザ)
DOCKER_HUB_PASS (Docker Hubのパスワード)

ここまで準備ができたら、 buildspec.ymldocker loginを実行します

上記の手順で登録したパラメータを参照し、 pre_buildとかに echo $DOCKER_HUB_PASS | docker login -u $DOCKER_HUB_USER --password-stdinを追記します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: 0.2

env:
parameter-store:
DOCKER_HUB_USER: "DOCKER_HUB_USER" // ←作ったパラメータを参照
DOCKER_HUB_PASS: "DOCKER_HUB_PASS"

phases:
pre_build:
commands:
- echo $DOCKER_HUB_PASS | docker login -u $DOCKER_HUB_USER --password-stdin // ←この行を追加
build:
commands:
...

その他の対処法

あらかじめイメージのバージョンが決まっているような場合は、自前でビルドして、ECRにイメージを保有し、それを参照するのも対処法としてアリですね