今回やること
LogChance への変更を git push で実施した際に、そのまま自動で ECR のイメージ Push 、また Fargate タスクのデプロイまで自動化してしまおうということです。
実際には以下のような流れになります。
- git push により CodeCommit リポジトリ内に変更が生じる
- これがトリガーとなり、CodePipeline がデリバリを開始する
- CodeBuild が Push された Dockerfile からイメージをビルドし、ECR にプッシュする
- Deploy ステージにより出力された Artifact より Fargate コンテナにアプリケーションをデプロイする
Dockerfile と buildspec.yml の用意
まずは CodeBuild によるビルド時に必要な Dockerfile と buildspec.yml を用意する。
Dockerfile
$ cat Dockerfile
FROM centos:7
MAINTAINER "yuki"
# install apache2.4
RUN yum -y install httpd
# install php5.6
RUN yum -y install epel-release
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum remove php-*
RUN yum -y install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-mysql php-pdo php-gd
RUN yum -y install git
# install the application from CodeCommit repoistory
WORKDIR /root/
RUN mkdir /root/.ssh
ADD ./conf/codecommit* /root/.ssh/
ADD ./conf/config /root/.ssh/
RUN chmod 600 /root/.ssh/*
RUN ssh -o StrictHostKeyChecking=no git-codecommit.us-west-2.amazonaws.com ; git clone ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/LogChance
RUN cp -r /root/LogChance/app/* /var/www/html/
ADD ./conf/10-php.conf /opt/docker/etc/httpd/conf.d/
# enable service
RUN systemctl enable httpd
buildspec.yml
$ cat buildspec.yml
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
- 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...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
- printf '[{"name":"frontend","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json
artifacts:
files: imagedefinitions.json
CodePipeline/CodeBuild の設定
次に CodePipeline の設定を行う。
以下の手順に従う。
- [パイプラインを作成する] からパイプラインの作成
- ソースプロバイダーを AWS CodeCommit として、レポジトリとブランチを設定
- ビルドステージの設定ではプロバイダーを CodeBuild とし、ビルドプロジェクトは新規で作成する
- CodeBuild 側の設定 (ビルドプロジェクト)
- CodeBuild 用の IAM ロールにアタッチされているポリシーに対して ECR へのアクセス権を付与する
- CodeBuild 側で作成したプロジェクトを開いて、buildspec.yml 側で参照している環境変数を適宜設定する
- Deploy ステージの設定で ECS 及びクラスター名等を指定する
実際に Push する
実際に Push してみる。
$ git push origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 397 bytes | 99.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/xxx/LogChance.git
19e79a5..17d39c4 master -> master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 397 bytes | 33.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/LogChance
19e79a5..17d39c4 master -> master
以下のように CodePipeline 及び CodeBuild 側で変更がトリガーとなり ECR にイメージが Push され、デプロイが完了したことがわかる。