こんにちは、たわです。今回は技術メモです。
今、Kubernetesを使った環境を構築するためにまずDockerイメージが自動でビルドされてPrivate Registryにプッシュされる状態を整えています。
今回は、AWSを使うのでAWS CodeBuildとAmazon ECRを使ってDockerイメージの自動ビルドをできるようにしたので、その過程・使い方を書き記します。
いろんな記事を参考にさせていただきましたが、結局公式が一番でした。
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html
Amazon ECRの設定
Amazon ECRのリポジトリを作る
まずはAmazon ECRでリポジトリを作ります。
リポジトリ作成ボタンを押下して下さい。
リポジトリ名を決める
後でこのリポジトリを参照するために使うので覚えておきましょう。
AWS CodeBuildを設定
次はAWS CodeBuild側の設定です。
Amazon CodeBuildのプロジェクトを作成
プロジェクトを作成します。
ソースはGitHubのリポジトリを指定
今回はGitHubから自動でビルドされていくようにします。AWSのCodeCommitなど他のGit管理サービスからもできます。
ソースバージョンとしてDocker
を指定していますが、これは僕の場合はdocker
というブランチを指定したかったからで、master
ブランチで良い場合は指定する必要はありません。
プライマリソースのウェブフックイベント
これを設定するとGitHub上のどのイベントにフックさせてビルドを実行するかを決められます。ご自身の用途に合わせて設定しましょう。
環境を指定
以下のように設定しました。
- 環境イメージ:
マネージド型イメージ
- オペレーティングシステム:
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イメージが自動でビルドされるフローは整うはずです。引き続きやった作業の備忘録的にメモをしていこうと思います。
ちなみに、セキュリティ等は適当なので、そのあたりは別途検討したほうがいいかもしれません。