10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FusicAdvent Calendar 2020

Day 18

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

Posted at

初めに

本記事は 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しなくてよくなります

紹介始めます

まずはエラ画面です

toomanyrequests_edit.png

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

…
10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?