CodeCatalystのworkflowを用いて、ECS(Fargate)へのCICD環境を構築しよう!

technologies

おはようございます!ベンジャミンの木村です!

今回、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
    • アウトバウンドルール
      • アプリケーション用ポート (TCP 80):
        • ターゲット:ECS用セキュリティグループ
  • ECS用セキュリティグループ
    • Name:任意の名前 例)bjm-kim-ecs-sg
    • インバウンドルール
      • アプリケーション用ポート (TCP 80):
        • ソース:ALB用セキュリティグループ
    • アウトバウンドルール
      • 全トラフィック (全ポート/プロトコル):
        • ターゲット0.0.0.0/0

1-4. ターゲットグループ/ALBを作成する

こちらはAWS公式の手順をご確認ください。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/create-application-load-balancer.html

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公式の手順をご確認ください。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html

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
  • 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を構築する際はぜひ参考にしていただけますと幸いです。

Related posts