AWSにおけるCI/CDの構築方法
AWSにてCICD環境を構築する際、以下の三つのシステムを利用することになる
- AWS Code Build
- AWS Code Deploy
- AWS Code pipline
- CodeCommit,S3のソースの変更から、Codebuild,CodeDeployの起動のフローを定義することができる。
CICD環境構築
全体のCICD環境の構成は以下の通り。
- 開発者がソースコードをpush
- Codepiplineが変更を検知し、CICDがスタート
- codebuild, codedeployを経由してecsへリリース
blue greenデプロイとは
通常のデプロイだと、新アプリケーションのデプロイ時、アプリケーションサーバーの停止時にリリースしなければならない。
しかし、blue/greenデプロイメントによって、ユーザーの利用停止期間なしで新環境が利用できる。
- ここでのblueとは、旧環境のこと
- ここでのgreenとは、新環境のこと
- Code Deployはgreen環境に対してリリースを行った後、Elastic Load Blancerに対してgreen環境に向き先を変更するようリクエストを出す。
- 旧環境はロールバックのために一定期間存在する。
CI/CD環境詳細
CI/CDを束ねるCodepiplineは、gitのpushからリリースまでの各段階をステージと呼んでいる
- Codecommitへpushする。
- pushの際には以下4つのファイルが必要。これら4ファイルをBuildアーティファクトと呼ぶ。これらのファイルはCodePiplineのソースステージにてS3へ格納される。
Dockerfile
: コンテナの定義で使用buildspec.yml
: build時のlinuxコマンドをまとめたもの。appspec.yml
: codedeployのサービスで使用。deploy対象のリソースを、どこでどのように使用するのかを明記する。taskdef.json
: タスク定義ファイル。ecsで使用するタスク定義(どのレベルのリソースでfargateを動かすのか)を明記する。
- 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.jsonはpost_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アップデートを選択する。