ECS CodePipeline 설정(블루/그린)

안녕하세요. 오늘은 베스핀글로벌 D&A실 김동규 님이 작성해 주신 ECS CodePipeline 설정(블루/그린)에 대해 알아보겠습니다. 쉽게 따라하실 수 있게 되어있으니 끝까지 읽어주세요!

궁금하신 부분은 언제든 댓글을 달아주세요 🙂

1. 사전 준비 사항

  • ECR : Docker Image 를 push할 저장소가 사전에 구성되어 있어야 합니다.
  • ECS : 클러스터, 태스크(작업정의), 서비스(블루/그린) 등 배포 대상이 구성되어 있어야 합니다.
  • S3 : 아티팩트 저장용 S3 Bucket 생성 및 접근 설정이 필요합니다.

2. 배포 구성

  • CodeBuild : 블루/그린 배포에서는 파이프라인 작동시 기본 생성되는 imagedetail.json 파일을 그대로 사용하며Docker Image 생성 및 push 는 Github에서 이뤄지므로  CodeBuild 과정 자체가 생략됩니다.
  • CodePipeline : ECR에 Docker Image가 push 될 때 또는 CodeCommit에 taskdef.json, appspec.yaml 이 푸쉬될 때 이벤트를 받아 파이프라인이 작동하며 ECS에 신규 버전을 배포하게 됩니다.

3. Blue / Green 배포 개념

중요 가이드

https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html

https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/file-reference.html#file-reference-ecs-bluegreen

4. CodePipeline 설정

  • 파이프라인 이름을 정하고 서비스역할은 처음에는 생성, 이미 만들어져 있을 경우 기존 서비스 역할을 선택합니다.

4-1. CodePipeline 설정 (고급설정)

  • 파이프라인 동작시 아티팩트가 저장될 S3 버킷을 설정합니다.
  • 기본 위치일 경우 새로운 S3 버킷이생성되며 별도로 관리하고 싶으면 수동으로 기생성된 S3 버킷을 선택합니다.

4-2. 소스 스테이지(CodeCommit)

  • CodeCommit에 appspec.yaml및 taskdef.json푸쉬해 두어야 합니다.

4-3. 배포 스테이지

  • 배포 공급자는 Amazon ECS(Blue/Green)를 선택합니다.

4-4. 배포 스테이지

  • 블루/그린 서비스 배포시 사용된 애플리케이션, 배포그룹을 선택하고 나머지는 기본 구성으로 둡니다.

파이프라인을 우선 생성한 뒤 ECR 소스 스테이지를 추가하고 배포 스테이지를 수정해야 합니다

4-5. 소스 스테이지 추가

  • 파이프라인 생성 후 편집 – 스테이지 편집에서 추가 작업으로 진행

4-6. 소스 스테이지(ECR) 추가

  • 파이프라인 생성 후 편집에서 추가 작업으로 다음을 진행합니다.
  • 소스 공급자 이름, ECR, 리포지토리 선택, 이미지 태그는 latest, 출력 아티팩트 입력 후 다음을 클릭합니다.

4-7. 배포 스테이지 수정

  • 입력 아티팩트에서 앞서 추가한 소스 스테이지 내용 추가한다. 이후 파이프라인 작동은 표준배포(롤링)과 동일합니다.

# 별첨 – taskdef.json

  • taskdef.json
  • 점선 아래부터 문구를 그대로 복사합니다.  Task 정의에서 꼭 필요한 부분만 가져와서 편집하면 됩니다.

————————————-

{

    “executionRoleArn”: “arn:aws:iam::911781XXXXXX:role/ecsTaskExecutionRole”,

    “containerDefinitions”: [{

      “name”: “hello-world”,

      “image”: “<IMAGE1_NAME>“,

      “essential”: true,

      “portMappings”: [{

        “hostPort”: 80,

        “protocol”: “tcp”,

        “containerPort”: 80

      }]

    }],

    “requiresCompatibilities”: [

      “FARGATE”

    ],

    “networkMode”: “awsvpc”,

    “cpu”: “256”,

    “memory”: “512”,

    “family”: “hello-world”

}

# 별첨 – appspec.yaml

  • appspec.yaml
  • 점선 아래부터 문구를 그대로 복사합니다.

————————————-

version: 0.0

Resources:

  – TargetService:

      Type: AWS::ECS::Service

      Properties:

        TaskDefinition: <TASK_DEFINITION>

        LoadBalancerInfo:

            ContainerName: “hello-world”

            ContainerPort: 80

# 별첨 – 빌드 프로젝트 생성(Codebuild에서 블루/그린 도커 빌드할 경우)

감사합니다~ 🙂

문의: info@bespinglobal.com | 대표번호: 02-1668-1280

Leave a Comment