마주한 에러들
- 로드 밸런서 헬스체크 지속적 Red
- IP 변동 문제
로드 밸런서 헬스 체크 지속적인 Red
배포 스크립트 실행 시, 아래와 같은 에러를 마주한다면 저와 같은 문제를 겪으신 것일 수도 있습니다.
무중단 배포를 하기 위해서는 로드밸런서를 사용해야 합니다.
인스턴스가 두개라고 했을 때, 번걸아가면서 배포를 해서 앱 서비스가 중단되는 일이 없게 하는 것입니다. 인스턴스를 이용할 수도 있지만 포트를 여러 개 열어 하나의 인스턴스에서도 무중단배포를 할 수 있습니다.
Elastic BeanStalk에서 무중단 배포를 사용하기 위해서는 사전 설정에서 옵션을 변경해야 합니다.
로드밸런서를 이용하기 위해서는 단일 인스턴스를 제외한 사전 설정을 선택해야 합니다. AWS에서 로드밸러서 서비스를 제공해주는 제품은 elastic load balancing 인데요. 줄여서 ELB라고 부른다고 합니다.
로드밸런서는 헬스 체크라는 것을 한다고 하는데요. ELB에서도 헬스 체크를 지원합니다.
헬스 체크란, 로드 밸런서에 연결되어 있는 인스턴스들의 상태를 체크하는 것입니다.
예를 들면 해당 인스턴스로 Http 요청을 보내서 상태 코드가 200인지 확인합니다. 만약 200이 오지 않는다면 해당 인스턴스로 트래픽을 보내지 않습니다.
그렇다면 ELB는 어떤 엔드포인트로 요청을 보내 헬스 체크를 할까요?
EB 환경 구성을 살펴보면 로드 밸런서가 있습니다.
편집 버튼을 누르면 프로세스라는 옵션이 있습니다. 여기서 상태 검사 경로가 ELB에서 헬스 체크를 보내는 엔드포인트입니다.
저 같은 경우 문제가 발생한 이유는 해당 엔드포인트를 만들어주지 않았기 때문입니다.
즉, 아래와 같이 "/" 로 들어오는 컨트롤러를 만들어주지 않았습니다.
@GetMapping("/")
public String healthcheck() {
return "ok";
}
프로젝트에 바로 해당 코드를 작성하여 푸시를 하니 문제가 해결되었습니다.
IP 변동 문제
우선 IP가 지속적으로 변동한 이유는 배포 정책때문입니다.
제가 선택한 배포 정책은 추가 배치를 사용한 롤링(Rolling with additional batch)입니다.
해당 정책을 사용한 이유는... 아무것도 몰랐기 때문입니다!
여튼, 해당 정책의 특징 중 하나는 배포마다 계속해서 새로운 인스턴스가 생성되고 기존의 인스턴스가 종료되게 됩니다.
추가 배치를 사용한 롤링 배포 정책이 궁금하신 분들을 위해 링크를 하나 남기겠습니다. 엘라스틱 빈스톡 - 배포 전략
배포 로그를 확인하면 인스턴스의 생성/종료를 확인하실 수 있습니다.
주요 로그 설명
3행 - deployment 준비 - 신규 인스턴스(인스턴스 ID i-00a4로 시작) 생성
9행 - deployment 완료
11행 - EB 환경에 i-00a4 인스턴스 추가
13행 - 기존 인스턴스(인스턴스 ID i-0a7ec) 종료
이 때문에 IP가 지속적으로 변동합니다. 배포마다 IP가 변경되면 너무 불편하겠죠...
그래서 어떻게 해결할지 고민을 해보았습니다. 사실 문제가 발생했을 때는 정말 아무것도 모르는 상태였습니다.
그러다 배포 정책 영상을 보게 되었고 인스턴스를 종료하지 않는 배포 전략도 있다는 것을 알게 되었습니다.
위 정책 중 인스턴스가 유지되는 정책은 한 번에 모두(All at Once), 롤링(Rolling)입니다. 트래픽 분할은 잘 모르겠네요.
(사실 근본적인 해결책은 아닙니다.)
배포 정책을 롤링으로 변경하고 배포를 해보았습니다. 로그를 보면 인스턴스를 새롭게 생성하지 않고 Deployment를 진행합니다.
직접 느끼고 영상을 통해 배운 추가 배치를 사용한 롤링의 특징입니다.
1. 인스턴스를 새로 생성하고 종료하기 때문에 상대적으로 다른 배포 전략에 비해 느립니다.
물론 제 프로젝트 기준일 수 있지만 추가 배치를 사용한 롤링은 6~7분, 롤링은 2~3분이면 배포가 마무리됩니다.
2. 서버의 인스턴스 용량이 유지됩니다. 매 순간 많은 트래픽을 받아야 하는 서비스라면 유용할 것? 같네요.
3. 롤링을 하는 과정에서 구버전과 신버전이 동시에 존재할 수 있습니다.
롤링의 경우에는 아래와 같은 특징을 가집니다.
1. 속도가 빠릅니다.
2. 롤링 비율에 따라 인스턴스 용량이 감소됩니다.
3. 추가 배치를 사용한 롤링과 마찬가지로 롤링을 하는 과정에서 구버전과 신버전이 동시에 존재할 수 있습니다.
여담으로 처음에 해당 문제를 해결하기 위해서 탄력적 IP를 사용해봤는데요. 탄력적 IP는 인스턴스가 종료가 아닌 중지상태에서 다시 실행될때만 IP를 유지합니다. 추가 배치를 사용한 롤링 정책은 아예 인스턴스를 종료시키기 때문에 IP를 고정할 수 없었습니다.
추가 내용) 엘라스틱 빈스톡 - 배포 전략 이 영상을 끝까지 보니 EB에서 제공해주는 새롭게 인스턴스가 생성되는 배포 정책에서도 DNS는 변경이 없다고 하네요. EB에서는 제공하는 DNS가 제가 가진 DNS를 바라보도록 하면 문제가 해결될 수도 있겠네요.
'항해99' 카테고리의 다른 글
항해99 45일차 TIL1 - 테스트 환경 데이터베이스 만들기 (0) | 2023.01.30 |
---|---|
항해99 44일차 TIL1 - AWS EB에서 관리하는 EC2 로그 보기 (0) | 2023.01.29 |
항해99 42일차 TIL1 - GitHub Action - EB 배포 오류 수정기 (1) | 2023.01.27 |
항해99 설 연휴 스터디 - AWS ELB 구축하기 (0) | 2023.01.24 |
"항해99 41일차 TIL1 - DBeaver 원격 DB 연결하기" (0) | 2023.01.24 |