プログラミング学習サイト

プログラミングの学習を開始される方を対象としたプログラミング入門サイトです。

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アップデートを選択する。

ビルド定義