DNS는 ip 주소를 문자열로 번역한 것이다. .으로 구분된 도메인 조각들은 가장 오른쪽의 문자열에서부터 계층형 구조를 이룬다. 즉 www.google.com 은 .com이 최상단 계층, google.com이 그 다음, www.google.com이 그 다음이다.

도메인 등록기관에는 GoDaddy, Amazon Route53 등이 있다.

DNS 용어

  • Zone File - DNS 레코드를 포함한 그룹
  • 네임 서버 - DNS 쿼리에 응답하는 서버
  • TLD - Top Level Domain - .com, .us 등
  • SLD - Second Level Domain - google.com, amazon.com 등

http://api.www.google.com 중, api.www.google.com 을 전체 도메인, http를 프로토콜이라고 하며 둘을 합쳐서 url이라고 한다.

가장 첫 DNS 쿼리가 발생하면, 로컬 DNS 서버로부터(ISP 사업자 등이 관리) 항상 루트 서버로 쿼리가 전달된다. 루트 서버는 최상단 TLD에 대해서 네임 서버 IP를 응답한다.

ex) .com NS 1.2.3.4

.com 도메인은 Name Server 타입 도메인이며 ip는 1.2.3.4이다. 이렇게 루트서버는 TLD에 대한 Name Server 유형의 응답만을 보낸다. 그렇게 루트서버가 TLD DNS 서버 ip를 전달하면 , 다시 로컬 DNS 서버에서 TLD DNS 서버에 DNS 쿼리를 보내고 TLD DNS 서버는 SLD에 대한 네임 서버 IP를 응답한다.

ex)example.com NS 5.6.7.8

역시 이번에도 도메인 타입은 Name Server이다. TLD DNS 서버와 Root DNS 서버는 ICANN이라는 단체에서 관리하는 서버이며, SLD DNS 서버부터는 도메인 등록기관에서 관리한다. SLD DNS 서버부터는 A타입 레코드 (도메인이 위치한 ip주소) 응답을 반환한다. 최종 A타입 레코드를 전달받은 로컬 dns서버는 이를 캐싱하여, 다음부터는 동일한 dns이름에 대해캐시를 먼저 조회한다

레코드는 다음의 정보로 이루어져 있다.

  • 레코드 타입 - A, AAAA, CNAME, NS 등
  • TTL - DNS리졸버(클라이언트의 DNS 조회 프로그램)에 캐싱된 레코드가 보관되는 기간. TTL이 클수록, Route53 등의 DNS Server에 부하가 덜어지지만, 레코드의 업데이트를 클라이언트에 반영되는 시간이 오래 걸린다.
  • 값 - DNS에 매칭되는 ip 주소 값

레코드 타입

  • A ipv4에 매칭되는 도메인명
  • AAAA ipv6에 매칭되는 도메인명
  • CNAME 다른 도메인명에 매칭되는 도메인명, 이 때 매칭될 값은 A/AAAA 레코드를 가지는 도메인이여야 한다. 따라서 가장 하위 계층(subdomain이 아닌)의 도메인 만이 매칭될 수 있다.
  • NS DNS 쿼리를 핸들링할 네임서버의 ip 주소와 매칭되는 도메인명

Hosted Zone

route 53에서 도메인과 서브도메인 레코드들의 컨테이너이며, 트래픽 라우팅을 담당한다. public 도메인 레코드를 저장하는 public hosted zone과 VPC내의 프라이빗 네트워크에서 사용되는 프라이빗 도메인를 저장하는 private hosted zone이 있다.

레코드 TTL

DNS리졸버(클라이언트의 DNS 조회 프로그램)에 캐싱된 레코드가 보관되는 기간. TTL이 클수록, Route53 등의 DNS Server에 부하가 덜어지지만, 레코드의 업데이트를 클라이언트에 반영되는 시간이 오래 걸린다. TTL이 작으면 Route53의 트래픽이 증가하고 요금이 더 발생하지만, 레코드의 업데이트가 더 빨리 반영되는 장점이 있다

TTL이 만료되지 않은 레코드를 업데이트(레코드 밸류 변경)하더라도 DNS 리졸버는 이전 밸류를 그대로 참조한다. dns 리졸버는 dib 명령어를 통해 쉘에서 확인할 수 있다.

그런데 만약, 로드밸런서 처럼 외부에 도메인명을 노출하고 있을 때 이를 원하는 도메인과 매핑하고 싶다면 어떻게 해야할까? 2가지 방법을 사용할 수 있다.

  1. CNAME 레코드 값으로 다른 도메인을 매핑할 수 있다. 이 때 도메인은 non-root여야 한다. 용어가 헷갈린다면, 루트 도메인은 TLD를 말하며 non-root 도메인은 하위 계층 도메인을 말한다.

  2. ALIAS route53에만 있는 타입으로 레코드 값으로 AWS 리소스를 설정할 수 있다. 루트 도메인과 non-root 모두 설정 가능하다. 매핑되는 밸류는 AWS 리소스만 가능하다. ALIAS로 등록한 로드 밸런서의 ip주소가 변경되었다면 ALIAS는 자동으로 변경사항을 반영한다. Alias 레코드의 레코드 타입은 항상 ip주소를 가리키는 A/AAAA 이다. 여러 aws 리소스와 더불어, 동일한 Hosted Zone에 있는 다른 route53 레코드도 값으로 가질 수 있지만, 단 한가지 ec2 인스턴스의 DNS명은 값으로 가질 수 없다. alias 레코드를 생성할 때는, 다른 레코드와 동일하게 A/AAAA 타입을 선택한 후, ‘alias’ 옵션을 켜고 리전-AZ에서 원하는 리소스를 선택하면 된다.

CNAME은 TLD/상위 계층 도메인은 매핑할 수 없기 때문에 alias를 사용하는 것이 좋다.

DNS Routing Policy

DNS쿼리에 응답하는 정책에 대한 설정으로, 실제 라우팅과는 전혀 관련이 없다.

  • simple
  • weighted
  • failover
  • latency based
  • geolocation
  • multi-value answer
  • geoproximity 등의 정책이 있다.

Simple

단일 리소스로 라우팅. 단일 레코드의 여러 밸류를 응답할 수 있음. 이 경우 클라이언트가 무작위로 선택한다. 물론 선택된 DNS는 TTL이 만료될 때까지 유효하다. 헬스체크를 사용할 수 없음

Weighted

동일한 키(이름)와 타입을 갖는 DNS 레코드들에 설정한 weight 의 비율대로 라우팅 하는 정책. 헬스체크를 사용할 수 있음 weight는 아무 숫자나 주더라도, 전체 weight의 합과 레코드 weight의 비율을 계산해 라우팅함(백분율이 아니어도 상관 없음)

Latency-Based

마찬가지로 동일한 키(이름)와 타입을 갖는 DNS 레코드들에 대해 레코드 중 유저로부터 가장 낮은 지연율을 갖는 레코드를 우선적으로 라우팅하는 정책.

DNS 헬스체크

앞서 살펴본 routing policy를 사용해 DNS쿼리를 레코드에 매핑된 값에 따라 응답했다고 하자. 만약 해당 레코드에 매핑된 ip, 혹은 aws 리소스에 장애가 난 상태라면 어떻게 해야할까? route53은 이러한 장애조치를 위해 DNS 헬스체크를 제공한다.

  1. 엔드포인트 헬스 체크 aws의 전체 글로벌 리전의 15개 가량 헬스체커들이 있고, 이 헬스체커들이 모든 DNS 엔드포인트들에 대해 헬스체크 리퀘스트를 주기적으로 보낸다. 인터벌은 디폴트가 30초이지만 더 작거나 크게 설정할 수 있다. 전체 헬스체커의 18% 이상이 정상 응답을 수신하면 route53은 헬스체크가 정상이라고 간주한다. 응답이 200번대,300번대인 경우 통과시키며, 응답이 텍스트인 경우 특정 문자열 포함 여부에 따라서 pass/fail을 판별하도록 할 수도 있다. (응답의 5120바이트에 포함되어야 함) route53 헬스체크를 사용하려면 DNS 엔트포인트의 보안그룹 인바운드 설정에서 이를 직접 허용해야 한다.
  2. 계산된 헬스 체크 (Calculated Health Check) 여러 헬스 체크 결과를 계산해 하나의 결과로 간주하는 것. 각각의 인스턴스에 대한 헬스 체크 결과를 child 헬스체크라고 하면 , and/or/not 연산으로 이를 연산한 하나의 부모 헬스체크를 가진다. 최대 256개의 자식 헬스체크를 연산한 부모 헬스체크를 만들 수 있다. 또한, 자식 헬스체크의 정족수 이상의 통과가 부모 헬스체크의 결과가 되도록 할 수도 있다.
  3. Private Hosted Zone에 대한 헬스체크 글로벌 헬스체커는 공개된 ip에만 접근할 수 있기 때문에 프라이빗 도메인은 접근할 수 없다. 따라서 이경우 CloudWatch Metric을 생성하고 , 여기에 CloudWatch Alarm을 연결해서 이를 프라이빗 도메인과 연결한 뒤, 헬스 체크가 CloudWatch Alarm의 결과를 수신하도록 해야 한다.

Failover

레코드 유형 중 failover는 primary, secondary 레코드를 등록하고 dns 헬스체크를 사용하여 primary 레코드가 헬스체크에 실패할 시에 secondary 레코드로 라우팅하는 방법이다.

Geolocation

말 그대로 DNS쿼리의 Geolocation에 따라 레코드에 라우팅하는 정책. 대륙, 국가 등 다양한 지역을 설정할 수 있다.

GeoProximity

말 그대로 지역의 근접도로 DNS쿼리를 라우팅한다. 이 때, 원하는 지역에 원하는 bias를 부여하여 좀 더 범위를 확장시킬 수 있다. 즉, bias 가 0인 두 리전의 레코드가 있을 때 두 지역의 정확히 지역적 중간지점에서 근접도가 동일해지지만 bias가 한쪽이 높다면 해당 bias 만큼 근접도가 동일해지는 위치가 지역에서 멀어진다.(더 멀리서도 근접도가 동일해진다.) 한 지역의 트래픽을 다른 지역으로 이동시킬 때 유용하다.

Multi-value

하나의 DNS 쿼리에 대해 (동일한 키/이름을 갖는)복수의 레코드들을 응답한다. 이 때 헬스체크를 연동해 정상 상태인 레코드들만 응답할 수도 있다. Simple 정책에서 multi-value 레코드를 반환할 수도 있지만 이 때는 헬스체크를 연동할 수 없다.

도메인 등록 vs DNS 서비스

도메인 등록 서비스는 GoDaddy, Amazon Registrar 등의 업체에서 제공하며 일정 비용을 지불하고 도메인에 대한 소유권을 얻는 것이다. 보통 도메인을 구매/등록하면 이를 관리하는 DNS 서비스도 제공하는 것이 일반적이나, 두 개가 동일하지는 않다. 즉 도메인 등록을 한 뒤 이를 관리하는 서비스는 다른 업체를 이용할 수도 있다. 예를 들어서 도메인을 GoDaddy에서 구매한 뒤 이를 Route 53에서 관리하려면, GoDaddy의 NameServer에 Route53에 생성된 public hosted zone의 네임서버 IP를 입력하면 된다.