ysuekkom의 IT study note

[AWS 패턴] AWS 쾌속 개발 환경 구축하기-자동화 및 무중단 릴리스(관리형 컨테이너 ECS, Blue/Green 배포) 본문

Cloud Service/AWS 패턴

[AWS 패턴] AWS 쾌속 개발 환경 구축하기-자동화 및 무중단 릴리스(관리형 컨테이너 ECS, Blue/Green 배포)

ysuekkom 2023. 8. 2. 18:50

 

 AWS는 쾌속 개발 환경을 구축 할 수 있는 서비스를 제공한다. 쾌속 개발 환경이란, 테스트와 배포 등 단순 작업을 자동화 및 간소화 하여 시간을 단축하게 해주고 이렇게 확보한 시간을 서비스 개발 및 기획과 같은 핵심 코어 업무에 집중할 수 있게 해주는 것이다.

역시 어떠한 서비스를 제공하는지 개발과 운영에 어떤 우선 순위와 필수 요건을 가지고 있는지에 따라 구축형태와 이용 할 AWS 서비스가 달라진다. 

이번 패턴에서는 다음 조건을 충족시키는 쾌속 개발 환경을 구축해보자.

 

조건1. 릴리스가 빈번하게 일어나기 때문에 테스트와 배포의 자동화가 필요하며, 무중단 릴리스여야 한다.

조건2. 시간과 비용을 절감해야한다.

 

위 조건을 만족하는 기본 구축 내용은 아래와 같다.

설계1. 무중단 릴리스를 위하여 배포 시, Blue/Green으로 배포한다.

설계2. 컨테이너로 어플리케이션 실행환경을 구성한다. 관리형 컨테이너 서비스인 ECS에 Deploy하여 관리에 용이하게 하며 시간과 비용을 절감한다. 

 

 

 

 


ECS Blue/Green 배포로 무중단 릴리스?

블루/그린 배포는 애플리케이션의 잦은 릴리스로 인한 중단을 최소화하고, 신규 버전에 대한 안정성을 확인하기위해 CodeDeploy에서 제공되는 서비스이다.

현재 버전의 애플리케이션 트래픽을 블루, 새로운 버전의 애플리케이션을 그린으로 생성하여 현재 버전에서 제공되는 서비스 중단 없이, 

새로운 애플리케이션 버전에 올라가는 트래픽을 모니터링하고 테스트할 수 있다. 

  • 다운타임 없이 새로운 버전을 테스트 할 수 있음
  • 새로운 버전의 애플리케이션=Green Stack이 정상 동작하지 않으면 Blue Stack으로 롤백이 쉬움
  • 실시간 트래픽을 새로운 버전에 올리기 전에 모니터링 및 기능 테스트를 수행할 수 있음(현재 트래픽 유지하면서)

 

 

Blue/Green 배포의 전제 조건

Blue/Green을 배포하기 전, LB가 적용된 기본 구성이 필요하다.

IAM, Target Group, LoadBalancer(Application or NW LB)가 구성되어 있어야한다.

또한 LB 생성 시 Test lisntener를 지정, prod traffic 수신기가 필요하다.

>>블루/그린 배포에 필요한 IAM 권한

  • codedeploy:Get*
  • codedeploy:CreateCloudFormationDeployment
{
	"Version": "2012-10-17",
    "Statement": [
    	{
        	"Sid": "0",
            "Effect": "Allow",
            "Action": [
            	"iam:PassRole",
                "ec2:CreateTags",
                "ec2:RunInstances"
             ],
             "Resource": "*"
         }
     ]
}

 

Blue용, Green용 로드밸런서 그룹이 각각 필요하며, 리스너 설정 포트 변경을 통해 Green 배포를 시작할 수 있다.

blue/green용  컨테이너 인스턴스 내에 blue/green용 각각 변경될 리스터 포트를 전환해주는 작업이 필요하다.

>>블루/그린 배포를 활성화 하기 위한 템플릿 추가

  • AWS::CodeDeployBlueGreen 
  • AWS::CodeDeploy::BlueGreen 후크를 호출, 배포 속성을 지정하는 후크 섹션 추가
  • Resource 섹션에서 배포에 대한 블루/그린 리소스 정의

템플릿 예제를 통해 CodeDeploy를 통한 블루/그린 배포를 설정할 수 있다. >>공식문서 참고

 

 

 


구성도를 통해 확인해보자.

초기 구성은 파란색으로 표시된 port 80번으로 트래픽이 100% ECS로 전달된다. 각 단계별 트래픽 흐름을 살펴보자.

step1.

CodeDeploy기반 Blue/Green 배포를 위해 Target 그룹이 Green = port 8083으로 연결된다.

새로운 버전의 애플리케이션 정상 동작 확인을 위한 테스트 트래픽이 port 8083으로 흐르게 된다. 8083 포트로 들어오는 테스트 트래픽을 통해 일부 기능 테스트를 수행하고, 모니터링 지표 분석을 수행하여 sucess or fail을 반환하게 된다.

테스트 트래픽에 대해 성공을 수신 할 경우, blue target 그룹으로만 흐르던 프로덕션 트래픽이 80 port와 8083 port 리스너모두 green target그룹을 가리켜 라우팅 된다.

기존 Blue 구성을 유지하기 때문에, 현재 단계에서는 롤백이 가능하다.

 

step2.

롤백이 가능하도록 Blue 구성을 유지하는 단계이다. 트래픽은 모두 Green으로 향하게 되고, 새로운 버전으로 무중단 릴리즈를 수행하는 중이다. 

그린 배포가 성공하고 완료되기 전에 오류가 발생하면 그린 배포가 시작되기 전의 상태로 스택을 롤백한다.

>>다음 정보를 Stack Template에 포함시켜야 한다.

 

 

step3.

구성 기간이 초과되면 Blue traffic이 0%가 되고,  작업을 종료한다. 이 시점 이후에는 롤백이 불가능하다(주의).

 

 

 


마치며

다음 포스팅에서는 실제로 블루/그린 배포를 해보고, 모니터링을 수행해 보겠다. 

추가로 알림설정을 통해 CodeDeploy 시 관리자들이 알람을 받아볼 수 있도록 실제 설정해보자.

 

 

 

 

 

 

 

 

참고

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html#appspec-hooks-ecs

https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/blue-green.html

https://yonikim.tistory.com/81

https://bsssss.tistory.com/1210?category=959368 

https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html#appspec-hooks-ecs

https://rainbound.tistory.com/entry/AWS-CodeDeploy-BLUEGREEN-%EB%B0%B0%ED%8F%AC-%EC%9E%90%EC%84%B8%ED%9E%88-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-1