【小ネタ】Route 53 のホストゾーンに CNAME レコードと重複するドメイン名で MX レコードを登録しようとしたらきちんと怒られた

CNAME レコードと同一のドメイン名を持つレコードを登録してはいけません。Route 53 で登録を試みるとエラーを吐いてくれます。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンバンハ、千葉(幸)です。

Route 53 のホストゾーンに、「既存の CNAME リソースレコードセットと同じドメイン名」を持つレコードを登録しようとした際に、エラーが発生しました。

aaa.xxx.com.の DNS 名を持つ MX リソースレコードセットは許可されていません。ホストゾーンxxx.com.にすでに存在する、同じDNS名を持つ CNAME リソースレコードセットと抵触しているためです。」の意でメッセージが出ているのですが、なぜ怒られているのかが初見で分かりませんでした。

調べてみると極々基本的な部分の話であり、こんな基本的な部分を知らなかったんだなーというメモです。

目次

リソースレコードセットとは

まずはリソースレコードからです。以下のサイトが分かりやすかったです。

JPRS用語辞典|リソースレコード(RR)

リソースレコードとは DNS においてドメイン名などの情報を定義したデータのことを表し、「レコード」「RR」などと呼ばれることもあります。タイプの種類により、「 A レコード」「 CNAME レコード」などと呼ばれることも多いです。


(上記サイトより画像引用)

リソースレコードのまとまりをリソースレコードセット(RRset)と呼びます。特に「同じドメイン名、タイプ(型)、クラスを持ち、データが異なるリソースレコードの集合」とのことです。

リクエストに対しては、リソースレコードセット内の全てのリソースレコードを順不同で応答することになります。


(画像引用元:JPRS用語辞典|RRset(リソースレコードセット)

Route 53 のホストゾーンにおいては「リソースレコードセット」の単位で登録を行なっていくことになります。上記で確認した内容を当て込んでみるとこのようなイメージとなります。


(画像引用元:https://aws.amazon.com/jp/premiumsupport/knowledge-center/route-53-reachable-resource-record-sets/

CNAME レコードの制約

RFC 1912 には以下の記載があります。

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

平たく言うと、「CNAME リソースレコードが持つドメイン名」と同じドメイン名を持つ リソースレコードを登録してはいけない、ということです。ここではそのことを「 CNAME レコードの重複」と表現します。

CNAME レコードは「Canonical name(正式名)」に対して「Aliases(エイリアス、別名)」を設定するように機能します。一つのエイリアスが指し示す正式名が複数存在すると差し支えがあるため、重複を避ける必要があるということです。(一つの正式名に対して複数のエイリアスを設定することは可能です。)

多くの DNS サービスプロバイダでは、この仕様に則り、 CNAME レコードの重複が起こらないよう制御しています。Route53 を DNS サービスとして利用する際も同様で、重複するようなレコードセットの登録を試みた際には冒頭で確認したようなエラーが表示されます。

エラー内容については、トラブルシュートに関するページで記述があります。

AWS CLI を使用して Amazon Route 53 のリソースレコードセットを作成する際に発生するエラーのトラブルシューティング

ホストゾーン「domain.com.」内に CNAME リソースレコードセット「b.domain.com.」がある状態で、同名の MX レコードを追加しようとした際に出るエラーの例が以下です。

RRSet of type MX with DNS name b.domain.com. is not permitted because a conflicting RRSet of type CNAME with the same DNS name already exists in zone domain.com.

冒頭の画像で表示されているメッセージと同一の内容です。

このエラーに対する注意書きとして以下があります。

If you have a CNAME resource record set for a subdomain name (such as test.example.com), you can't have an MX record, an A record or a TXT record for that same subdomain.

Create your MX record in a different record set in the same hosted zone.

CNAME レコードとの重複を避け、別のドメイン名を持つレコードセットをセットするように書かれています。

DNS 一般のそもそもの仕様として重複が許容されておらず、それに則って Route 53 がエラーを返してくれるということを理解しました。

Zone Apex で CNAME レコードを使用できないのは NS レコードと重複するから

関連して学んだことです。

Zone Apex に CNAME は対応していないけれど、エイリアスレコードは対応している」。某資格試験の勉強のために、このようなワードを記憶していました。 Zone Apex とはゾーンの最上位ノードを表すもので、平たく言えば「ホストゾーンと同一のドメイン名」のことです。

「example.com.」というホストゾーンにおいて、ドメイン名として「example.com.」を指定して CNAME レコードを登録することはできません。これが Zone Apex に対応していないという意味です。

同一の名称で A レコードを登録することはできます。一般的に A レコードでは値として IP アドレスを指定します。しかしながら ELB や CloudFront といった AWS リソースは IP アドレスが可変であるため、A レコードでの登録が難しい側面があります。

そこで機能するのが Route 53 で用意されているエイリアスレコードというものです。分類上は A レコードでありながら、裏側では CNAME のように「 AWS リソースが持つデフォルトドメイン名」に対してエイリアスを設定できるイメージです。

エイリアスレコードについて詳細は以下のエントリを参照してください。

と、ここまでは自分の中で理解できていたのですが、そもそもなぜ CNAME では Zone Apex に対応していないのか?については深く考えていませんでした。(ちなみに「エイリアスレコード」は Route 53 独自の機能ですが、 CNAME と Zone Apex の関係については DNS 一般の考え方です。)

改めて考えると、その理由は「 NS レコードと重複するから」であることが理解できました。NS レコードは当該ゾーンに対する権威 DNS サーバを定義するもので、ゾーンごとに必ず存在します。ホストゾーン「example.com.」においては、同一のドメイン名「example.com.」を持つ NS レコードがすでに登録されているため、Zone Apex (=ホストゾーンと同一のドメイン名)でエイリアスを作成することができないというわけでした。

終わりに

ものすごく根本的な部分を抑えられていなかったことを自覚しました。気付けていなかったことに気付けるというのはとても嬉しいことです。

ちなみに冒頭のケースでは、既存の CNAME レコードをエイリアスレコードに置き換え可能であったため、MX レコードのドメイン名を当初の予定から変更することなく重複が回避できました。

エイリアスレコードは現在以下の AWS リソースに対応しているため、使用できる環境では積極的に使用することをおすすめします。

  • Amazon API Gateway リージョン固有のカスタム API またはエッジ最適化 API
  • Amazon VPC インターフェイスエンドポイント
  • CloudFront ディストリビューション
  • Elastic Beanstalk 環境
  • ELB ロードバランサー
  • AWS Global Accelerator アクセラレータ
  • 静的ウェブサイトとして設定されている Amazon S3 バケット
  • 同じホストゾーン内の別の Route 53 レコード

エイリアスレコードと非エイリアスレコードの選択 - Amazon Route 53

以上、幸(千葉)でした。

参考