해당 포스트는 React, Java Spring, MySQL을 활용한 프로젝트를 배포하는 방법 - 4
즉, HTTPS 환경에서 S3+CloudFront와 EC2를 ALB, ACM, Route 53으로 연결하는 방식에 대해 다룬다
물론 EC2 자체에 Nginx + Cerbot까지 붙이는 방식도 있지만 나는 ALB가 클라이언트 요청을 받을 때, HTTPS로 받고 EC2에는 HTTP로 전달하는 구조를 선택했다.
서버를 HTTPS 처리하기 위해서는 무료 SSL인 ACM을 사용하고자 한다
하지만 ACM은 직접적으로 EC2에 붙일 수 없기에 Load Balancer를 활용한다
Application Load Balancer (ALB)를 통해서 도메인 이름으로 서버에 접근할 수 있고 또 HTTPS를 사용할 수 있다
그래서 Route 53에서 도메인을 server.at-hong.shop로 설정해서 ALB의 DNS로 연결했다
ACM 인증서가 ALB에 연결되어 있으니 HTTPS가 작동하면서도 도메인 기반 요청 처리가 가능하다!
즉, 클라이언트
→ https://server.at-hong.shop
→ ALB (HTTPS)
→ EC2 (HTTP) 구조를 이룬다
1. at-hong.shop
CloudFront에 연결된 도메인으로, 정적 파일(프론트엔드) 을 S3에 올리고, CloudFront로 CDN 배포
CloudFront 배포 도메인인 ~.cloudfront.net을 Route 53의 at-hong.shop A 레코드에 별칭으로 연결
👉 유저가 https://at-hong.shop으로 접근하면 CloudFront가 S3에 있는 프론트를 대신 로드!
2. server.at-hong.shop
백엔드(Spring Boot 서버)를 위한 도메인
ALB의 DNS를 Route 53의 server.at-hong.shop A 레코드에 별칭으로 연결
이 ALB는 ACM을 바인딩한 뒤, 내부적으로는 EC2로 트래픽을 전달함
👉 프론트에서 API 요청을 할 때 https://server.at-hong.shop으로 HTTPS 요청 가능
EC2가 서울 리전에 있기 때문에, ALB도 서울 리전에 둬야 함
ALB에서 쓸 수 있는 ACM은 동일한 리전에 있어야 하기 때문에 전 단계에서 CloudFront-S3 연동했던 것과 동일하게 서울 리전에서 ACM을 발급
도메인은 server.at-hong.shop으로 두고 Route 53에서 레코드 생성

Application Load Balancer 클릭하고 체계는 '인터넷 경계'로 설정
네트워크 서브넷은 EC2가 위치하고 있는 리전 포함 다른 한 곳 선택
보안 그룹은 현재 인스턴스가 사용중인 서버 보안 그룹으로 설정
프로토콜은 HTTP, HTTPS로 대상 그룹 지정과 인증서 설정까지 한 후, 로드 밸런서 생성
Route 53에서 해당 로드 밸런서 위와 같이 추가

추가한 후, CloudFront의 레코드 상태:

서버에 Https가 완벽하게 적용이 됐다!

백엔드 코드에서 CORS와 클라이언트 매핑 주소 바꿔주고,
프론트엔드 코드에서 서버와의 매핑 주소를 바꿔주니

이미지는 아직이지만, 데이터를 잘 불러온다 🥹
참고 블로그:
EC2 인스턴스에 HTTPS 및 로드밸런서 적용하기
AWS EC2 HTTPS 적용하기
ACM SSL 인증서 적용