
우리 회사는 CodeDeploy를 통해 배포를 하고있다.
그리고 트래픽은 08:00 ~ 21:00 에 많이 이루어지고 있다.
지금까지는 인스턴스 대상으로 배포를 진행하고 있었기 때문에 배포시에는 다운타임이 발생할 수 밖에 없었다.
따라서 새로 배포를 할 때마다 21:00 이후 야간배포를 하고있었는데 해당 상황을 개선하기 위해 LB를 통한 배포를 구현하기로 하였다.
Prod 서버에 WAS 서버에 Prod_Leader / Prod_Follower 태그를 부여하여 Canary 방식(?)으로 배포를 진행하였다.
(트래픽을 점진적으로 늘리는 방식은 아니므로 무중단 Canary 배포는 아니다.)
Leader 서버에 먼저 배포를 진행하고 특별한 오류가 발생하지 않으면 Follwer 서버에도 배포를 진행하였다.
기존 방식은 아래와 같다.

이런 방식으로 배포를 진행한다면 트래픽에 대한 제어가 이루어지지 않기 때문에 어쩔 수 없이 다운타임이 발생할 수 밖에 없었다.
따라서 CodeDeploy에 LB을 통해 트래픽을 제어하는 배포 방식을 이용하기로 했다.
배포 Flow는 다음과 같다.
기존 인스턴스 대상으로 배포하는 방식과 달리 Traffic에 관련된 프로세스들이 있다.

Block Traffic이 진행되는 동안 CodeDeploy는 CodeDeploy Agent를 통해 트래픽을 통제하고, LoadBalancer를 호출하여 대상 Target Group에에서 인스턴스 등록을 취소한다.

그래서 위 방식으로 진행하려고 했는데....

BlockTraffic에서 ScriptFailed라는 오류코드로 넘어가지 않았다.

ScriptFailed의 에러메시지를 보니 EC2의 상태값이 여전히 Healthy이고 unused가 되기까지 소요시간에있어 timeout이 발생한것으로 보였다.
결론은 트래픽을 제어하고 싶어 1시간동안 시도하였지만 실패하였다는 내용이다.
여러가지 시도끝에 예상되는 원인을 발견했다.
(시도해본 방법: 포트포워딩 포트 변경, Health Check 설정 변경, SG 등)
정확한 방법인지는 모르겠지만 해결한 방법을 작성해보겠다.
ALB가 80번 포트에 대한 리스너 규칙으로 80번 타겟그룹에 넘기면 해당 타겟 그룹에서 인스턴스가 8080포트로 대기하고 있었는데 인스턴스 내에서는 80번으로 들어오는 트래픽을 WEB서버에 넘기고 있었다.
따라서 CodeDeploy는 WAS 서버에 80번 트래픽 Health Check를 성공하면 해당 트래픽을 차단하려고 하였으나 WAS 서버가 응답하는게 아니라 엉뚱한 WEB 서버가 응답을 하니 트래픽을 차단하지 못했던 것이다.
그래서 서비스에 지장을 주지 않고 WAS 서버에 정상적으로 Health Check가 진행될 수 있도록 타겟그룹에 포트번호를 변경하여서 해당 문제를 해결하였다.

디폴트 설정으로 LB를 통해 트래픽을 제어하여 배포한다면 BlockTraffic 단계에서 5분 넘게 시간이 소요가 된다.
해당 시간을 줄이기 위해서는 타겟그룹에서의 설정이 필요하다.

해당 값을 60으로 수정한다면 Block Traffic에서 소요되는 시간을 1분대로 줄일 수 있다.