하나의 CodePipeline 프로젝트에서 여러 ECS 서비스 배포

개요



CodePipeline에서 하나의 프로젝트에서 여러 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.json 또는 service2_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 배포의 흐름은 매우 편리하다고 생각했습니다

    좋은 웹페이지 즐겨찾기