CodeCommit 側の変更から Fargate へのデプロイまでを自動化する

March 18, 2019

今回やること

LogChance への変更を git push で実施した際に、そのまま自動で ECR のイメージ Push 、また Fargate タスクのデプロイまで自動化してしまおうということです。
実際には以下のような流れになります。

  1. git push により CodeCommit リポジトリ内に変更が生じる
  2. これがトリガーとなり、CodePipeline がデリバリを開始する
  3. CodeBuild が Push された Dockerfile からイメージをビルドし、ECR にプッシュする
  4. 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 の設定を行う。
以下の手順に従う。

  1. [パイプラインを作成する] からパイプラインの作成

f:id:shiro_kochi:2018××××××××:plain:w100:left

  1. ソースプロバイダーを AWS CodeCommit として、レポジトリとブランチを設定

f:id:shiro_kochi:2018××××××××:plain:w100:left

  1. ビルドステージの設定ではプロバイダーを CodeBuild とし、ビルドプロジェクトは新規で作成する

f:id:shiro_kochi:2018××××××××:plain:w100:left

  1. CodeBuild 側の設定 (ビルドプロジェクト)

f:id:shiro_kochi:2018××××××××:plain:w100:left

  1. CodeBuild 用の IAM ロールにアタッチされているポリシーに対して ECR へのアクセス権を付与する
  2. CodeBuild 側で作成したプロジェクトを開いて、buildspec.yml 側で参照している環境変数を適宜設定する

f:id:shiro_kochi:2018××××××××:plain:w100:left

  1. 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 され、デプロイが完了したことがわかる。

f:id:shiro_kochi:2018××××××××:plain:w100:left

f:id:shiro_kochi:2018××××××××:plain:w100:left

f:id:shiro_kochi:2018××××××××:plain:w100:left


 © 2023, Dealing with Ambiguity