DockerHubのPull制限による障害対策!

最近、DockerHubからのPullが制限されるようになりましたね。
かなり影響の大きな制限になります。
この影響により
デプロイ時にイメージをPullできなくてサービスがダウンする
という障害が起こるようになりました。
このような障害を起こさないためにも対策を行っておきましょう!

基本的にECR使ってるから大丈夫!
と思っている方も意外と見落としてる部分もあるので確認しておきましょう!
確認ポイント!
まずはどのような構成となっているか確認しましょう。
私の場合、
- ECRのイメージ × 2
- X-Ray
という構成になっていました。
X-Rayは盲点でしたね。
この場合、X-RayがDocker HubからのPullされていることになります。
X-Rayは最悪ダウンしても動作すると思うのですが、これがRedisとかnginxとかだったら停止してますね。
構築時にしか触らない箇所だと思うので今一度確認してみてください。
対応方法
対応としては、DockerHubのイメージをECRにコピーしておきます。
今回はローカルからECRへイメージをPushします。
準備
以下の準備をしておく必要があります。
- AmazonEC2ContainerRegistryPowerUserポリシーが付与されたIAM
- aws-cli
- Docker
- ECRリポジトリ
ECRからPush, Pullするときに必要なものと同じなので詳しい説明は割愛します。
ECRリポジトリ名は公式と同様に「aws-xray-daemon」としておきました。
ちなみにバージョン情報はこんな感じ。
$ aws --version
aws-cli/2.0.46 Python/3.7.4 Darwin/19.6.0 exe/x86_64
$ docker -v
Docker version 20.10.0, build 7287ab3
Docker HubからローカルにPull
基本中の基本だけどX-Rayの場合はこんな感じでPullできます。
各イメージの公式ページへ行けば、コマンドそのまま載ってます。
$ docker pull amazon/aws-xray-daemon
Using default tag: latest
latest: Pulling from amazon/aws-xray-daemon
37373184fe69: Pull complete
1d94ca29cb22: Pull complete
10264906adab: Pull complete
4858f0065c2b: Pull complete
Digest: sha256:972e3db3912e272d6b178d029b4a91628b753dad9906752e009bb851b5e3748f
Status: Downloaded newer image for amazon/aws-xray-daemon:latest
docker.io/amazon/aws-xray-daemon:latest
ローカルからECRにPush
まずはログイン。
XXXXXXXXXXにはアカウントIDを入れてください。
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
そしてタグ付けからのPush。
$ docker tag amazon/aws-xray-daemon XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/aws-xray-daemon:latest
$ docker push XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/aws-xray-daemon:latest
The push refers to repository [XXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/aws-xray-daemon]
0b5155003a16: Pushed
409ff2d8efee: Pushed
29186ada293a: Pushed
50c3cd231426: Pushed
latest: digest: ... size: 1163
これでECRに反映されていると思います。
イメージの取得先変更
あとはDocker Hubから取得しようとしている箇所をECRに変更するだけです。
ECSの場合はタスク定義になると思います。
私はCloudFormationを利用しているので、この場合はTaskDefinitionですね。
ECR利用している部分を真似るだけなのでこちらも割愛します。
あとがき
X-Rayは影薄いのですっかり忘れてました(笑)
Redis, nginxを使ってる人は注意です。
GitHub ActionsとかCodeBuildとかでも制限に引っかかる可能性があるのでそのあたりも注意したいですね。
こちらの場合はDocker Hubへのログイン処理を挟めば大丈夫そうです。
使ってないと思っていても念の為、確認してみるのをおすすめします。