통합검색

AWS

route53 에서 '루트 도메인' 접속시 'www.도메인' 으로 리다이렉트 시키는 방법 (feat. cloudfront + s3 + ACL)


 

route53 에 자신의 도메인을 등록하여 dns 서비스를 이용하는 경우 dns 국제 규약에 의거 루트 도메인에는 cname을 적용할 수 없는데
루트 도메인에  cname을 등록해야만 하는 상황인 경우 (chanyeongpark.com 과 www.chanyeongpark.com 모두 cname을 적용하고 싶을 때),
대안으로 cloud-front 와 s3를 활용하여 'www.chanyeongpark.com' 으로 포워딩 시킬 수 있는 방법이 있다.



[!]루트도메인에 cname을 적용해야 하는 배경[/!]
나는 홈서버를 운영중이다.
가정용 인터넷 회선은 이따금씩 할당 받는 ip가 변경되기 때문에 필연적으로 DDNS 서비스를 사용하여 변경된 ip를 도메인으로 참조해야 한다. (0000.synology.me)
아이피가 변경될 때 마다 도메인이 바라보는 A 레코드 아이피를 바꿔줄 수 없으니 당연히 레코드를 cname 으로 설정하여 0000.synology.me 를 참조하도록 설정하고 있다.

최근 AWS route53 으로 도메인 네임서버를 이관 하였는데,
route53은 루트 도메인(chanyeongpark.com)에 cname을 설정할 수 없어 곤란한 상황.

AWS 여러 서비스를 살펴보니, 오브젝트스토리지 서비스인 's3'와 CDN 서비스인 'cloudfront' 서비스를 조합하면
루트도메인(chanyeongpark.com) 접속시 'www.chanyeongpark.com'으로 리다이렉트 시켜 대응할 수 있다는 사실을 알았다.


[!]작동되는 시나리오[/!]
chanyeongpark.com 접속시 리다이렉트가 작동되는 시나리오는 아래와 같다.
 
[chanyeongpark.com 요청] -> [cloudfront : https 프록싱] -> [s3 : http 연결] -> [www.chanyeongpark.com redirect]
 
접속자가 도메인 요청시 cloudfront endpoint로 연결되며, cloudfront는 다시 s3의 정적 웹사이트 endpoint로 연결하면, s3가 정적 웹사이트에 설정된 url로 redirect하는 방식이다.


[!]s3 버킷 생성[/!]
https://s3.console.aws.amazon.com/s3/get-started?region=ap-northeast-2&bucketType=general&region=ap-northeast-2
AWS s3는 '정적호스팅' 기능을 제공한다. s3 버킷에 업로드된 파일을 웹에서 열 수 있도록 url을 제공하는 기능인데,
이 정적호스팅은 '정적 웹 사이트 호스팅' 과 '객체에 대한 요청 리디렉션' 두가지 속성을 제공한다.
 
1) 정적 웹 호스팅 : 저킷 접속시 버킷에 업로드된 특정 html 파일이 열리도록 하는 옵션
2) 객체에 대한 요청 리디렉션 : 버킷 접속시 다른 버킷이나 외부 url로 리디렉션 시키는 옵션
 
s3 버킷 접속시 'www.chanyeongpark.com'으로 접속될 수 있도록 '객체에 대한 요청 리디렉션' 옵션을 활용해 본다.

우선 새로운 s3 버킷을 만든다.
어떠한 이름으로 생성해도 무관하나, 나는 식별을 위해 버킷명을 도메인명으로 설정했다.

 

생성된 버킷명을 클릭하여 설정 화면으로 이동한 뒤 [속성]을 클릭한다.



스크롤을 조금 내려 '정적 웹 사이트 호스팅' 섹션에서 [편집]을 클릭한다.



아래와 같이 정적 웹 사이트 호스팅을 설정한다.
chanyeongpark.com 접속시 https 도메인으로 접속 되어야 하기 때문에
'프로토콜'은 https를 선택한다.



cloudfront 연동을 위한 s3 버킷 생성은 모두 끝났다.
여기서 cloudfront 와 연동시 필요한 정보는 endpoint 다.




[!]cloudfront 연동에 앞서[/!]
https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=ap-northeast-2
route53와 s3 버킷 연동만으로 리다이렉트 가능하다면 얼마나 좋을까.
아쉽게도 s3 정적호스팅 endpoint는 https 엔드포인트 url을 제공하지 않는다.
내가 운영하는 사이트는 https를 기본으로 사용하고 있기 때문에 인증서가 적용된 https 주소가 필요한 상황.
그래서 cloudfront 추가 연동이 필요하다.

그 전에, cloudfront 사용을 위해선 SSL 인증서가 미리 준비되어 있어야 하는데,
다행스럽게도, AWS는 리소스 사용을 위해 필요한 인증서를 무료로 제공해주고 있다.



[!]AWS certificate manager(ACM)에서 인증서 발급[/!]
https://us-east-1.console.aws.amazon.com/acm/home?region=us-east-1#/certificates/request
AWS certificate manager(ACM)에서 인증서를 발급받아 보자.
주의 할 점은 '버지니아 북부(us-east-1)' 에서 발급받은 인증서만 cloudfront 에 적용 가능하니 반드시 리전부터 변경하고 보자.





'퍼블릭 인증서 요청'을 선택한 뒤 아래 [다음] 버튼을 클릭한다.



접속할 루트도메인 주소를 입력하고 하단 [요청]을 클릭하여 발급 요청한다.
약 5분정도 기다리니 인증서가 성공적으로 발급 되었다.



[!]cloudfront 생성 및 s3 연동[/!]
https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=ap-northeast-2#/distributions
cloudfront 에서 새로운 '배포'를 생성하여 s3와 연동한다.
화면 상단 [배포 생성]을 클릭하여 cloudfront를 생성한다.





생성화면의 'Choose origin domain'을 클릭하여, 앞서 생성한 s3 엔드포인트를 선택한다.



'뷰어 프로토콜 정책' 중 'Redirect HTTP to HTTPS'를 클릭한다. 엔드포인트 접속시 http와 https 둘다 접속을 허용하지만,
http 접속 시에는 https 로 강제 리다이렉트 시키기 위함이다.



'대체 도메인 이름(cname)'에 루트 도메인(chanyeongpark.com)을 입력하고
앞서 생성한 SSL 인증서를 선택한 다음 [배포 생성]을 클릭하여 s3와의 연동을 완료한다.




[!]route53 에서 루트도메인 레코드에 cloudfront 연결[/!]
https://us-east-1.console.aws.amazon.com/route53/v2/home?region=ap-northeast-2#Dashboard
드디어 마지막 단계!
route53 에서 루트도메인에 방금 만든 cloudfront 배포 엔드포인트를 연동한다.



dns 호스팅 영역을 선택한 다음 [레코드 생성]을 선택한다.



위와 같이 [별칭]을 선택하면 추가 선택 항목이 노출 되는데
'트래픽 라우팅 대상' 에서 'CloudFront 배포에 대한 별칭',
'배포 선택' 에서 방금 만든 cloudfront 엔드포인트를 선택한 다음 [레코드 생성]을 클릭하여 모든 과정을 마무리 한다.

마지막으로, 브라우저 창에서 루트도메인 접속시 'www.도메인'으로 리다이렉션이 잘 되는지 확인한다.