AWS CodeBuild上でdocker pull時のエラ「You have reached your pull rate limit」をAWS ECRを使って回避する


初めに

本記事は Fusic Advent Calendar 2020 の18日目の記事です。

紹介する内容

  • AWS Codebuild上でdocker pullしすぎるとでるエラを回避する方法を提案します
    • AWSのCodeBuildとECRを触った経験ある方は読みやすいと思います

結論

AWS Codebuild上でECRに対してpullしてみてもし、ダメだったらDocker HubからpullしてECRにpushする

  • You have reached your pull rate limit はdocker pullの回数制限が厳しくなったことが原因です。pull先をECRに変えたら回数制限を気にしなくていいことに注目しました
    • ECRにimageかあるか? → もしないなら、Docker Hubからpullする → Docker HubからpullされたimageのtagをECRで使う予定のtag名に変更する → ECRで使う予定のtag名に変更できたらimageをECRにpushする
    • 最初の一回だけはDocker Hubからpullします
    • 二回目からはECRにimageがあるから、Docker Hubからpullしなくてよくなります

紹介始めます

まずはエラ画面です

Codebuildのbuildspec.yamlです

pre_buildフェーズとbuildフェーズが話したい部分です。

version: 0.2

phases:
  install:
    runtime-versions:
      ruby: 2.7

  # ECRへのログイン、ECRへのpushとpullに利用する変数定義
  pre_build:
    commands:
      - $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
      - AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
      - ECR_REPOSITORY_NAME=nomorelimit
      - WEB_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY_NAME}

  # ECRに欲しいdocker image(ECR_RUBY_URI)がないなら、Docker HubからpullしてECRにpushする
  build:
    commands:
      - ECR_RUBY_URI=$WEB_URI:ruby-2.7.1-slim
      - DOCKER_RUBY_URI=ruby:2.7.1-slim
      - docker pull $ECR_RUBY_URI || (docker pull $DOCKER_RUBY_URI && docker tag $DOCKER_RUBY_URI $ECR_RUBY_URI && docker push $ECR_RUBY_URI && true)

pre_buildフェーズ詳しく説明

  • 1行目:ECRにログインする部分です
  • 2行目、3行目:既に作られているECRのリポジトリURIを文字列で組み合わせるために取得しました
  • 4行目:既に作られているECRのリポジトリURIを文字列組み合わせ完成させた変数です

buildフェーズ詳しく説明

  • 1行目:ECRで使いまわすdocker imageのtag名を含むURIを ECR_RUBY_URI にします
  • 2行目:Docker Hubからpullするdocker imageの原本tag名を含むURIを DOCKER_RUBY_URI にします
  • 3行目:
    • ECRからpullを試します docker pull $ECR_RUBY_URI || …
    • もし、ダメだったら、Docker Hubからpullします || (docker pull $DOCKER_RUBY_URI …)
    • Docker Hubからpullが成功したら、そのdocker imageをECRで使い回す予定だったtag名 $ECR_RUBY_URI に変えます (… && docker tag $DOCKER_RUBY_URI $ECR_RUBY_URI …)
    • ECRで使い回す予定でるtag名 $ECR_RUBY_URI をECRにpushします (… && docker push $ECR_RUBY_URI && true)

Dockerfileへの活用(ボーナス)

ECRのURIをDockerfileのFROMで動的に使えます。
dockerのARGを使って上で話した ECR_RUBY_URI を渡すことになります。

  • CodeBuild上で実行するコマンド
    docker build --build-arg ECR_RUBY_URI=$ECR_RUBY_URI --file ファイルが/ある/パス/Dockerfile .

  • CodeBuildと連携する予定のDockerfileの中身

ARG ECR_RUBY_URI

FROM $ECR_RUBY_URI
# FROM ruby:2.7.1-slim

…