Print
카테고리: [ Amazon Web Services ]
조회수: 31591

1. Blue/Green Deploy

코드를 배포하는데에는 무중단/중단 배포, In-place 배포, blue/green 배포등이 있습니다.

* 무중단/중단 배포

게임을 하다 보면 "서버 정기 점검"을 겪어보셨을 겁니다. 대표적인 중단 배포라고 할 수 있는데, 무중단 배포를 하게 되면 새로운 버전으로 들어온 유저와 기존 버전의 유저들 사이에 정책이 달라서 서비스를 제공할 수 없기 때문입니다.

A,B라는 두 기능을 제공하는 서비스에서 C라는 새로운 기능을 제공하려고 할 때, C 기능이 A,B에 영향을 주지 않는다면 무중단 배포를 해도 지장이 없습니다.

이처럼 무중단 배포는 down time을 최소화 할 수 있지만 중단 배포에 비해 비용이 크게 발생하는 경우가 생길 수 있습니다.

 

* In-place 배포

무중단 배포를 하기 위한 방법중 하나로, 여러 대의 서버를 배포할 때 새롭게 서버를 생성하거나 줄이지 않고 배포를 하는 방법입니다.

간략히 말하면, 1~4번 서버가 현재 서비스를 제공하고 있고 새로운 버전으로 업데이트를 진행한다고 생각하겠습니다.

이제 1,2서버는 중지를 시키고 3,4 서버만 사용하여 서비스를 진행합니다. 그리고 1,2 서버의 버전을 업그레이드하고 1,2 서버에 서비스를 연결, 3,4서버는 중지를 합니다.

이제 3,4 서버를 업그레이드하고 다시 서비스를 연결하면 배포가 완료되는 방식입니다.

 

* blue/green 배포

실습이 진행되는 과정을 미리 가져와 보았습니다. blue/green 배포는 In-place 배포와 마찬가지로 무중단 배포 기법 중 하나입니다.

blue group이 서비스를 제공하는 동안, 기존 AMI이미지의 모태인 인스턴스에서 업그레이드를 진행합니다.

그 후 새로 AMI를 만들고 green group이 서비스를 제공하도록 한다음, blue group을 내리면 됩니다.

(In-place 배포 방식과 매우 유사한 방식입니다.)

 

* 서버 내 blue/green 배포

Auto Scaling group으로 여러대의 인스턴스를 사용하는 경우 위와 같은 blue/green 배포를 사용하지만, Auto Scaling group이 없이 적은수의 서버를 운영하는 경우

nginx와 같은 서버 내의 웹 서버를 이용해 blue/green 배포를 진행할 수 있습니다.

이는 nginx에서 서비스 자체를 재시작하는 restart 명령어와 설정 파일을 리로드하는 reload 명령어가 있기에 가능합니다. 

restart는 nginx 서비스를 종료하고 다시 실행하기 때문에 해당 시간동안 들어온 요청이나 처리중이던 작업은 에러가 납니다.

reload는 nginx에서 새로운 프로세스를 생성하고 기존 프로세스에는 새로운 요청을 받지 않도록 처리합니다. 그리고 기존에 처리중이던 요청이 모두 종료될 때까지 기다리기 때문에 에러없이 새로운 설정을 적용할 수 있습니다.

 

2. 실습 - Blue/Green Deploy

2-1. Blue Group

* Auto Scaling group을 사용 하고 있고, 하루에도 몇개의 인스턴스가 자동으로 생성, 종료되며 배포시에 blue/green 배포를 하기로 했다고 가정하겠습니다.

새로운 코드가 배포 될 때마다 새로 추가된 인스턴스에 하나하나 접근하여 코드를 내려받을 수는 없습니다.

우리는 앞서 다루었던 AMI를 사용하여 이러한 문제를 해결 할 수 있습니다.

 

[Auto Scaling 그룹] -> [Auto Scaling 그룹 생성] 에서 아래와 같이 작성합니다.

* 시작 템플릿은 예전에 생성해 두었던 exercise-launch-template을 선택합니다.

* 조정 정책 구성은 [이 그룹을 초기 크기로 유지]를 선택합니다.

* 태그 구성은 키 - Name, 값 - exercise-group-blue 로 작성하시면 됩니다.

생성이 완료되면 생성한 [EXERCISE-GROUP-BLUE 우클릭] -> [편집] 을 클릭하여 대상 그룹을 생성해 두었던 [exercise-target-group]으로 설정해줍니다.

 

이제 [로드 밸런서] -> [DNS 이름] 부분을 복사하여 브라우저에서 호출하면 아래와 같이 제대로 창이 호출됩니다.

* 저는 인스턴스가 시작하면 자동으로 nginx가 기동되도록 설정하지 않았기 때문에 직접 들어가서 기동 후에 테스트를 진행합니다.

* 불편하실 수 있으니 자동으로 실행되도록 설정하시면 편하게 진행하실 수 있습니다.

 

2-2. AMI 생성

[인스턴스] -> [인스턴스] 메뉴를 클릭하여 새로운 AMI를 생성하기 위해 [exercise-instance]를 기동합니다.

서버에 접근하여 아래와 같이 진행합니다.

#프로젝트의 경로로 이동
#본인이 설정한 경로로 가시면 됩니다.
cd /sorc001/.../aws-exercise-a

#최신버전의 코드를 git에서 받습니다.
git pull

#최신버전의 코드가 담긴 beta branch로 이동합니다.
git checkout beta

#수정 된 코드를 확인합니다.(결과 아래 첨부)
vi app.js

#시스템 종료
sudo shutdown -h now

 

이제 [exercise-instance 우클릭] -> [이미지] -> [이미지 생성] 을 진행합니다.

* 이미지 이름 : exercise-image-beta

 

[인스턴스] -> [시작 템플릿] -> [시작템플릿 생성]을 클릭하여 아래와 같이 설정을 진행합니다.

* 소스 템플릿은 [exercise-launch-template]을 선택하여 설정값을 처음부터 채우지 않고 기존 템플릿에서 같은 부분을 가져와서 사용합니다.

* AMI는 앞에서 새로 만든 이미지를 선택합니다.

 

2-3. Green Group

이제 Green group을 만들 차례입니다.

[AUTO SCALING] -> [Auto Scaling 그룹] -> [Auto Scaling 그룹 생성]을 클릭하고 아래와 같이 진행합니다.

* 시작 템플릿 : exercise-launch-template-beta 선택

* 그룹 이름 : EXERCISE-GROUP-GREEN

* 서브넷, 조정 적책, 알림 구성은 앞선 Blue group과 동일하게 진행합니다.

* 태그 구성 : 키 - Name, 값 - exercise-group-green

 

[EXERCISE-GROUP-GREEN 우클릭] -> [편집] -> 대상그룹 : exercise-target-group

 

여기까지 진행하고나서 다시 DNS name을 통해 접속을 하면 아래 결과 화면과 기존의 결과 화면이 번갈아가면서 보입니다.

현재 Blue와 Green group이 동시에 서비스를 진행하고 있기 때문입니다. 이제 배포가 완료되었으니 blue group은 [편집] 을 클릭하여 대상그룹을 공백으로 만들고 저장을 합니다.

다시 브라우저에서 호출을 하면 이제는 [ AWS exercise의 A project beta 버전입니다. ] 라는 문구만 보이게 됩니다.

 

이제 배포에 문제가 없다고 판단하여 롤백을 할 일이 없다는 확신이 들었다면 blue group의 인스턴스를 종료하면 됩니다.

[EXERCISE-GROUP-BLUE 우클릭] -> [편집] -> 목표용량 : 0, 최소용량 : 0

 

자 이제 blue/green 배포가 정상적으로 완료되었습니다.

 

이제 모든 그룹의 설정을 목표용량 0, 최소용량 0 으로 설정하여 실습을 종료하시면 됩니다.