들어가는 글
초기 아키텍쳐의 경우 따로 프로젝트에 AWS ALB 사용이 없었다. 로드밸런싱이 필요하다면 nginx 를 사용하고자 하였는데, 새로 팀에 들어오신 현업자 백엔드분이 AWS 에서 제공하는 기능들을 최대한 사용하는 아키텍쳐로 싹 다 갈아엎으셨다. (positive)
▶ 프론트엔드가 vercel 활용 배포를 진행해 https 프로토콜을 사용하도록 설정해두어서 백엔드도 http 에서 https 로 수정하게 되었다.
나는 한번도 해본적이 없는 레벨 0따리 였기 때문에 구조에 대해 어떠한 반박도 안 하고 (못하고) 전부 수용하였다. ㅋㅋㅋ 그래서 이번에 처음으로 ALB 에 대해서 알게 되었는데, 첫만남이 오류라니. 가혹하다.
(아래에 간단한 ALB에 대한 내용 정리와 오류 해결기를 담아보도록 하겠다.)
ALB(Application Load Balancer) 에 대하여
왜 사용하는가?
1) 트래픽 분산: 여러 EC2 인스턴스에 요청을 균등하게 분산시켜줌
2) HTTPS 인증서 적용 가능: TLS/SSL 인증서 연동이 가능해 보안성 확보
3) 도메인 연결 용이: Route53, 가비아 등에서 구입한 도메인을 연결해 사용자 친화적 주소 사용 가능
4) Health Check 기능: EC2 인스턴스의 상태를 자동으로 점검하여, 비정상 인스턴스에는 트래픽을 보내지 않음
Health Check란?
ALB가 EC2의 상태를 주기적으로 체크하는 방식
▶ 특정 경로(Path)에 프로토콜 요청을 보내서 200 OK 응답이 오면 정상, 그렇지 않으면 비정상으로 판단
기본적으로 / 경로를 사용하지만, 실무에서는 보통 /actuator/health를 많이 사용
발생 오류
상황
ALB 를 적용하신 분께서 무언가 문제가 발생했다고 연락이 오셨다. 보내주신 사진을 보니 health-check 에 붉은 글씨로 비정상 이라고 적혀있었다. EC2 인스턴스 먹통의 기억이 떠오르면서 아찔했다.
그래서 우선 나도 직접 확인을 해봐야겠다는 생각이 들어 EC2 > 대상 그룹 > {프로젝트이름} 으로 들어갔더니, 정말 비정상 이라고 떠있었다. 😇 😇 😇 열심히 돌아다니면서 원인을 찾아봤는데, 상태 확인 세부 정보 에 [302] 오류가 적혀있었다.
사실 원인이 적혀있어도 이게 뭐지 싶어서 열심히 찾아보니, ALB 의 경우엔 지정된 경로에 대해서 반환되는 HTTP 응답 코드가 200OK 여야만 정상으로 해준다더라... 우리는 302 가 반환되고 있기 때문에 오류가 난 것이었다.
원인 분석
정확한 원인을 파악하기 위해서 도커 로그를 찾아보았다. 그러자 아래와 같은 로그를 볼 수 있었다.
무슨 소리인지 모르겠어서 지피티를 이용했더니 아래와 같았다.
🐳 Docker 로그의 에러
Invalid character found in method name [...]. HTTP method names must be tokens
→ 이 에러는 HTTPS 요청이 HTTP 포트(8080)로 들어올 때 생기는 전형적인 에러입니다.
이를 확인하고 내린 결론은,
ALB가 체크하는 경로가 Spring Security 에 인증되지 않아서 이걸 리다이렉트 처리를 하는 구나. 였다.
난 분석한 내용을 지피티에게 다시 알려주며 해결 방법을 알려달라고 했고 결국 오류를 해결했다.
그 과정을 아래에 적어보겠다.
해결 방법
1) SecurityConfig.java 수정
health-check 를 위해 설정한 경로를 허용해 주기 위한 코드를 추가한다.
.requestMatchers("/", "/login/**", "/css/**", "/js/**", "/h2-console/**", "/actuator/health").permitAll()
그런데, 만약 그 경로를 모른다면??
아래의 방법대로 찾아가면 확인할 수 있다.
⭐️⭐️⭐️
EC2 > 대상 그룹 > {프로젝트이름} > 아래 탭 여러개에서 "상태검사" > 경로
2) application.properties 수정
actuator 엔드포인트를 활성화시켜주는 코드 추가
: 이 설정을 하지 않으면 /actuator/health 자체가 응답을 안 하거나 404로 나올 수 있다.
# ✅ 추가 (파일 맨 아래나 아무 위치)
management.endpoints.web.exposure.include=health
management.endpoint.health.show-details=always
3) build.gradle 에 actuator 의존성 추가
Spring Boot의 Actuator 기능이 자동으로 /actuator/health 엔드포인트를 만들어주기 위해 필요
implementation 'org.springframework.boot:spring-boot-starter-actuator'
결과 확인
로컬 테스팅
우선 로컬에서 먼저 돌려보았다. 아주 잘 돌아가는 것을 볼 수 있다.
배포 후 테스팅
수정 사항을 모두 main 에 버지하여 자동 배포화가 이루어졌다. 결과 확인을 위해 ALB 사이트와 도커 로그를 확인했더니 모두 깔끔하게 정상으로 나왔다.
참고 링크
[AWS] ALB 및 HTTPS 프로토콜 적용하기
AWS ALB 적용, HTTPS 프로토콜 적용
velog.io