AWSでのCI/CD環境構築

AWSにおけるCI/CDの構築方法

AWSにてCICD環境を構築する際、以下の三つのシステムを利用することになる

  • AWS Code Build
  • AWS Code Deploy
    • サービスのデプロイを担当する。EC2やFargateなど様々なタイプをサポートしている。
    • デプロイとは「配置する」という意味。buildだけではソースコードコンパイルしかできず、CodeDeployを用いることで開発環境/本番環境へのリリースが可能となる。
    • Blue/Greenデプロイも可能
    • 以前のリビジョンを再デプロイすることで、ロールバックも可能
  • AWS Code pipline
    • CodeCommit,S3のソースの変更から、Codebuild,CodeDeployの起動のフローを定義することができる。

CICD環境構築

全体のCICD環境の構成は以下の通り。

  1. 開発者がソースコードをpush
  2. Codepiplineが変更を検知し、CICDがスタート
  3. codebuild, codedeployを経由してecsへリリース

blue greenデプロイとは

通常のデプロイだと、新アプリケーションのデプロイ時、アプリケーションサーバーの停止時にリリースしなければならない。

しかし、blue/greenデプロイメントによって、ユーザーの利用停止期間なしで新環境が利用できる。

  • ここでのblueとは、旧環境のこと
  • ここでのgreenとは、新環境のこと
  • Code Deployはgreen環境に対してリリースを行った後、Elastic Load Blancerに対してgreen環境に向き先を変更するようリクエストを出す。
  • 旧環境はロールバックのために一定期間存在する。

CI/CD環境詳細

CI/CDを束ねるCodepiplineは、gitのpushからリリースまでの各段階をステージと呼んでいる

  1. Codecommitへpushする。
  2. pushの際には以下4つのファイルが必要。これら4ファイルをBuildアーティファクトと呼ぶ。これらのファイルはCodePiplineのソースステージにてS3へ格納される。
    • Dockerfile : コンテナの定義で使用
    • buildspec.yml : build時のlinuxコマンドをまとめたもの。
    • appspec.yml : codedeployのサービスで使用。deploy対象のリソースを、どこでどのように使用するのかを明記する。
    • taskdef.json : タスク定義ファイル。ecsで使用するタスク定義(どのレベルのリソースでfargateを動かすのか)を明記する。
  3. Codebuildの際、imageDetail.jsonが作成される(これはCode Deployにて使用される)

環境作成手順

Codecommitを作成

まずはソースコードを入れる器のCodeCommitリポジトリを作成しましょう。 作成後はリポジトリに対してソースをpushして中身が反映したか確認してみます。

buildアーティファクトの作成

ビルド定義buildspec.ymlの作成

ここではソースコードの取得とdockerによるイメージのbuildを行い、ecrへpushする処理をする。

また、artifactsとして、imageDetails.jsonを指定している。

version: 0.2
phases:
  pre_build:
    commands:
      - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
      - REPOSITORY_URI=各自ご自身のURIに置き換えてください!
      - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)

  build:
    commands:
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG

  post_build:
    commands:
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - printf '{"Version":"1.0","ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json
  
artifacts:
    files: imageDetail.json

imageDetails.jsonpost_buildにて作成されているのが分かるだろうか。後続のCodeDeployはimageDetails.jsonを参照して必要なECRを参照する。

{"Version":"1.0","ImageURI":"repository_url:latest"}

デプロイ定義appspec.ymlについて

このコードはコードデプロイがデプロイを管理するために使用するファイル。 ecsのタスク定義やロードバランサーの情報を含めている。

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "<TASK_DEFINITION>"
        LoadBalancerInfo:
            ContainerName: "各自ご自身のコンテナ名に置き換えてください!"
            ContainerPort: "80"

ContainerNameはecsのタスク定義配下に存在する。

タスク定義ファイルtaskdef.json

AWSのコンソール画面のecsのタスク定義のJsonから確認する。 「jsonファイルのダウンロード」「jsonファイルのコピー」を使用する。 このファイルはビルド定義、タスク定義と同様の階層に配置すること。

また、次のような修正が必要となる。

  • 名前はtaskdef.jsonに変える
  • imageは修正する必要がある → 動的にイメージのuriを置き換えること。具体的には次のように置き換える
"image" : "<IMAGE1_NAME>"

このように置き換えを行うことで、ビルドのアクションのたびにイメージは最新版になる。

どこに置くべきか

これらのファイルもCodecommitでソース管理する必要がある。 上記の修正を行った後は、必ずリリースすること。

blue/green deploy用のecsを作成する

ロードバランサ

blue/greenデプロイ用のロードバランサーを用意する必要があるが、 新規画面ではblue/greenデプロイ用のロードバランサーを作成できない。

ターゲットグループは二つ作る。

ECS

  • クラスターの「サービスの作成」を押下
  • 起動タイプはFargate
  • タスク定義等はそのままで
  • デプロイメントの方法はBlue/Greenアップデートを選択する。

ビルド定義