infra

[AWS] HTTPS 처리를 시작으로 도메인 설정 과정 "이해"로 끝내기 (EC2, ACM, ELB, Route53)

만나쓰 2024. 8. 1. 20:54

0. Intro

가비아에서 구매한 도메인 ghostpong.site로 EC2 배포를 했다. HTTPS 처리를 위해 ACM에서 SSL 인증서를 발급 받고, ELB(ALB) 로드밸런서로 HTTPS 처리하면서 여러가지 어려움을 겪었다. 전체적인 흐름, DNS 등에 대한 이해도가 부족하니 문제 해결에 어려움이 있었다. "똑같이 따라 했는데 왜 안 되지?"와 같은 상황을 방지하기 위해 이해가 필요하다고 판단하여 이 글을 작성하게 되었다.
 
SSL 인증서 발급하기, ELB 인스턴스 생성하기 등 AWS 사용법은 다른 블로그에서 이미지와 함께 상세한 설명이 잘 되어있어서 생략한다. 단순 사용법이 아니라, 각 단계별로 어떤 설정을 하고, 왜 하는 것인지, 어떤 의미인지 이해할 필요가 있다. 
 
참고로 EC2, ELB, Route53은 프리티어로 모두 가능하며 ACM도 무료로 SSL 인증서 발급이 가능하다. 프리티어 제품에 대한 자세한 스펙은 직접 확인 후 사용하자.
 
 

전체적인 프로세스는 아래와 같다.

 

1. 도메인 구매
2. Route53으로 호스팅 영역 생성 및 네임 서버 설정
3. ACM으로 SSL 인증서 발급
4. Target Group 생성
5. ELB(ALB) 로드밸런서 인스턴스 생성
6. Route53에 ELB에 대한 A 레코드 추가

 
 

이제 6개의 단계를 차례대로 살펴보자.

 

1. 도메인 구매

IP 대신 사용할 도메인을 구매해야 한다. ("example.com"과 같은 도메인 구매)

나는 '가비아'에서 구매했다.
 

2. Route 53으로 호스팅 영역 생성 및 네임 서버 설정

구매한 도메인에 대하여 라우팅하는 네임 서버를 설정하는 단계이다.

 
먼저 Route 53과 호스팅 영역에 대한 설명은 아래와 같다.

  • Route 53'DNS 서비스'로 도메인 구입, 네임서버 등록, dns 기능, 모니터링 기능을 제공한다.
  • 호스팅 영역은 '레코드의 컨테이너'로, 특정 도메인과 그 하위 도메인의 트래픽을 라우팅하는 방식에 대한 레코드들의 정보를 모아놓은 곳이다.

 
그래서 트래픽 라우팅을 위해 1. Route 53을 통해 호스팅 영역을 생성하고, 2. 생성한 호스팅 영역의 네임 서버를 가비아에 설정해야 한다.
(도메인의 네임서버 설정을 호스팅 제공자(Route 53)가 제공한 네임서버 주소로 변경해야 한다. 이 작업을 통해 네임서버가 올바른 호스팅 서버를 가리키도록 한다.)
(도메인과 EC2 또는 ELB을 연결하는 작업도 레코드를 추가해야 하는데, 해당 내용은 ELB 생성 후 6번 단계에서 진행한다.)
 
호스팅 영역을 생성하면 기본적으로 2개의 레코드가 생성될 것이다. 그중 NS 유형의 레코드는 Name Server(네임 서버) 레코드이다. 가비아 도메인 관리에서 기본적으로 설정되어 있는 네임 서버는 가비아의 네임 서버인데 해당 값들을 지우고, Route 53 호스팅 영역을 생성하면서 만들어진 Name Server 값으로 설정하면 된다.
(Route 53를 사용하지 않고 가비아 네임 서버를 사용해도 될 것이다.)
 

3. ACM으로 SSL 인증서 발급

이제 HTTPS 처리를 위한 SSL 인증서를 발급한다. ELB 인스턴스를 생성할 때 발급 받은 인증서를 사용할 것이다.

 
제일 상단에 도메인 이름을 작성할 때 루트 도메인과 정규화된 도메인 2가지를 모두 입력해야 된다. 처음에 정규화된 도메인(*.example.com)만 입력했다가 한참을 삽질했다.. '이 인증서에 다른 이름 추가'를 선택하여 루트 도메인(example.com)을 꼭 등록하자.
 
인증서 검증은 1. DNS 검증과 2. 이메일 검증이 존재하는데, DNS 검증은 자동 갱신을 지원하며 권장하는 검증 방식이므로 해당 방식으로 검증 신청을 했다. 
신청했지만 DNS 검증이 완료되지 않았기 때문에 발급되지 않은 상태일 것이다. DNS 검증을 위해 해당 인증서를  Route 53 호스팅 영역에 레코드로 추가해야 한다. 레코드 추가를 완료하고 일정 시간이 지난 후 상태가 '발급됨'으로 바뀔 것이다. (발급까지 소요 시간은 매번 달랐다.)
 

4. Target Group 생성 (ELB가 라우팅할 타겟 그룹 설정)

ELB 로드밸런서 인스턴스를 생성하기 전, 로드밸런서가 라우팅할 타겟을 설정하는 단계이다.

 
ELB로 들어온 요청을 어디로 보낼지 target group(대상 그룹)을 설정한다. EC2 인스턴스와 동일한  VPC, EC2 내 Nginx가 listen 중인 80번 포트로 설정했다.

 

5. ELB(ALB) 인스턴스 생성

 

이제 드디어 https를 위한 ELB 로드밸런서 인스턴스를 생성할 단계이다.

 
HTTP 80, HTTPS 443 2가지 포트에 대하여 리스너를 만들고 각각 4번 단계에서 생성한 Target Group을 선택한다. ELB로 HTTP, HTTPS 요청이 들어왔을 때 선택한 Target Group으로 라우팅 시키는 것이다.
HTTPS 요청에는 SSL 인증서가 필요하기 때문에 이때 아까 3번 단계에서 ACM에서 발급 받은 SSL 인증서를 사용한다.
 
생성 후, HTTP 요청일 경우 HTTPS 443 포트로 리다이렉트 시켜주도록 리스너를 편집했다. 
 

6. 생성한 ELB와 도메인을 연결하기 위해, Route53에 A 레코드를 추가 (호스팅)

마지막으로, 도메인과 ELB 인스턴스를 연결한다!

 
Route 53에서 ELB 인스턴스의 DNS 이름의 A 레코드를 추가하여 도메인과 연결한다. 루트 도메인과 서브 도메인 모두 등록했다. (example.com, *example.com)
 
 

마지막으로

이제 모두 완료되었다. https로 접속이 정상적으로 가능할 것이다.
똑같이 따라했다고 생각해도 정말 사소한 차이 하나, 실수 하나로 동작하지 않기 때문에 꼼꼼한 확인은 물론 뭘 하고 있는지 이해도 필수이다.
단순히 ACM에서 SSL 인증서를 받아서 Nginx에 등록해야지!로 시작했다가 어쩌다보니 여기까지 오게 됐다.. 이 과정에서 DNS 종류가 여러가지가 있다는 사실도 알게 되었다. (root DNS, local DNS 등) 해당 부분도 좀더 공부해서 한번 정리를 해야겠다!
 
사용하면서 발생하는 짜잘한 에러들도 조금씩 해결하면서 정리해야겠다..! (재밌겠다..ㅎㅎ)