1つのCodePipelineプロジェクトで複数のECSサービスをデプロイする


概要

CodePipelineで1つのプロジェクトで複数のECSサービスをデプロイするための設定方法に工夫が必要だったのでメモ

ポイント

  • buildspec.ymlのアーティファクトで、デプロイするサービスの数だけのimagedefinitions.jsonを生成する
  • Deployステージのactionを複数作成して、buildspec.ymlに従って生成されたアーティファクトのimagedefinitions.jsonを使用する

buildspec.ymlのアーティファクトで、デプロイするサービスの数だけimagedefinitions.jsonを生成する

buildspec.yml
phases:
 post_build:
   commands:
     - echo Build completed on `date`
     - echo Pushing the Docker images...
     - docker push $SERVICE1_REPOSITORY_URI:$IMAGE_TAG
     - docker push $SERVICE2_REPOSITORY_URI:$IMAGE_TAG
     - echo Writing image definitions file...
     - printf '[{"name":"server","imageUri":"%s"}]' $SERVICE1_REPOSITORY_URI:$IMAGE_TAG > service1_imagedefinitions.json
     - printf '[{"name":"runner","imageUri":"%s"}]' $SERVICE2_REPOSITORY_URI:$IMAGE_TAG > service2_imagedefinitions.json
artifacts:
  files:
    - service1_imagedefinitions.json
    - service2_imagedefinitions.json

Deployステージのactionを複数作成して、buildspec.ymlに従って生成されたアーティファクトのサービス名_imagedefinitions.jsonを使用する

ここで指定するサービス名_imagedefinitions.jsonは、決まってないので好きな名前で名前で良い。
ビルドステージで指定した

       - printf '[{"name":"server","imageUri":"%s"}]' $SERVICE1_REPOSITORY_URI:$IMAGE_TAG > service1_imagedefinitions.json
       - printf '[{"name":"runner","imageUri":"%s"}]' $SERVICE2_REPOSITORY_URI:$IMAGE_TAG > service2_imagedefinitions.json

service1_imagedefinitions.jsonservice2_imagedefinitions.jsonの部分とDeployステージのactionで指定するFileNameが一致していることが大事



Terraform

Terraformでは、FileName の部分にサービス名_imagedefinitions.jsonといったイメージ定義を指定する

  stage {
    name = "Deploy"

    dynamic "action" {
      for_each = var.deploy_actions
      content {
        name            = action.value.name
        category        = action.value.category
        owner           = action.value.owner
        provider        = action.value.provider
        input_artifacts = action.value.input_artifacts
        version         = action.value.version

        configuration = {
          FileName    = "service1_imagedefinitions.json"
          ClusterName = var.cluster_name
          ServiceName = var.service_name
        }

      }
    }

AWS: aws_codepipeline - Terraform by HashiCorp

所感

AWSCode3兄弟は概念がたくさん出現するので混乱しますが、ビルド→ECSデプロイの流れはとても便利だなと思いました