EC2 로드 밸런서 HTTPS 트래픽 처리불능에 대해 질문합니다.

24.02.16 16:22 작성 조회수 65

0

안녕하세요, 저는 지금 프론트엔드 개발자를 준비하고 있는 취업준비생입니다.

포트폴리오를 준비하면서 웹 풀스택 개인 프로젝트를 진행중입니다.

 

AWS를 이용한 프로젝트 배포과정에서 적용한 HTTPS 트래픽 처리 과정에서, EC2 Load Balancer에서 HTTPS 트래픽을 처리하지 못하는 문제를 해결하지 못해 질문합니다.

 

현재 프로젝트 배포를 위해 사용하고 있는 AWS 서비스들은 아래와 같습니다.

  • S3

  • EC2 (Load Balancer 포함)

  • RDS

  • Route 53

  • CloudFront

 

발생한 문제의 상세한 내용은 아래와 같습니다.

 

가상의 향수 쇼핑몰을 주제로 프로젝트를 만족스럽게 구현하였고, AWS를 이용하여 프론트엔드 / 백엔드 / 데이터베이스도 성공적으로 배포하였습니다.

 

그런데 회원 기능을 구현하면서 로그인 상태를 검증하고 지속할 방법으로 쿠키를 사용하였습니다. 문제는 기본적으로 사용되는 HTTP 프로토콜에서는 몇 가지 이유로 쿠키 사용이 불가능하여 배포 환경을 수정하면서 HTTPS를 사용해보기로 하였습니다.

 

Route 53으로 도메인을 하나 구입하고, ACM으로 SSL 인증서를 발급받은 뒤.

CloudFront를 이용해서 S3로 배포 중인 프론트엔드 파트를 구입한 도메인으로 연결함과 동시에 SSL 인증서를 적용하여 HTTPS를 사용하도록 설정했습니다.

 

그리고 EC2 환경에서도 HTTPS 사용이 가능하도록 Load Balancer를 설정, HTTP 리스너와 HTTPS 리스너를 설정하고 SSL 인증서를 적용한 뒤 EC2 인스턴스를 대상그룹으로 지정하여 백엔드로 들어오는 트래픽을 처리하도록 설정하였습니다.

 

그런데 이후 Load Balancer에서 헬스체크 테스트를 해보니, HTTP 트래픽은 백엔드에 잘 도달하여 응답까지 되는 반면 HTTPS 트래픽이 제대로 처리되고 있지 않는 결과를 확인하였습니다. 백엔드 로그와 Load Balancer 엑세스 로그 등을 확인해보니 헬스체크 요청이 백엔드에 제대로 도달하고있지 못하는 것을 확인하였습니다.

 

 

아래 항목들은 제가 문제를 해결하기 위해 수집한 정보들입니다.

1. 로그에서 elb_status_code가 "502"이고, target_status_code가 "-"인 것을 보아서는 로드 밸런서가 HTTP 502 오류를 반환하고 있으며, 이는 대상에서 적절한 응답을 받지 못하고 있는 것으로 보입니다.

 

2. 네트워크 탭에서 확인된 정보에 따르면, 클라이언트(브라우저)는 OPTIONS 메소드를 사용하여 사전 요청(이른바 "preflight" 요청)을 서버에 보내고 있지만 이 사전 요청에 대한 응답이 없거나, 응답이 잘못되었을 때 502 오류가 발생할 수 있다고 합니다.

 

 

아래 항목들은 제가 문제를 해결하기 위해 시도했던 방법들입니다.

1. Route 53 레코드 수정 :

프론트엔드에서 백엔드로 요청을 보내는 서브 도메인 app.essence-aura.com을 생성하고, 로드 밸런서 라우팅을 연결하였습니다.

메인 도메인 essence-aura.com에서는 S3로 배포 중인 프론트엔드 정적 파일에 접근하며, 프론트엔드 내부적으로는 서브 도메인 app.essence-aura.com에게 백엔드 요청을 보내게 됩니다.

 

2. ACM 인증서 검증:

발급된 SSL/TLS 인증서가 Load Balancer와 CloudFront에 제대로 적용되었고, 모든 서브도메인이 포함되어있으며 유효한 상태임을 확인하였습니다.

 

3. SSL/TLS 핸드셰이크 체크:

Load Balancer 로그를 통해 SSL/TLS 핸드셰이크가 성공적으로 수행되고 있음을 확인했습니다.

 

4. 서버 시간 동기화:

EC2 인스턴스의 시간이 NTP(chronyd)를 통해 정확히 동기화되어 UTC 기준으로 적용됨을 확인하였습니다.

 

5. 로드 밸런서 대상 그룹 설정:

로드 밸런서의 대상 그룹 설정을 HTTP와 HTTPS로 구성하였고, EC2 인스턴스에서 사용하는 포트인 3001 포트로 적용되고 있음을 확인했습니다.

 

6. EC2 인스턴스 포트 설정:

인스턴스 인바운드 규칙에 3001 포트가 허용중이며, SSH로 인스턴스에 접근하여 백엔드 서버가 포트 3001에서 수신 대기 중임을 확인했습니다.

 

7. 보안 그룹 및 네트워크 ACL 설정:

EC2 인스턴스에서는 3001 포트를 허용하고 있으며, 네트워크 ACL 설정은 초기값 그대로 모든 트래픽을 허용하고 있는 상태임을 확인했습니다.

 

 

 

제 능력으로 가능한 선까지 문제 해결을 위해 노력했지만 며칠을 소모해보아도 문제가 해결되지 않아 질문해봅니다.

 

EC2 Load Balancer에서 HTTPS 트래픽을 처리하지 못하는 이유가 무엇일까요?

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.17

안녕하세요, 인프런 AI 인턴입니다.
이유승님, AWS를 활용한 프로젝트 배포 시 EC2 Load Balancer에서 HTTPS 트래픽 처리 문제로 질문하셨군요.

이론적으로는 Load Balancer가 SSL/TLS 종단(termination)을 처리하고 내부적으로는 HTTP 프로토콜을 이용해 EC2 인스턴스와 통신합니다. 문제 해결을 위해 확인해야 할 몇 가지 사항을 말씀드릴게요.

  1. 보안 그룹 설정 확인: Load Balancer의 보안 그룹이 HTTPS (포트 443) 트래픽을 허용하고 있는지 확인하십시오.

  2. 대상 그룹 헬스 체크: Load Balancer의 대상 그룹에 설정된 헬스 체크가 HTTPS에 맞게 설정되어 있는지, 해당 포트와 경로가 백엔드 시스템에서 수신 가능한지 확인하시기 바랍니다.

  3. SSL 인증서 및 리스너 설정: Load Balancer에 적용한 SSL 인증서가 유효하고 올바르게 설정되었는지, 리스너가 HTTPS 트래픽을 적절히 수락하고 있는지 검토해야 합니다.

  4. EC2 인스턴스 및 애플리케이션 설정: EC2 인스턴스에서의 애플리케이션 설정이 Load Balancer와 호환되는지, 특히 인스턴스 내부에서 사용하는 포트와 애플리케이션 설정이 올바른지 체크하십시오.

  5. SSL/TLS 올바른 적용 여부: Amazon Certificate Manager(ACM)에서 발급받은 인증서가 Load Balancer에 제대로 적용되었으며, 엔드포인트 간 SSL/TLS 핸드셰이크가 올바르게 작동하는지 확인해보세요.

단순한 설정 문제가 아니라면, 백엔드 애플리케이션이 HTTPS를 올바르게 처리하지 못하고 사전 요청에 불충분한 응답을 하고 있을 수 있으므로, 서버 로그를 더욱 면밀히 조사할 필요가 있을 것입니다. 로드 밸런서의 로그를 통해 문제가 발생하는 요청의 패턴을 파악하고, 해당 요청에 대한 백엔드 서버의 응답 상태를 확인해 보세요.

추가로, Spring Boot 기반의 애플리케이션을 사용하고 계시다면 로드 밸런서 뒤에 위치한 프록시 서버에서 HTTPS를 처리하는 경우에 대한 설정을 참고할 수 있습니다. 예를 들어 Spring Boot Reference Documentation에 나와 있는 프록시 서버를 통한 HTTPS 활성화 설정 예시를 확인해보시기 바랍니다.

이 문제를 해결하기 위해서는 다양한 AWS 서비스와 네트워크 설정들이 복합적으로 작용하기 때문에 여러 설정을 점검해 보시고, 필요한 경우 AWS Support에 문의하거나 AWS 관련 커뮤니티에서 도움을 요청하시는 것도 좋은 방법일 것입니다.

해결에 도움이 되었길 바랍니다. 추가적인 도움이 필요하시면 언제든지 문의해주세요.