티스토리 뷰

AWS CodeDeploy를 사용하여 블루/그린 배포 방식을 적용하기로 했습니다.

 

* 블루/그린 배포

: ECS 에서는 서비스를 생성할때 rolling update 또는 blue/green 방식으로 update 방식을 결정할 수 있다. (서비스 생성 이후에는 수정 불가)

rolling update는 신규 버전의 health check 가 통과하면 이전 버전을 바로 내리기 때문에, rollback 이 필요한 경우 다시한번 서비스 업데이트 과정을 거쳐야하는 문제가 있다. (만약 이전버전의 이미지가 없다면 code build부터 다시해야 한다.) 

반면 블루/그린 업데이트 방식은 이전 버전의 어플리케이션이 구동되어 있는 상태에서 신규버전의 어플리케이션을 함께 구동시킬수 있기 때문에, 트래픽을 신규 버전으로 라우팅 하기전, 새로운 버전으로 테스트할 수 있다. 또한 배포 프로세스를 모니터링 하다가 문제가 발생하면 이전 버전으로 신속하게 롤백이 가능하다.

 

아래에서는 rolling update 와 다른 점만 설명합니다.

 

1. 준비

- ECR에 올릴 도커 이미지

- ECS 클러스터

- ALB 설정 (이름 : sample-website-alb 로 가정)

- 보안그룹 설정

* 모두 동일 리전에 있다고 가정함.

 

2. IAM 서비스 역할 설정

배포 과정 중 codedeploy는 ECS API 호출, 로드밸런서 수정, lambda 함수 호출, cloudwatch 경보 기술 등의 권한이 필요합니다. 따라서 블루/그린 배포를 설정하기 전 IAM 역할 부터 생성합니다.

- IAM 콘솔 이동

- 왼쪽 네비게이션에서 [역할] 선택 후 [역할 만들기] 클릭

- 이 역할을 사용할 서비스 선택에서 CodeDeploy 선택

- 사용사례 선택에서 CodeDeploy-ECS 선택, 다음: 권한 클릭

- 다음: 태그 클릭

- 필요한 경우 태그 추가 후 다음: 검토 클릭

- 역할이름에 ecsCodeDeployRole을 입력하고 설명 입력 후, 역할 생성을 클릭

- 좀 더 자세한 설정이 필요한 경우 다음 링크를 참고합니다.

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/codedeploy_IAM_role.html

 

Amazon ECS CodeDeploy IAM 역할 - Amazon Elastic Container Service

Amazon ECS CodeDeploy IAM 역할 Amazon ECS와 함께 CodeDeploy 블루/그린 배포 유형을 사용하기 전에 CodeDeploy 서비스는 사용자를 대신하여 Amazon ECS 서비스를 업데이트할 수 있는 권한이 필요합니다. 이러한 권한은 CodeDeploy IAM 역할(ecsCodeDeployRole)에 의해 제공됩니다. 참고 IAM 사용자는 CodeDeploy를 사용할 권한도 필요합니다. 이러한 권한은 블루/그린 배포에 필요한

docs.aws.amazon.com

3. application load balancer 에 대상그룹 과 보안그룹 수정

- ALB를 위한 보안그룹 설정에서 inbound에 테스트용 포트를 하나더 추가합니다.

여기서는 80이 서비스 포트, 8080이 테스트 포트라고 가정

- 마찬가지로 대상 그룹도 하나더 추가합니다.

 * 서비스용 대상그룹 : sample-website-tg-1, 테스트 대상그룹: sample-website-tg-2 (주의: 대상 그룹 생성시 ip를 사용하도록 선택해야 합니다.)

- ALB 라우팅 설정에서 테스트용 리스너를 하나더 추가합니다. (포트는 8080, 대상그룹은 prod-web-tg2)

 

4. ECS 신규 서비스 생성

- 기존 작업정의 선택 후 작업 -> 서비스 생성 클릭

  1. [Configure service] 구성하기
    1. [Launch type]으로 [FARGATE]를 선택합니다.
    2. 애플리케이션 작업을 실행할 클러스터를 선택합니다.
    3. [Service Name]에 [Sample-Website]를 입력합니다.
    4. [Number of tasks]에 서비스를 실행할 작업의 수를 지정합니다. (여기서는 2개)
  2. [Deployments] 구성하기
    1. [Deployment type]에서 [Blue/green deployment (powered by AWS CodeDeploy)]를 선택합니다. 그러면 기본 설정을 사용하여 CodeDeploy 애플리케이션 및 배포 그룹이 생성됩니다. 나중에 CodeDeploy 콘솔에서 설정을 확인하고 편집할 수 있습니다.
    2. 서비스 역할은 이전에 생성한 CodeDeploy 서비스 역할을 선택합니다.
  3. [Next step]을 클릭합니다.
  4. [VPC and security groups] 구성하기
    1. [Subnets]에서 서비스에 사용할 서브넷을 선택합니다.
    2. [Security groups]에서 [Edit]를 선택합니다.
      1. [Assigned security groups]에 대해 [Select existing security group]을 선택합니다.
      2. [Existing security groups]에서 이전에 생성한 sample-website-sg 그룹을 선택합니다.
      3. [Save]를 클릭합니다.
  5. [Load Balancing] 구성하기
    1. [Application Load Balancer]를 선택합니다.
    2. [Load balancer name]에 대해 [sample-website-alb]를 선택합니다.
  6. [Container to load balance] 구성하기
    1. [Add to load balancer]를 선택합니다.
    2. [Production listener port]의 첫 번째 드롭다운 목록에서 [80:HTTP]를 선택합니다.
    3. [Test listener port]의 [Enter a listener port]에 [8080]을 입력합니다.
  7. [Additional configuration] 구성
    1. [Target group 1 name]에서 [sample-website-tg-1]을 선택합니다.
    2. [Target group 2 name]에 [sample-website-tg-2]를 입력합니다.
  8. [Service discovery (optional)]에서 [Enable service discovery integration]의 선택을 취소한 후 [Next step]을 선택합니다.
  9. Auto Scaling을 구성하지 마세요. [Next step]을 클릭합니다.
  10. 서비스의 정확도를 검토한 다음 [Create service]를 클릭합니다.
  11. 모든 항목이 성공적으로 생성되면 [View service]를 클릭합니다.

이제 새로 생성된 서비스에서 하나 이상의 작업이 실행 중인 것을 확인할 수 있습니다.

작업그룹이 잘 배포되고 있는지 확인하기 위해서는 EC2로 이동하여 대상그룹을 선택하면 알수 있습니다.

AWS CodeDeploy 콘솔에서는 Amazon ECS [Configure service] 마법사가 CodeDeploy 애플리케이션을 생성했음을 확인할 수 있습니다. 생성된 배포 그룹을 포함한 기타 세부 정보를 보려면 해당 애플리케이션을 클릭하세요.

 

배포 그룹 이름을 클릭하면 배포에 대한 세부 정보를 볼 수 있습니다.  [Deployment type] 아래에 [Blue/green]이 표시됩니다. [Deployment configuration] 아래에는 CodeDeployDefault.ECSAllAtOnce가 표시됩니다. 이는 상태 검사에 통과하면 CodeDeploy가 Application Load Balancer의 리스너를 업데이트하여 트래픽의 100%를 타겟 환경(녹색)으로 전송한다는 것을 나타냅니다.

이제 기본 설정을 끝났고 서비스 업데이트를 적용하여 CodeDeploy가 제대로 작동하는지 확인합니다.

 

5. 작업 정의 수정본 생성 및 서비스 업데이트

- 설명 생략

 

6. Code Deploy 확인

아래와 같이 나온다면 모두 정상적으로 끝난 상태입니다.

-  우선 3단계까지 통과한 뒤라면 배포는 성공한 것이며, ALB에서 라우팅이 sample-website-tg-1 에서sample-website-tg-2로 변경된 것을 확인 할 수 있습니다.

- 4단계는 기존버전과 신규버전의 어플리케이션이 동시에 유지되는 단계로 1시간 후에 기존 작업 세트를 종료합니다. AWS CodeDeploy 콘솔에서 대기 시간을 줄일 수 있습니다. 작업 세트가 종료되면 CodeDeploy가 배포 완료를 표시합니다.

댓글