理系学生日記

おまえはいつまで学生気分なのか

Zone Apexに対するALIAS(ANAME)レコードとその動作

Zone Apexとは

まずzone apexという定義はどこにあるのかと探してみると、RFC8499の7. Zonesにありました。 それなりに長いので一部だけ引用すると以下のようになっています。

Apex: The point in the tree at an owner of an SOA and corresponding authoritative NS RRset. This is also called the "zone apex".

他のサイトでも多く解説があるように実質的にはドメイン名自体のことで、example.comというドメインを考えると、Zone apexはexample.comになるでしょう。

Zone ApexをCNAMEに設定できない理由

example.comというドメインを取得した場合、その主となるWebサイトにexample.comというAレコード、あるいはCNAMEレコードを振りたいという要望が出ます。

しかし、example.comというドメインを持つサイトをELBやCloudFrontでサーブしようとした場合、そのIPアドレスは動的に変化します。設定すべきIPアドレスか確定しない状態では、Aレコードを設定するのは困難(面倒)です。

ではCNAMEレコードとして、AWS等が自動設定するELBやCloudFrontのホスト名を設定すれば良いのでしょうか。 この選択肢は通常取れません。なぜなら、それはプロトコルエラーになるからです。 RFC1912では以下のように、CNAMEレコードは他のレコードと共存できないことを明記しています。

2.4 CNAME records

A CNAME record is not allowed to coexist with any other data.

通常Zone ApexにはNSレコードが設定されるため、上記の制約を鑑みると、Zone ApexにCNAMEは設定できないということになってしまいます。

AWS上でのZone apexの使用

これは良く知られているところですが、AWSでは上記の問題のために、ALIASレコードという独自レコードを定義しています。 これは、以下の3種類のリソースに対しDNSクエリをリダイレクトしてくれるもので、CNAMEレコードを使用しないためZone Apexでも使用できます。

  • Amazon S3 buckets
  • CloudFront distributions
  • Another record in the same Route 53 hosted zone

ALIASレコードとCNAMEレコードの違いについては、Choosing between alias and non-alias recordsにまとまっています。

AWS以外ではどのような対応がある?

AWSにおけるALIASレコードの振る舞いは、CNAME Flattening、ANAMEレコードといった呼ばれ方をしており、いくつかのDNSベンダーで対応しているようです。

DNS Made Easyでは、どのようにANAMEレコードを実現しているかをBlogエントリで公開していました。

  • ANAMEレコードの解決先ホストのIPアドレスを保持しておき、ANAMEレコードのクエリがくると当該のIPアドレスを返却する
  • 当該ホストのIPアドレスの変更はモニタリングしておく

非常にシンプルな動きです。これはもうほとんどAレコードの動作であって、CNAMEに対してANAMEという用語を持ってくるのはおしゃれですね。