飽き性の頭の中

【AWS】CodeBuildでECRへDockerイメージを自動プッシュする方法を解説します

【AWS】CodeBuildでECRへDockerイメージを自動プッシュする方法を解説します

tawachan
tawachan

こんにちは、たわです。今回は技術メモです。

今、Kubernetes を使った環境を構築するためにまず Docker イメージが自動でビルドされて Private Registry にプッシュされる状態を整えています。

今回は、AWS を使うので AWS CodeBuild と Amazon ECR を使って Docker イメージの自動ビルドをできるようにしたので、その過程・使い方を書き記します。

いろんな記事を参考にさせていただきましたが、結局公式が一番でした。

Amazon ECR の設定

Amazon ECR のリポジトリを作る

まずは Amazon ECR でリポジトリを作ります。

assets/20191211151431.jpg

リポジトリ作成ボタンを押下して下さい。

リポジトリ名を決める

後でこのリポジトリを参照するために使うので覚えておきましょう。

assets/20191211151602.jpg

AWS CodeBuild を設定

次は AWS CodeBuild 側の設定です。

Amazon CodeBuild のプロジェクトを作成

プロジェクトを作成します。

assets/20191211154248.jpg

ソースは GitHub のリポジトリを指定

今回は GitHub から自動でビルドされていくようにします。AWS の CodeCommit など他の Git 管理サービスからもできます。

assets/20191211151948.jpg

ソースバージョンとしてdockerを指定していますが、これは僕の場合はdockerというブランチを指定したかったからで、masterブランチでよい場合は指定する必要はありません。

プライマリソースのウェブフックイベント

これを設定すると GitHub 上のどのイベントにフックさせてビルドを実行するかを決められます。ご自身の用途に合わせて設定しましょう。

assets/20191211152641.jpg

環境を指定

次のように設定しました。

  • 環境イメージ:マネージド型イメージ
  • OS:Amazon Linux 2
  • ランタイム:Standard
  • イメージ:aws/codebuild/amazonlinux2-x8664-standard:2.0
  • イメージのバージョン:このランタイムバージョンには常に最新のイメージを使用してください
  • 環境タイプ:Linux
  • 特権付与:checked

assets/20191211152904.jpg

特に Build タスク内で Docker のイメージビルドする場合は最後の特権付与が必要なようなので忘れずにチェックしましょう。

サービスロールを指定

ここではサービスロールをおまかせで新規作成しました。後でこのサービスロールに対して変更をするので名前を覚えておきましょう。

assets/20191211153015.jpg

環境変数を設定

CodeBuild 実行時に使用する環境変数を設定します。この環境変数はビルド時に実行する内容を記述するbuildspec.ymlにて使用されます(後で設定)。

IMAGE_REPO_NAMEにはさきほど作成した ECR のリポジトリ名を指定します。

assets/20191211153126.jpg

ロールの権限を更新

次に CodeBuild に付与しているロールを更新します。現状だと ECR にアクセスする権限がないのでそれを付与します。

assets/20191211153435.jpg

ポリシーをアタッチ

上の画像のように、CodeBuild に与えられているロールを探しクリックします。

assets/20191211153645.jpg

そして、上記画像のようにAmazonEC2ContainerRegistryPowerUserを付与します。

buildspec.yml を用意

ビルドしたいリポジトリに設定ファイルを用意します。

   version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
      - AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
      - REPOSITORY_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - echo $IMAGE_REPO_NAME:$IMAGE_TAG
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG -f $DOCKERFILE .
      - echo docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image to $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG ...
      - DOCKER_URL=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker push $DOCKER_URL

Docker イメージのタグには以下を参考にして Git のコミット ID を付与することにしています。

CodeBuild で Docker イメージに Git のコミット ID をタグ付けてバージョン管理する | Developers.IO

一部環境変数は CodeBuild の GUI 側で設定されている点に注意しましょう。

ビルドを実行

さきほどすでに GitHub 上で変更を検知して自動ビルドが走るようになっているので、buildspec.ymlをプッシュすれば自動でビルドが始まるはずです。

そうでない場合は、CodeBuild の画面上でビルドを実行しましょう。うまく行けば、ECR 上にイメージが置かれているはずです。

assets/20191211154612.jpg

まとめ

これでとりあえず GitHub へのプッシュをトリガーに Docker イメージが自動でビルドされるフローは整うはずです。引き続きやった作業の備忘録的にメモをしていこうと思います。

ちなみに、セキュリティ等は適当なので、そのあたりは別途検討したほうがいいかもしれません。

関連記事