コラム
こんにちは、クラウドCoEの熊谷です。
Fargateではタスクスケジュールを設定することで、所定の時間にECSタスク(コンテナ)を実行することができます。
今回はCodeBuildにフォーカスをあてて、新しいバッチアプリのバージョンをデプロイする際に必要な2つのCodeBuildステージについて解説します。
CI/CD構成図の例
各ステージの設定
CodePipelineは複数のステージで構成されます。
ステージ名は任意の名前を設定できます。
「Source」ステージ・「Build」ステージ・「Deploy」ステージという風にステージを分け、それぞれのステージでユーザのやりたいことにそって適切なAWSサービスを選択します。
今回の構成で利用するステージについて解説します。
「Source」ステージ CodeCommit
CodeCommitを利用してDockerfileやその他のソースを管理します。
CodeCommitはAWSのリポジトリ管理用のマネージドサービスです。EventBridgeと組み合わせることで、CodeCommitで管理したソースの変更イベントをトリガーにその他のAWSサービスを起動する等、自動デプロイの起点とすることが出来ます。
例えば、ブランチへのCodeCommitへのpush通知をトリガーに、CodePipelineを起動させるといった設定が可能です。
今回はこのイベント駆動の設定は説明を省略します。
[Buildステージ](1つめのCodeBuild)
今回はCodePipelineのBuildステージとDeployステージでCodeBuildを利用します。
Buildステージでは、Dockerfileに基づきECRイメージを作成します。
DeployステージではBuildステージで作成したイメージに基づき、ECSタスクを更新します。
まず、1つめのBuildステージのBuildSpec.yamlの定義です。
version: 0.2
phases:
install:
runtime-versions:
java: corretto11
pre_build:
commands:
- echo Logging in to Amazon ECR...
#ECRにログインします
- $(aws ecr get-login --no-include-email)
#CodeBuild組み込み変数(ビルドのソースコードのバージョン★の識別)をECRイメージのタグに指定します
- IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
build:
commands:
- echo Build started on `date`
- echo Building the SpringBoot project...
#CodeBuildで指定した環境変数は${}で受け取り、ビルドします
- ./gradlew :${SUB_PROJECT}:build
#コンテナイメージをビルドします
- cp ./${SUB_PROJECT}/build/libs/${SUB_PROJECT}.jar ./${SUB_PROJECT}/docker
- docker build -t $REPOSITORY_URI:$IMAGE_TAG ./${SUB_PROJECT}/docker
- docker tag $REPOSITORY_URI:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG #タグを付与します
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push $REPOSITORY_URI:$IMAGE_TAG
- echo Writing imageDetail json...
#最新のタスク定義に反映したいECRイメージをjsonで記載します
- echo "[{\"name\":\"${ContainerName}\",\"imageUri\":\"${REPOSITORY_URI}:${IMAGE_TAG}\"}]" > imagedefinitions.json
artifacts:
#ここに記載した成果物がS3に格納されます
files: imagedefinitions.json
discard-paths: yes
※★に設定される項目はCodeCommitからも確認できます
環境変数の設定例です。
[Deployステージ](2つめのCodeBuild)
BuildSpec.yamlの定義です。
version: 0.2
phases:
pre_build:
commands:
#Buildステージで作成したjsonファイルからimageUriの値を取得します
- IMAGE=$(cat imagedefinitions.json | jq -r .[].imageUri)
build:
commands:
- echo Build completed on `date`
- echo describe task definition
# 既存のタスク定義をAWS CLIで取得し、新しいECRイメージで置き換えます。
# このとき、revision・status等の項目があった場合次の新規タスク定義の登録処理でエラーになるので削除します。
- aws ecs describe-task-definition --task-definition $TASK_DEF | jq '.taskDefinition | del (.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities, .registeredAt, .registeredBy)' | jq '(.containerDefinitions[] | select(.name == "'${TASKDEF_CONTAINER_NAME}'")).image = "'${IMAGE}'"' > task-def.json
- aws ecs register-task-definition --cli-input-json fileb://task-def.json
環境変数はBuildステージと同様です。
皆さんのお役に立てれば幸いです!
-
PICK UP
ピックアップ
-
ピックアップコンテンツがありません
-
RANKING
人気の記事
-
-
1
Lambdaのマルチアカウントデプロイ 設計編
Lambdaのマルチアカウントデプロイ 設計編
2021/03/01
-
2
AWS CloudFormationでBlueGr…
AWS CloudFormationでBlueGreenデプロイを実現してみた(…
2019/11/25
-
3
[ECS/Fargate] CI/CDでのバッチジ…
[ECS/Fargate] CI/CDでのバッチジョブ実行基盤 ~2つのCode…
2022/03/28
-
4
Azureのコスト情報をTeamsで通知する方法
Azureのコスト情報をTeamsで通知する方法
2023/06/14
-
5
DevOps、その遙かなる道程(第2回)
DevOps、その遙かなる道程(第2回)
2019/08/30
-
-
ARCHIVE
アーカイブ
-
- January 2024 (1)
- December 2023 (2)
- June 2023 (2)
- May 2023 (1)
- April 2023 (1)
- March 2023 (2)
- February 2023 (2)
- January 2023 (1)
- December 2022 (2)
- October 2022 (2)
- September 2022 (2)
- August 2022 (1)



