【AWS】CodeBuildでECRへDockerイメージを自動プッシュする方法を解説します
Table Of Contents
こんにちは、たわです。今回は技術メモです。
今、Kubernetes を使った環境を構築するためにまず Docker イメージが自動でビルドされて Private Registry にプッシュされる状態を整えています。
今回は、AWS を使うので AWS CodeBuild と Amazon ECR を使って Docker イメージの自動ビルドをできるようにしたので、その過程・使い方を書き記します。
いろんな記事を参考にさせていただきましたが、結局公式が一番でした。
Amazon ECR の設定
Amazon ECR のリポジトリを作る
まずは Amazon ECR でリポジトリを作ります。
リポジトリ作成ボタンを押下して下さい。
リポジトリ名を決める
後でこのリポジトリを参照するために使うので覚えておきましょう。
AWS CodeBuild を設定
次は AWS CodeBuild 側の設定です。
Amazon CodeBuild のプロジェクトを作成
プロジェクトを作成します。
ソースは GitHub のリポジトリを指定
今回は GitHub から自動でビルドされていくようにします。AWS の CodeCommit など他の Git 管理サービスからもできます。
ソースバージョンとしてdocker
を指定していますが、これは僕の場合はdocker
というブランチを指定したかったからで、master
ブランチでよい場合は指定する必要はありません。
プライマリソースのウェブフックイベント
これを設定すると GitHub 上のどのイベントにフックさせてビルドを実行するかを決められます。ご自身の用途に合わせて設定しましょう。
環境を指定
次のように設定しました。
- 環境イメージ:
マネージド型イメージ
- OS:
Amazon Linux 2
- ランタイム:
Standard
- イメージ:
aws/codebuild/amazonlinux2-x8664-standard:2.0
- イメージのバージョン:
このランタイムバージョンには常に最新のイメージを使用してください
- 環境タイプ:
Linux
- 特権付与:checked
特に Build タスク内で Docker のイメージビルドする場合は最後の特権付与が必要なようなので忘れずにチェックしましょう。
サービスロールを指定
ここではサービスロールをおまかせで新規作成しました。後でこのサービスロールに対して変更をするので名前を覚えておきましょう。
環境変数を設定
CodeBuild 実行時に使用する環境変数を設定します。この環境変数はビルド時に実行する内容を記述するbuildspec.yml
にて使用されます(後で設定)。
IMAGE_REPO_NAME
にはさきほど作成した ECR のリポジトリ名を指定します。
ロールの権限を更新
次に CodeBuild に付与しているロールを更新します。現状だと ECR にアクセスする権限がないのでそれを付与します。
ポリシーをアタッチ
上の画像のように、CodeBuild に与えられているロールを探しクリックします。
そして、上記画像のように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 上にイメージが置かれているはずです。
まとめ
これでとりあえず GitHub へのプッシュをトリガーに Docker イメージが自動でビルドされるフローは整うはずです。引き続きやった作業の備忘録的にメモをしていこうと思います。
ちなみに、セキュリティ等は適当なので、そのあたりは別途検討したほうがいいかもしれません。