문제 상황

최근 블로그에 Google AdSense를 등록하려다 보니, 최상위 도메인만이 등록이 가능했다.

views
Google AdSense에서 도메인 등록 실패

GitHub Pages를 통해서 블로그를 관리하고 있었기에, novice.ioleehosung.github.io 로의 연결이 필요했는데, AWS Route53에서는 설정이 불가했다.

views
AWS Route53에서 CNAME 등록실패

CNAME은 왜 설정이 안될까?

CNAME(Canonical Name Record)은 일반적인 DNS 레코드 유형 중 하나다. CNAME 레코드는 하나의 도메인 이름을 다른 도메인 이름으로 리다이렉션하는 별칭(Alias)으로, 동일한 웹사이트나 서버로 연결된 여러 도메인 이름을 관리하는 데 유용하다.

하지만 CNAME 레코드에는 한 가지 중요한 제한이 있다. 도메인의 루트(root)에는 사용할 수 없다. 도메인의 루트란 빈 공간이나 점(.)으로 표시되는 최상위 도메인을 의미한다. 예를 들어 ‘www.example.com’ 도메인의 루트는 ‘example.com’ 다. 참고로 루트 도메인은 apex domain, bare domain으로 불리기도 한다.

이러한 제한은 DNS 프로토콜이 작동하는 방식과 관련이 있다. DNS 표준이 작성될 당시에는 사용을 관리하기 위해 몇 가지 규칙이 정해져 있었다. RFC 1912와 RFC 2181에 다음과 같이 명시되어 있다.

  • SOA 및 NS 레코드는 루트 도메인에 반드시 존재해야 한다.
  • CNAME 레코드는 단일 레코드로만 존재할 수 있으며 다른 리소스 레코드와 결합할 수 없다.(DNSSEC SIG, NXT 및 KEY RR 레코드는 제외)

즉, 도메인의 루트는 도메인의 정상적인 작동에 필요한 SOA 또는 NS 레코드와 같은 다른 유형의 레코드가 필요하기 때문에 동시에 CNAME을 설정할 수 없다.

따라서 도메인 루트에서 다른 도메인 이름으로 트래픽을 리다이렉션하려면 A 레코드 또는 ALIAS 레코드를 설정해야 한다.

A 레코드 사용하기

도메인의 A 레코드(Address 레코드)는 도메인 네임을 해당 도메인을 호스팅하는 서버의 IP 주소에 매핑하는 DNS(도메인 네임 시스템) 레코드의 한 유형이다.

간단히 말해, A 레코드는 도메인 이름을 컴퓨터가 웹사이트에 연결할 때 사용하는 IP 주소로 변환하는 전화번호부 항목과 같다. 웹 브라우저에 도메인 이름을 입력하면 브라우저는 해당 도메인에 대한 A 레코드를 조회하여 해당 도메인 이름과 연결된 IP 주소를 가져오기 위해 DNS 서버에 요청을 보낸다. IP 주소가 확보되면 브라우저는 해당 IP 주소와 연결된 웹 서버에 연결하여 웹사이트의 콘텐츠를 요청할 수 있다.

예를 들어, 도메인 이름 “example.com“의 A 레코드는 “93.184.216.34”라는 IP 주소에 매핑될 수 있다. 즉, 누군가 웹 브라우저에 “example.com“을 입력하면 브라우저는 A 레코드를 사용하여 IP 주소 “93.184.216.34”에서 서버를 찾아 해당 서버에서 호스팅되는 웹사이트에 연결한다.

A 레코드를 이용해서 루트 도메인을 GitHub Pages로 연결하기 위해서는 GitHub에서 제안하는 방법을 따르면 된다. 간단하게 요약해 보면, novice.io → (185.199.108.153, 185.199.109.153, 185.199.110.153, 185.199.111.153) 로 A 레코드를 지정해 주면 된다.

views
Route53 A레코드 추가하기
views
Github Pages 에서 도메인 등록하기

이를 통해 novice.io에 대한 DNS 조회는 4개의 IP 주소로 정해진 알고리즘에 따라 라우팅 된다. 하지만 GitHub Pages 설정을 변경하게 되면 기존 블로그 주소인 blog.novice.io가 변경되기에 이 방법은 사용하지 않았다.

Alias를 사용해서 리다이렉션 하기

Route 53의 Alias 레코드는 도메인 이름을 ELB(Elastic Load Balancer), Amazon S3 버킷, CloudFront 배포와 같은 AWS 리소스에 매핑할 수 있도록 하는 DNS 레코드 유형이다. 별칭 레코드는 사용자가 리소스의 IP 주소나 URL을 기억하거나 사용할 필요 없이 친숙한 도메인 이름을 가진 AWS 리소스로 트래픽을 라우팅할 수 있는 방법을 제공한다.

Route 53의 Alias 레코드는 도메인 이름을 리소스에 매핑하는 데 IP 주소를 사용하지 않는다는 점에서 A 레코드 유형과 다르다. 대신 리소스의 DNS 이름에 대한 포인터 역할을 하는 Alias 대상이라는 특수한 유형의 CNAME 레코드를 사용한다. 즉, 리소스의 IP 주소 또는 URL이 변경되면 별칭 레코드가 새 주소를 반영하도록 자동으로 업데이트 된다.

나의 경우에는 S3의 정적 웹 호스팅 Redirection 기능을 사용해서 S3 Bucket을 셋업했다. (자세한 것은 역시 AWS 메뉴얼을 참고하자.)

views
S3의 Redirection 설정

해당 S3 Bucket을 Endpoint 를 향하는 Alias 레코드를 novice.io 루트도메인에 설정해 주었다.

이와 같은 방법을 통해 novice.io, blog.novice.io 모두 leehosung.github.io로 연결되는 설정이 완료 되었다.