CodeCatalystのworkflowを用いて、ECS(Fargate)へのCICD環境を構築しよう!
おはようございます!ベンジャミンの木村です!
今回、CodeCatalystのworkflowを使ってECSへビルド&デプロイを実行するCICD環境を作っていきたいと思います!
※今回はCodeCatalystのworkflowについて記載させていただきます。メインの話ではないECS(Fargate)やCodeDeployなどは手順の記載は致しませんが、詳しい手順に関しては参考リンクを添付させていただきます。

目次
- 手順
- 1. 前準備
- 2. CodeCatalystへIAMロールを付与する
- 3. Environmentの設定
- 4. CodeCatalystのビルドステージを作成する
- 5. CodeCatalystのデプロイステージを作成する
- 6. workflowを実行し、デプロイが成功するか確認する
- まとめ
手順
今回は以下のようにサンプルコードを提供させていただきます。
コードの内容はECSコンテナができると、 ALB→ECS(Nginxコンテナ)経由でHTMLをブラウザに表示するものとなっています。成功すればブラウザに「Hello, Docker Nginx!」と表示されるでしょう!
自分でコードを準備してworkflowの作成をしてみてもOKです!
1. 前準備
前準備の手順については、今回のメインではございませんので、いくつか参考記事を記載させていただきます。ご了承ください。
1-1. CodeCatalystのリポジトリを準備する
こちらは、以前記述した以下記事を参考にしていただけますと幸いです。
リポジトリを作成したら、先ほど提示した下記コードをリポジトリにpushしてください。
※タスク定義は作成したIAMロールやタスク定義名に合わせて修正してください。
1-2. VPCを作成する
こちらは、下記記事が大変わかりやすかったので、こちらをご参照くださいますと幸いです。
https://dev.classmethod.jp/articles/vpc-beginner-2023
1-3. セキュリティグループを作成する
こちらはAWS公式の手順をご確認ください。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/creating-security-groups.html
設定値については下記の通り作成してください。
- ALB用セキュリティグループ
- Name:任意の名前 例)bjm-kim-alb-sg
- インバウンドルール:
- HTTP (TCP 80):
- ソース:
0.0.0.0/0
- ソース:
- HTTP (TCP 80):
- アウトバウンドルール:
- アプリケーション用ポート (TCP 80):
- ターゲット:ECS用セキュリティグループ
- アプリケーション用ポート (TCP 80):
- ECS用セキュリティグループ
- Name:任意の名前 例)bjm-kim-ecs-sg
- インバウンドルール:
- アプリケーション用ポート (TCP 80):
- ソース:ALB用セキュリティグループ
- アプリケーション用ポート (TCP 80):
- アウトバウンドルール:
- 全トラフィック (全ポート/プロトコル):
- ターゲット:
0.0.0.0/0
- ターゲット:
- 全トラフィック (全ポート/プロトコル):
1-4. ターゲットグループ/ALBを作成する
こちらはAWS公式の手順をご確認ください。
1-5. ECRを作成する
こちらはAWS公式の手順をご確認ください。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/repository-create.html
1-6. ALB/CodeDeploy/ECS(Fargate)を作成する
こちらは、下記記事が大変わかりやすかったので、こちらをご参照くださいますと幸いです。
https://dev.classmethod.jp/articles/blue-green-deployment-for-ecs-fargate-using-codedeploy
1-7. CloudWatch Logsを作成する
ECSのログを格納するロググループになります。必要あれば作成してください
手順は以下AWS公式の手順をご確認ください。
2. CodeCatalystへIAMロールを付与する
CodeCatalystからアカウント内のリソースへの操作を可能にするためにIAMロールを作成します。
2-1. 以下URLよりAWSアカウント内のCodeCatalystのコンソール画面へ移動する
https://us-west-2.console.aws.amazon.com/codecatalyst/home?region=us-west-2#
2-2. 左ペインより「spaces」→「1-1で作成したSpace」をクリックする

2-3. 「Add IAM role」をクリックする

2-4. 以下の設定で「Create development role」をクリックする
- Create CodeCatalyst development administrator role in IAMを選択する
- Role name:任意の名前

2-5. IAM roles available to CodeCatalyst に作成したIAMロールが付与されていれば完了

3. Environmentsの設定
CodeCatalyst workflowに対して「どのアカウントへデプロイするのか?」また、「どのIAMロールを使ってデプロイするのか?」を指定するため、Environmentsというものを設定します。
3-1. 「Go to Amazon CodeCatalyst」からBuilder IDのCodeCatalystの画面へ移動する

3-2. 項番1-1で作成したプロジェクト名をクリックする

3-3. 左ペインより「CI/CD」→「Environments」→「Create environment」をクリックする

3-4. 以下の通り設定し、「Create environment」をクリックする
- Environment name:任意の名前
- AWS account connection:紐付けるアカウントID
- Default IAM role:項番2で作成したIAMロール
※Environment typeがNon-productionなのはテスト環境のためです。

3-5. Environmentの作成が確認できれば完了

4. CodeCatalystのビルドステージを作成する
4-1. 左ペインより「CI/CD」→「Workflows」→「Create workflow」ボタンをクリックする

4-2. 1-1.で作成したワークフローで使用する「Source repository」、「Branch」を指定する

4-3 「Action」→「Build」の「+」ボタンをクリックする

4-4. 「Inputs」タブの内容は、Buildに必要な環境変数を設定する
※設定している環境変数については下の値をご確認ください
※その他はデフォルトの設定のままにする
- AWS_ACCOUNT_ID:AWSのアカウントID
- REGION:ap-northeast-1(AWSリージョン)
- ENV:dev(環境)

4-5. 「Configuration」タブに移動し、以下の通り値を入力する。
- Compute type:EC2
- Compute fleet:Linux.Arm64.Large
- Environment:項番3で作成したEnvironmentを指定する
- Shell commands:ビルドに必要なshell commandを入力する。
※コマンドは以下を「ビルドコマンド」のプルダウンをクリックして確認ください
ビルドコマンド
Run: docker --version
Run: |-
REPO_NGINX="${AWS_ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/test-nginx"
IMAGE_TAG=$(echo ${WorkflowSource.CommitId} | cut -c 1-7)
TAG="${ENV}-${IMAGE_TAG}"
aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com
Run: |-
docker build -f ./web/Dockerfile -t src_nginx:latest ./web
docker tag src_nginx:latest ${REPO_NGINX}:${ENV}-${IMAGE_TAG}
docker tag src_nginx:latest ${REPO_NGINX}:latest
docker images
Run: |-
echo Build completed on date
echo Pushing the Docker images…
docker push ${REPO_NGINX}:${ENV}-${IMAGE_TAG}
docker push ${REPO_NGINX}:latest
sed -i -e "s##${AWS_ACCOUNT_ID}#g" taskdef.json
sed -i -e "s##${REGION}#g" taskdef.json
sed -i -e "s##${ENV}#g" taskdef.json
if [ ${ENV} == "prod" ]; then
sed -i -e "s##1024#" taskdef.json
else
sed -i -e "s##256#" taskdef.json
fi
if [ ${ENV} == "prod" ]; then
sed -i -e "s##2048#" taskdef.json
else
sed -i -e "s##512#" taskdef.json
fi
cat taskdef.json
※RUN |-
を区切っているのはCodeBuildのbuildspec.ymlのpre_build(ビルドの前準備)、build(ビルド設定)、post_build(ビルド後の設定)に合わせています。

4-6. 「Outputs」タブに移動し、以下の通り値を入力する
- Build artifact name:BuildArtifacts
- Files produced by build:改行も含め以下のように入力
- appspec.yml
taskdef.json
- appspec.yml
- Automatically discover reports:オフ

4-7. 「Commit」ボタンをクリックする

4-8. 値の内容を確認し、「Commit」ボタンをクリックし、完了

5. CodeCatalystのデプロイステージを作成する
5-1. 「Actions」→「Edit」をクリックする

5-2. 「Deploy to Amazon ECS」の「+」ボタンをクリックする

5-3. 「Inputs」タブで、下記の通り値を入力する
- Sources:空白
- Artifacts:「BuildArtifacts」と入力する
- Depends on:項番4で作成したBuildのワークフローを選択する

5-4. 「Configuration」タブに移動し、以下の通り値を入力する
- Compute type:EC2
- Environment:項番3で作成したEnvironmentを指定する
- Region:「Asia Pacific(Tokyo)」を選択する
- Cluster:デプロイするClusterを選択する
- Service:デプロイするServiceを選択する
- Task definition:「taskdef.json」と入力する
- CodeDeploy AppSpec – optional:「appspec.yml」と入力する
- CodeDeploy application:デプロイに使用するCodeDeploy アプリケーション名を入力する
- CodeDeploy deployment group:デプロイに使用するCodeDeploy グループ名を入力する

5-5. 「Commit」ボタンをクリックする

5-6. 値の内容を確認し、「Commit」ボタンをクリックし、完了

6. workflowを実行し、デプロイが成功するか確認する
6-1. フローが全て緑色のチェックがつき、問題なく進行することを確認する

6-2. ECSに最新のタスクがデプロイされていることを確認できればOK

6-3. ECSが紐づくALBのDNSも確認し、Nginx経由でHTMLが表示されれば完了


まとめ
いかがでしょうか?
今回CodeCatalystのworkflowでECSにビルド/デプロイする手順を紹介させていただきました。
お客様からAWSにコードを閉じたいという要望が今後も出てくると思いますので、CodeCatalystをリポジトリに使い、workflowでCICDを構築する際はぜひ参考にしていただけますと幸いです。