프로그래밍

[AWS] ec2로 띄운 서버에 DNS 설정하기

2kindsofcs 2020. 3. 16. 23:25

목표는 아주 간단했다.

ec2에서 띄운 서버를 이용해 https://app.example.com 같은 주소로 get 요청을 보내면 200 OK가 뜨게 하는 것이었다.

 

구글에 한글로 "ec2 dns 연결" 따위로 검색해보면 route 53에 도메인을 연결해서 사용하는 방법에 대한 글이 많이 나오는데, 

결과적으로 나는 route 53을 사용하지 않고 elb(elastic loadbalancer)를 사용했다.

 

 

먼저 https는 고려하지 않고 http만 생각하고 설정을 했다. 

유저가 http://app.example.com에 접속하면 http 요청은 웹서버로 바로 가는 것이 아니라 elb로 가게 된다. 

정확히는, elb의 80번 포트로 요청이 가게 되고 elb는 이 요청을 ec2의 특정 포트(웹서버가 돌아가고 있는)로 보내도록 설정을 해줬다.

 

요청을 받는 건 그렇다 치고, 웹서버가 해당 요청에 따른 정보를 클라이언트한테 줘야하는데, 줄 때는 어떻게 주는가?

elb는 리버스 프록시이기도 하다. 따라서 프로그래머가 따로 신경을 쓰지 않아도 원하는 바를 이룰 수 있다.

(헷갈리면 안된다. 로드밸런서 == 리버스 프록시가 아니라, aws의 elb가 리버스 프록시 역할도 한다는 것이다.)

 

elb가 http://app.example.com에 오는 요청을 어떻게 받을 수 있는가? 

당연히 DNS 설정을 해줘야 한다. 

기존에 Namecheap에서 사용하던 도메인이 있어서 간단하게 추가했다. 

 

 

 

로드 밸런서 목록 하단의 설명 탭에서 로드 밸런서의 DNS 이름을 확인할 수 있다.

대략 something.region.elb.amazonaws.com 같은 형태일 것이다. 

이 DNS 이름은 A 레코드다. A 레코드는 특정 IP 주소를 가리킨다.  

그렇다면 CNAME 레코드는? CNAME 레코드는 일종의 별칭이다. 특정 IP 주소가 아니라, 다른 도메인 이름을 가리킨다. 

 

내가 example.com 도메인 주소를 네임칩에서 구매했다고 가정하자. 

DNS 설정에서 Type을 CNAME Record로 하고 Host를 app, Value를 elb의 A 레코드로 설정한다.

http://app.example.com으로 요청을 보내면 something.region.elb.amazonaws.com를 찾아서, 

결과적으로 elb의 ip 주소를 알게되어 elb로 요청이 갈 수 있는 것이다. 

 

일단 여기까지 하면 목표를 일부 달성했다.

그런데 당연히 http가 아닌 https가 쓰고싶다.

그러기 위해서는 elb에 인증서를 올려야 한다. 

인증서를 올리는 방법은 비교적 간단했다.

https://aws.amazon.com/ko/premiumsupport/knowledge-center/associate-acm-certificate-alb-nlb/

 

ACM/SSL 인증서를 로드 밸런서에 연결

 

aws.amazon.com

인증서를 로드 밸런서에 연결하고, http 요청을 https로 리디렉션 해주면 된다.


삽질 방지 Tip:

이때 시큐리티 그룹 설정을 잘 해줘야 한다.

가급적 elb와 인스턴스가 별개의 시큐리티 그룹을 사용하도록 설정하자. 

예를 들어 elb, 인스턴스 모두  A라는 sg를 사용하고 있는데 이 sg 인바운드에 22번과 80번이 들어가 있다고 하자. 

그러면 elb는 443으로 들어오는 요청을 전혀 받을 수가 없다. 

고로 elb가 http요청과 https 요청을 다 잘 받을 수 있는지 확인하고,

인스턴스는 elb에 배정된 sg으로부터 오는 요청만 받도록 설정해주자. 


 

반응형

'프로그래밍' 카테고리의 다른 글

primary key, natural key, surrogate key  (0) 2020.03.18
SQL이란 무엇인가  (0) 2020.03.18
type conversion과 type assertion의 차이  (0) 2020.02.24
ORM vs ODBC  (0) 2020.02.24
golang module을 사용해보자.  (2) 2020.02.21