最近、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にログインする
- Docker Hubのアカウントを作る(無い場合)
- AWSの「Key Management Service」にアクセスし、KMSキーを作成する
項目 | 入力値 |
---|---|
キーのタイプ | 対称 |
エイリアス | (任意) |
キー管理者 | CodeBuildのビルドプロジェクトに設定してあるサービスロールにチェックをいれる |
キーユーザー(※1) | CodeBuildのビルドプロジェクトに設定してあるサービスロールにチェックをいれる |
(※1) 登録画面では「このアカウント」っていうタイトルになってましたが、一覧では「キーユーザー」と同義のようです
- KMSキーが作成出来たら、「KMSキーのARN」を覚えておく
- AWS Systems Managerにアクセスし、「パラメータストア」を選択
- パラメータを作成する
項目 | 入力値 |
---|---|
名前 | (※2) |
利用枠 | (任意) ※今回は「標準」 |
タイプ | 安全な文字列(SecureString) |
KMSキーソース | 別のアカウント |
KMSキーID | 3で覚えておいた「KMSキーのARN」 |
値 | (※2) |
(※2) 1で作成したDocker Hubのアカウントをそれぞれ登録します
名前 | 値 |
---|---|
DOCKER_HUB_USER | (Docker Hubのユーザ) |
DOCKER_HUB_PASS | (Docker Hubのパスワード) |
ここまで準備ができたら、 buildspec.yml
で docker login
を実行します
上記の手順で登録したパラメータを参照し、 pre_build
とかに echo $DOCKER_HUB_PASS | docker login -u $DOCKER_HUB_USER --password-stdin
を追記します
1 | version: 0.2 |
その他の対処法
あらかじめイメージのバージョンが決まっているような場合は、自前でビルドして、ECRにイメージを保有し、それを参照するのも対処法としてアリですね