コラム
こんにちは、クラウド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
社内システムも、転送データを暗号化した方が良い?と…
社内システムも、転送データを暗号化した方が良い?と聞かれたときの回答
2023/06/12
-
2
EKSのノードオートスケーラーとしてKarpent…
EKSのノードオートスケーラーとしてKarpenterを試す
2022/08/17
-
3
Infrastructure as Codeを理解…
Infrastructure as Codeを理解する(第2回)AWS Clou…
2020/11/27
-
4
Ciliumを使ってマルチクラウドのKuberne…
Ciliumを使ってマルチクラウドのKubernetes間でService Di…
2024/07/25
-
5
望雲彼方に ~クラウド移行その2(インフラエンジニ…
望雲彼方に ~クラウド移行その2(インフラエンジニア編)~
2020/06/12
-
-
ARCHIVE
アーカイブ
-
- July 2024 (1)
- 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)