프로젝트 상황
서비스를 운영하기 위해서는 개발하는 과정에서 사용하는 개발 환경과 실제 사용자들이 사용하는 운영 환경을 분리해야 한다.
현재 진행 중인 프로젝트에서는 하나의 EC2 인스턴스 안에서 2개의 포트를 사용하여 개발 환경과 운영 환경을 동시에 실행시키고 있다.
- 8080번 포트: Profile이 dev인 Spring boot 서버 실행
- 8081번 포트: Profile이 prod인 Spring boot 서버 실행
Best Practice로는 개발 환경과 운영 환경을 물리적으로 분리하는 것이 좋다.
하지만 물리적 분리를 하기 위해서는 자원이 2배로 필요하기 때문에 포트를 2개 사용하여 하나의 인스턴스 내에서 개발 환경과 운영 환경을 분리하는 방법을 선택했다.
그리고 서브 도메인으로 개발 환경은 dev, 운영 환경은 prod를 앞에 붙여서 사용하고 있다.
(ex. dev.blablah.shop, prod.blablah.shop)
아키텍처는 아래와 같다.
2개의 EC2 인스턴스와 함께 Application Load Balancer를 활용하여 로드 밸런싱을 하고 있다.
Proxy pass를 위해서는 nginx를 사용하고 있다.
문제 상황
1. 서브도메인이 dev든, prod든 모두 8080번 서버로 연결된다.
2. 8080번 서버로 연결될 때도 있고, 8081번 서버로 연결될 때도 있다.
도메인 연결(Route53) 문제일지, nginx 문제일지, ALB 문제일지 처음에는 감이 오지 않았다.
그러다가 http://(ALB 기본 DNS):(포트 번호) 조합으로 URL을 사용했을 때는 원하는대로 포트포워딩이 된다는 것을 확인할 수 있었다.
원래 내 포스트 방식이라면 문제 상황에 대해 자세히 기록하고 해결 과정과 함께 올바른 방법을 마지막에 제시했겠지만, 이번 트러블 슈팅에서는 ... 대상 그룹도 많이 바꿔보고 ... 리스너도 여러가지 방법으로 바꿔보고 ... 정말 다양한 방법을 시도해보고 실패했기 때문에 그 과정을 모두 캡쳐하지 못했다.
그러므로 마지막에 성공한 올바른 ALB 설정만 이번 포스트에서 기록하겠다!
올바른 ALB 설정
대상 그룹
개발 환경을 위한 대상 그룹(blabla-Target-Group)과 운영 환경을 위한 대상 그룹(blabla-Target-Group-Prod), 총 2개가 필요하다!
blabla-Target-Group의 포트와 등록 대상 모두 8080으로 설정, blabla-Target-Group-Prod는 포트와 등록 대상 모두 8081로 설정해준다.
나의 실수
처음에는 하나의 대상 그룹(blabla-Target-Group) 안에 대상으로 8080번 포트와 8081번 포트를 둘 다 등록해주는 실수를 하였다 ㅠㅠ
이럴 경우, 문제 상황 2번과 같이 간헐적으로... 슈뢰딩거의 서버처럼 .... 어디로 갈지 모르게 된다 ... ㅎㅎ
리스너 및 규칙
리스너는 위 사진과 같이 HTTP:80, HTTP:8080, HTTP:8081, HTTPS:443을 추가해준다.
HTTP:80의 경우 작업 유형을 URL로 리디렉션을 선택하여 HTTPS:443으로 매핑한다.
나머지는 대상 그룹으로 전달을 선택한 뒤, 적절한 대상 그룹을 선택해준다.
HTTPS:443에 대한 규칙 추가하기
하나의 규칙만 있는 다른 리스너들과 HTTPS:443에는 3개의 규칙이 필요하다
즉, HTTPS:443 리스너에 대한 추가 규칙을 설정해주어야 각 포트로 들어갔을 때 적절한 API 서버로 연결되는 것이다!
리스너에 들어가서 규칙 추가 버튼을 누르고, 규칙의 이름을 적어준다.
그 다음 조건을 추가하라는 창이 나오는데, 규칙 조건 유형은 호스트 헤더이고,
- 서브 도메인이 dev인 URL과 8080번 포트를 연 대상 그룹
- 서브 도메인이 prod인 URL과 8081번 포트를 연 대상 그룹
을 매핑해주어 규칙을 2개 설정해준다.
올바르게 규칙을 추가했다면, 리스너 내 규칙에서 아래와 같이 확인할 수 있다.
포트포워딩과 네트워크에 대한 이해도가 부족하여 어느 부분이 잘못됐는지 몰라서 일주일 넘게 삽질했다 ^_ㅠ
특히 간헐적으로 발생하는 문제의 경우 로드 밸런싱 설정에서 대상 그룹이나 리스너 및 규칙을 잘못 설정했을 가능성이 크니 이 세 가지를 잘 살펴보자.