CodeBuildでCodeCommitからコンテナイメージをビルドしてECRにプッシュする

こちらを参考にやっていきます。


CodeCommit

リポジトリの作成

以前の記事で書いたので割愛します。

ビルド資源をプッシュ

ビルドするNginxコンテナ定義のDockerfileとそこでホストする適当なindex.html。
FROM amazonlinux:2
RUN amazon-linux-extras install nginx1 -y
ADD ./index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
及びCodeBuildのビルド定義になるbuildspec.ymlを作成してCodeCommitにプッシュします。
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
#      - REPOSITORY_URI=012345678910.dkr.ecr.us-east-1.amazonaws.com/hello-world
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=build-$(echo $CODEBUILD_BUILD_ID | awk -F":" '{print $2}')
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
#      - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json
#  artifacts:
#    files:
#      - imageDetail.json

ECR

リポジトリの作成

CodeBuildのプッシュ先になるリポジトリ(コンテナレジストリ)をECRに作成します。

CodeBuild

ビルドプロジェクトを作成

CodeBuildでビルドプロジェクトを作成します。
Dockerイメージをビルドする場合は特権を付与します。

また、デフォルトで作成されるサービスロールにはECRへの操作権限がないため付与する必要があります。
ビルドの詳細なログが見えるようにCloudWatch Logsは有効にします。

環境変数を設定

buildspec.ymlに書いた「AWS_DEFAULT_REGION」と「REPOSITORY_URI」を環境変数としてビルドプロジェクトにパラメータ設定します。

作成したビルドプロジェクトの編集⇒環境⇒追加設定からセットできます。
作成したリージョン名とECRのURIをセットします。

ビルドの開始

ビルドプロジェクトから直接ビルドを実行します。
初回はなぜか失敗しましたが二回目回すと成功しました。
ECRにもイメージがプッシュされています。

CodeCommit⇒CodeBuild⇒ECRの流れを理解することができました。
次はさらに発展させて、CodePipelineとCodeDeployでECSにデプロイするところまでやってみたいと思います。