본문 바로가기
Coding/DevOps

AWS Codedeploy로 ECS Blue/Green 배포하는 방법

by Hide­ 2019. 3. 14.
반응형

운영중인 서비스에 업데이트 사항이 생기고 배포를 진행하다보면 지속적인 배포를 어떻게 해야할까 라는 의문점이 들기 마련이다. 가장 중요한점은 사용자가 서버의 중단을 느끼지 못하는 것이기에 관련된 사항을 찾아보던 중 Blue/Green Deploy라는 것을 발견했다. 


예를 들어 총 4대의 서비스가 존재한다면 2대의 서비스를 로드밸런서에서 끊고 서비스를 업데이트한 이후 다시 로드밸런서에 붙임과 동시에 기존 서비스 2대를 로드밸런서에서 끊는다. 마찬가지로 2대의 서비스도 업데이트를 진행하고 다시 로드밸런서에 붙인다. 이렇게 된다면 실제로는 서비스의 중단이 일어났다고 볼 수 있겠지만 사용자의 경험에서는 서비스의 중단을 느낄 수 없다. Blue/Green에 대한 자세한 사항은 인터넷에 많이 나와있으니 찾아보도록 하고 오늘은 AWS CodeDeploy를 통해 Blue/Green Deploy를 구성하는 방법에 대해 포스팅한다.


현재 나는 AWS ECS로 서비스를 돌리고 있다. 파이썬을 사용하기에 Boto3 라이브러리를 활용하여 직접 Blue/Green을 만들었었다. 그러다가 몇몇의 글들을 보고 AWS 자체적으로 제공해주는 CodeDeploy라는 서비스를 사용해보자고 맘먹었고 그에 관한 경험을 이 포스팅에 남긴다.


먼저 ECS 클러스터와 작업정의는 생성된 이후라고 가정한다. ECS Cluster - Service 생성으로 들어가면 아래와 같이 Deployment type을 선택할 수 있다.


여기서 Service role for CodeDeploy에 AWSCodeDeployForDeployer라는 역할이 선택되어있다. 따라서 우리는 해당 역할에 ECS의 서비스에 접근할 수 있는 Permission을 부여해줘야 한다. IAM콘솔 - 역할로 들어간다.


AWSCodeDeployForDeployer 역할을 선택하여 들어가면 연결된 정책이 나온다. 여기에서 위 사진에 나와있듯이 AWSCodeDeployRoleForECS라는 정책을 연결시켜줘야 우리가 사용하는 ECS와 같이 동작할 수 있다. (이 부분을 스킵하면 서비스 생성 단계에서 CodeDeploy쪽 오류가 발생한다)


다시 서비스 생성으로 돌아가서 다음 화면으로 가면 단계 2: 네트워크 구성 이 나온다. 참고로 Blue/Green을 구현하려면 로드밸런서가 존재해야한다. 나는 기본적으로 Application Load Balancer를 하나 생성해놨다. 


로드를 밸런싱할 컨테이너를 선택하고 ELB에 추가 버튼을 누르면 위처럼 설정하는 부분이 나온다. 리스너 포트에는 원래 사용하던 포트를 적어넣고 아래쪽에 있는 Test listener port에는 테스트용 포트를 적는다. 나는 8080을 입력했다. (참고로 보안 그룹 Inbound에 8080을 추가해줘야 한다)


다음으로 타겟 그룹을 설정해줘야한다. ALB를 생성했다면 기본적으로 로드 밸런서 그룹이 존재한다. Target group 1에 해당 그룹을 지정해주고 Target group 2는 새로 생성해준다.


다음을 계속 누르고 최종적으로 서비스 생성을 하면 위와 같은 화면이 나온다. 이제 CodeDeploy쪽 콘솔로 들어가보면 새로운 CodeDeploy 어플리케이션이 하나 생성되어 있을 것이다.


다음으로 작업정의를 개정해주는 단계이다. ECS 콘솔 - 작업정의로 들어가서 기존의 작업정의를 체크한 후 새 개정 생성을 통해 작업정의를 새로 만들어준다. 작업정의를 생성했으면 다시 ECS - Cluster로 들어가서 생성한 서비스를 체크하고 업데이트를 누른다. 그리고 Revision에서 우리가 방금 생성한 새로운 (latest) 작업정의로 서비스를 업데이트 시키면 된다. (새로운 작업정의 선택한 이후 그냥 계속 다음 버튼을 누르면 된다)


문제가 발생하면 배포를 중지하고 롤백도 할 수 있다. 배포를 중지하면 트래픽이 기존 작업 세트(파란색)으로 이동하고 배포가 중지된다. 추가적으로 말하자면 CodeDeploy는 기본적으로 배포를 성공하고 1시간 이후에 기존 작업 세트를 종료한다. (대기 시간을 줄일 수도 있다) 작업 세트가 종료되면 CodeDeploy쪽에서 배포 완료 표시를 확인할 수 있다.