[AWS] EC2 인스턴스에 HTTPS 적용 - ACM, Route53, ALB
S3 버킷에 배포된 정적 웹 사이트에 HTTPS를 적용하고, Mixed Content Error를 직면하였다. 간단히 말해 HTTPS 적용된 정적 웹 사이트에서 HTTPS가 적용되지 않은 톰캣 서버에 요청했기 때문에 발생한 문제이다. 이를 해결하기 위해 Application Laod Balancer를 이용하여 EC2 인스턴스에 배포한 톰캣 서버에 HTTPS로 접근하기로 하였다.
Application Load Balancer
Elastic Load Balancing은 둘 이상의 가용 영역에서 EC2 인스턴스, 컨테이너, IP 주소 등 여러 대상에 걸쳐 수신되는 트래픽을 자동으로 분산한다. 등록된 대상의 상태를 모니터링하면서 상태가 양호한 대상으로만 트래픽을 라우팅한다. Elastic Load Balancing는 Application Load Balancers, Network Load Balancers, Gateway Load Balancers 및 Classic Load Balancer 각자 필요에 따라 가장 적합한 로드 밸런서 유형을 선택할 수 있다.
Application Load Balancer는 OSI 모델의 7 Layer인 애플리케이션 계층에서 작동하며, 다음과 같이 구성되어있다.
1. 로드 밸런서 : 여러 가용 영역에서 EC2 인스턴스 같은 여러 대상에 수신 애플리케이션 트래픽을 분산하는 클라이언트에 대한 단일 접점 역할을 수행
2. 리스너 : 구성한 프로토콜 및 포트를 사용하여 클라이언트의 연결 요청을 확인하며, 리스너에 대해 정의한 규칙에 따라 로드밸런서가 등록된 대상으로 요청을 라우팅하는 방법이 결정
3. 대상 그룹 : 지정한 프로토콜과 포트 번호를 사용하여 EC2 인스턴스 같은 하나 이상의 등록된 대상으로 요청을 라우팅
나는 S3 버킷에는 https://dodom.site 도메인을 사용하였고, API 서버에 접근하는 도메인은 그의 하위 도메인인 https://api.dodom.site 를 사용하였다. 프로젝트에 적용한 AWS 구성도는 다음과 같다.
EC2 동적 웹 사이트 HTTPS 적용 과정 요약
1. Route53에 호스팅 영역 등록
2. ACM에서 SSL 인증서 발급 및 DNS 검증
3. Target Group 생성
4. ALB 생성
5. Route53에서 등록한 도메인 ALB 별칭으로 라우팅 설정
1. Route53에 호스팅 영역 등록
이전 게시글에서 Route53에 호스팅 영역을 등록했다면, 동일 호스팅 영역을 사용하면 되고 다른 도메인을 사용하고 싶거나 등록하지 않았다면 이전 게시글을 참고하여 등록하면 된다.
2. ACM에서 SSL 인증서 발급 및 DNS 검증
이 단계도 이전 게시글과 동일하게 진행한다.
* 주의 : EC2에 적용해야 하기 때문에 EC2가 배포되어 있는 리전을 선택하고 진행해야 한다.
3. Target Group 생성
로드 밸런서 생성 전 트래픽이 라우팅 되는 Target Group을 생성해보자.
1. EC2 > Target Groups > Create Target Group 타겟 유형은 Instances를 선택한다.
2. 타겟 그룹의 프로토콜과 포트를 설정해주고, VPC를 EC2와 동일하게 설정한다.
나의 같은 경우 EC2 위에 배포된 톰캣 서버는 HTTP 8080포트를 사용하므로 다음과 같이 설정해주었다.
3. 타겟 그룹에 타겟과 타겟에 대한 포트를 확인하고 include as pending below로 포함시킨다.
4. 타겟 그룹에 대한 설정을 다했으면 create target group 버튼을 눌러 생성한다.
4. Application Load Balancer 생성
이제 EC2에 들어오는 트래픽을 처리해주는 Application Load Balancer를 설정하여 HTTPS를 적용해보자.
1. EC2 > LoadBalancers > 로드밸런서 타입을 Application Load Balancer를 선택한다.
2. 기본 구성을 작성한다.
3. EC2가 배포된 VPC를 선택하고, EC2가 배포된 가용영역을 포함하여 선택한다.
4. EC2에서 사용한 보안 그룹을 설정한다.
EC2에 적용된 보안그룹 인바운드 규칙에 https가 허용되지 않다면 다음과 같이 인바운드 규칙을 설정한다. (나는 이단계에서 다른 보안 그룹에서 https를 열어주어서 한참동안 해맸다. 그러니 EC2에 적용한 보안그룹인지 꼭 확인!)
5. 리스너와 어떤 타겟그룹으로 트래픽을 라우팅할지 정한다.
나는 HTTPS와 HTTP 모두 앞서 생성한 Target Group으로 라우팅하도록 설정하였다.
6. 마지막으로 ACM에서 받은 인증서를 적용해주고, 생성한다.
4. Route53에서 등록한 도메인 ALB 별칭으로 라우팅 설정
이제 Route53에서 등록한 도메인으로 https 요청을 보내면, Cloud Front로 라우팅 되도록 설정해주자.
1. 1단계에서 생성한 호스팅 영역에 들어가서 레코드 생성 버튼을 누른다.
2. 다음과 같이 설정값을 넣고 레코드를 생성한다.
레코드 유형은 A형으로 Application/Classic Load Balancer에 대한 별칭을 선택해 이전에 생성한 ALB을 선택한다.
모든 단계를 다하면 https 프로토콜을 사용하여 정적 웹사이트에 요청하여도 API 서버에 대한 요청도 https로 ALB이 라우팅 해주기 때문에 Mixed Content Error가 발생하지 않고 제대로 작동한다.