column

コラム

[ECS/Fargate] CI/CDでのバッチジョブ実行基盤 ~2つのCodeBuildステージ~

こんにちは、クラウド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ステージと同様です。

皆さんのお役に立てれば幸いです!

RECOMMEND

おすすめ記事一覧