이번 글에서는 AWS CodeDeploy에서 제공하는 Blue/Green 배포 기능을 통해서 ASG를 무중단 배포해보도록 하겠다.
Github Action과 AWS CodeDeploy를 통해서 배포 파이프라인을 구성할 것이므로, Github Action과 CodeDeploy을 잘 모른다면 이 시리즈를 참고하길 바란다.
그리고, ASG에 대해서도 궁금하다면 이 글을 참고하길 바란다.
💡 기본적으로 배포 파이프 라인은 구성이 되어 있다는 전제하에 글을 시작하도록 하겠습니다.
그리고 EC2 또는 Load balancer와 같은 부수적인(?) 인프라들에 대한 자세한 설명은 글의 주 목적에 집중하기 위해서 과감히 생략할 예정이니, 양해 부탁 드립니다 😅
오늘 구축해볼 Blue/Green 배포 방식 대해서 허접한 그림으로 표현해보았는데, 아래와 같다.
이 그림은 배포가 일어나기 전의 모습이다.
정상적으로 구동중인 ASG가 있고, 들어오는 트래픽을 잘 처리하고 있는 상황이라고 보면 된다.
그러다가 배포가 시작되면, 구동 중인 ASG와 동일한 옵션을 갖고 있는 새로운 ASG를 생성하고, ASG 하위에 서버 인스턴스들도 새롭게 생성해준다.
새로운 ASG가 모두 생성이되고 Warm up 시간이 끝나면, 새로운 트래픽은 새롭게 생성된 ASG로 보내고 기존에 ASG로 향하는 트래픽들은 새로운 ASG로 Re 라우팅한다.
Re라우팅이 끝나면, 잠시 후 기존에 있던 ASG와 그 안에 포함된 서버 인스턴스들을 제거한다.
이러한 형태의 배포는 내가 구현하려는 파이프라인 뿐만 아니라, Blue/Green 배포의 전형이긴 하다.
이런 Blue/Green 배포 파이프라인은 직접 구축하기에는 매우 까다로운 방식인데, AWS CodeDeploy에서 Blue/Green 배포 기능을 제공하고 있다. ㅎㅎ
아마존의 힘을 빌어서 Blue/Green 배포 파이프라인을 구축해보자🔥
아마존 체고👍👍👍
먼저 ASG 생성 콘솔로 이동한 후, ASG를 생성해보도록 하자!
Step1, step2는 ASG의 이름과 VPC/Subnet을 설정하는 부분인데, 이 부분은 각자의 상황에 맞게 해주면 된다.
Step3가 되면, 본격적으로 ASG에 대한 설정이 시작된다.
Blue/Green 배포에서는 Load balancer가 필수적으로 필요하므로, 기왕이면 ASG에 연동할 Load balancer와 Target group을 미리 생성해두고 여기서 선택해주자.
ELB Health check는 활성화할 것을 권장한다.
그리고 Health check grace period
가 중요한데, Health check grace period
는 직역하면 "상태 확인 유예 기간"이고 기본 값은 300초
이다.
이 값은 새롭게 생성된 인스턴스가 Healthy
하지 않은 상태여도 바로 Target group
에서 제거하지 얼마 동안 기다릴 것인지를 정해주는 값이다.
좀 더 직접적으로 이야기하자면, 서버 인스턴스가 생성되고 그 안에서 서버 애플리케이션이 실행이 되어 Health check가 통과되는 시간보다 큰 값으로 설정되면 된다.
예를 들어서, 서버 인스턴스가 실행 + 서버 애플리케이션이 구동되는 시간이 1분이라고 한다면, Health check grace period
는 1분 이상의 값으로 설정을 하면 되는 것이다.
하지만, 다양한 이유로 예상 시간보다 서버가 늦게 뜰 수 있으므로 1.5배~2배의 값으로 설정하면 된다.
이 시간이 지났는데도 서버 인스턴스가 Healthy
한 상태가 되지 않으면, 해당 서버 인스턴스는 제거 되고, 새로운 인스턴스가 만들어지게 된다.
Default instance warmup
이 끝나면, 새롭게 생성된 서버는 트래픽을 받을 수 있다는 의미로 ASG가 인식을 하게 된다.
즉, 인스턴스 생성부터 서버 애플리케이션이 완전히 실행될 때 까지의 시간을 입력해주면 된다.
각자가 사용하는 기술에 따라서 천차만별일텐데 몇 번 테스트해보고 적당한 값을 입력해주면 된다.
스케일링 정책은 각자의 상황에 맞게 설정해주면 된다.
나는 2대의 서버가 고정적으로 구동되도록 설정해보도록 하겠다.
Name 태그를 입력해주면, ASG에 생성될 EC2 인스턴스들에 해당 태그가 붙게 되서 관리하기 편리해지니까 Name 태그 정도는 입력할 것을 권장한다.
이렇게 필요한 정보를 모두 입력한 후 "생성" 버튼을 누르면 잠시 후 잘 생성된 ASG를 볼 수 있다.
CodeDeploy 애플리케이션을 하나 생성해주고, 그리고 CodeDeploy group은 아래와 같이 생성한다.
CodeDeploy group의 이름과 IAM Role은 적절히 설정해주고, 배포 유형을 위와 같이 설정해주면 된다.
ASG를 선택하는 부분에서는 아까 생성한 ASG를 선택해주면 된다.
트래픽 처리와 기존 인스턴스 관련 처리는 상황에 맞게 해주면 되는데, 나는 위와 같이 트래픽은 새로운 ASG가 잘 생성되는 대로 Reroute하도록 했고, 기존에 있던 ASG는 바로 삭제하도록 하였다.
그리고 Deployment configuration
별한 경우가 아니라면, AllAtOnce
를 추천한다.
어차피 Blue/Green 방식으로 배포되기 때문에 천천히 인스턴스들을 새롭게 만들 필요가 없어서, 서버를 쫙! 만들고 쫙! 교체해도 되기 때문이다. ㅎㅎ
배포가 진행되는 동안 트래픽을 받을 Load balancer를 선택해주면 되는데, ASG에 설정한 LB와 같은 것을 선택해주면 된다.
여기까지 하면, CodeDeploy 세팅이 완료되고, 배포가 잘되는 지 확인해보면 된다.
직접 생성하거나, Github Action에서 트리거링해서 배포가 생성되면, 이런 화면이 보이게 된다.
대략적인 작업 순서는 아래와 같다.
경우에 따라서 다른데, 배포가 완료되는 데 까지 걸리는 시간이 짧게는 7~8분정도 걸리고 길게는 15분까지도 걸리기도 했다.
배포가 완료되면, 초록색이 가득한 편안한 화면을 볼 수 있다. 🤸♂️
물론 ASG도 교체가 되어 있고, 그 안에 서버 인스턴스들도 새롭게 생성이 되어 있는 것도 확인할 수 있다.
오늘은 AWS CodeDeploy를 활용하여 ASG를 Blue/Green 배포하는 것을 알아보았다.
파이프라인을 구축하면서 든 생각은 '아마존은 참 대단하다...'이다 ㅎㅎㅎ
아마존을 사용할 수록 개인적으로도 동기부여가 많이 되는 것 같다 🔥
아무튼! 이번 글은 이만 마치도록 하겠다.
Thank you 🙏