AWS Code BuildでDockerfileをビルド時に`Too Many Requests.`エラーになった時に対応したこと
この記事はAWS Advent Calendar 2021の4日目の記事として書かせていただきました。
はじめに
AWS Code BuildでDockerfileをビルドするとToo Many Requests.
と表示されてエラーで落ちることがあります。
この問題に出会った際に自分が対応した内容についてまとめます。
Too Many Requests.
で落ちてしまうのか?
なぜ Docker Hub の Imageのダウンロード回数の制限
2020年11月からDocker HubではPlanに応じてpullによるImage のダウンロード回数を制限するようになりました。
各PlanでどのくらいダウンロードできるのかはこちらのDockerのpricing pageにまとめられています。
(2021年12月時点では無料ユーザーは匿名だと6時間で100回、ログインすると200回みたいです)
Docker Hub の Imageのダウンロード回数の計測方法
どのようにDocker Hubがダウンロード回数を計測しているのかは
Download rate limitのページに記載されています。
匿名ユーザー
匿名ユーザーのダウンロード回数はIP Address単位で計測されます。
Unauthenticated (anonymous) users will have the limits enforced via IP.
ログインユーザー
ログインユーザーのダウンロード回数の制限はそのユーザーの個人アカウントか組織に属している場合は組織アカウントの中で一番高いライセンスに応じて、回数が決定されるようです。
A user’s limit is equal to the highest entitlement of their personal account or any organization they belong to.
AWS Code Build が利用する IP Address
CodeBuildプロジェクトを非VPC環境で作成している場合、共用のグローバルIPが使い回されます。
そのため、匿名ユーザーのダウンロード制限にかかりやすくなります。
対応内容
Docker HubのImageのダウンロード制限とCodeBuildのグローバルIPの共有が原因なので、それを解決する方法を考えました。
- Docker hub にログインをして、IP Addressによる制限を受けなくする
- Docker hub以外のレポジトリからImageのダウンロードをする
- Code BuildをVPC内で実行して、共用のグローバルIPを利用しないようにする
Docker hub にアカウントを作成し、ログインすることも検討しましたが、
Imageのダウンロード制限について意識しなくても良くなるようにしたかったため、2の方法を採用しました。
ちょうど AWS ECR Publicで公開されているImageを利用予定だったため、AWS ECR Publicをレポジトリとして選択しました。
Amazon ECR Public Galleryで見つけたいImageを探すことができます。
おわりに
reInvent2021で発表されたようにDocker オフィシャルイメージがECR Publicに対応したので、今回紹介する対応方法での対応ケースが増えるのではないかと思っています。
みなさまのお役に立てると嬉しいです。
Discussion