みなさんはドメイン名そのものにCNAMEをマッピングしたいと思ったことはないでしょうか?
CNAMEの仕様により、通常下記のような設定は出来ません。
1 |
example.org. CNAME example.cname.jp. |
現状、CNAMEのマッピング先がAWSサービスのみという条件はありますが、Route 53なら同様の動作を実現できます。
今回はその説明をしたいと思います。
まず初めにそもそもなぜ、設定できないのでしょう?
これはDNSのRFC(インターネット技術の仕様)のひとつである RFC 1912 に記載されている制約が原因です。
RFC 1912には、下記のような記述があります。
CNAME record is not allowed to coexist with any other data.
In other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you can’t also have an MX record for suzy.podunk.edu, or an A record, or even a TXT record.
Especially do not try to combine CNAMEs and NS records like this!:
1 2 3 4 |
podunk.xx. IN NS ns1 IN NS ns2 IN CNAME mary mary IN A 1.2.3.4 |
日本語に訳すと、
CNAMEレコードを他のデータと共存させることはできません。
つまり、suzy.podunk.xxがsue.podunk.xxのエイリアスである場合、suzy.podunk.eduのMXレコード、Aレコード、さらにはTXTレコードも作成できません。
特に、CNAMEとNSレコードをこのように組み合わせないでください。
という意味になりますが、RFC 1912 原文のテキスト部分に誤字(suzy.podunk.edu ってどこから出てきた?)もあってやや分かりにくいと思います。
私なりに分かりやすいと思った形がこちらになるのですが、下記のようなことは出来ないということです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$TTL 3600 example.org. IN SOA www.example.org. root.example.org. ( 2019051000 ; serial 3H ; refresh 1H ; retry 2W ; expire 1M ) example.org. IN NS ns1.example.org. ←これもだめ example.org. IN NS ns2.example.org. ←これもだめ example.org. IN MX mail.example.org. ←これもだめ example.org. CNAME example-cname.org. ←これがあると ftp.example.org. IN A 123.456.789.001 mail.example.org. IN A 123.456.789.002 |
つまり、ある名前(上記であればexample.org)で CNAME を定義したら、もうその名前では他のあらゆるレコードを定義することができない(NSやMXで指定出来ない)という訳ですね。
ただしこれは、そもそもドメイン名そのものをCNAMEにしたことで発生する問題ですのでもちろん下記のような形式(www.example.orgにCNAMEを定義)であれば問題はありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$TTL 3600 example.org. IN SOA www.example.org. root.example.org. ( 2019051000 ; serial 3H ; refresh 1H ; retry 2W ; expire 1M ) example.org. IN NS ns1.example.org. example.org. IN NS ns2.example.org. example.org. IN MX mail.example.org. example.org. IN A 123.456.789.000 www.example.org. CNAME example-cname.org. ←他にどのレコードでも使われていないのでOK ftp.example.org. IN A 123.456.789.001 mail.example.org. IN A 123.456.789.002 |
しかし、example.org も www.example.org も同じCNAMEを利用したいというケースは大いにあると思います(CDNなど)。
CNAMEホスト側(上記であればexample-cname.org)の固定IPが変更されないということであれば、CNAMEを使わずに下記のようにすることで対応可能ですが、
ロードバランサーなどのように固定IPが変化する状況には対応できないため、利用は限定的になってしまいます。
1 2 |
example.org. IN A 123.456.789.000 www.example.org. IN A 123.456.789.000 |
また、ドメイン名そのものの example.org のCNAMEをwww.example.org として、www.example.orgのCNAMEを本来向けたいCNAMEにするということも
当然最初に記載した条件に当てはまってしまう為、出来ません。
1 2 3 |
example.org. IN NS ns1.example.org. ←これがだめになってしまう example.org. CNAME www.example.org. ←これがあるので www.example.org. CNAME example-cname.org. |
以上の理由により、ドメイン名そのものにCNAMEをマッピングすることは出来ないということになります。
前置きが長くなってしまいましたが、AWSのRoute 53でどうすれば設定可能かの説明に入ります。
AWSのRoute 53で実現する方法
まずAWSのRoute 53でも当然DNSの制約に準拠している必要があります。
AWSのRoute 53 ではどう実現しているかというと、独自拡張であるALIASレコードというレコードを利用することで可能となります。
独自拡張と言っても他のDNSが理解できなければ意味がありません。
ALIASレコードの実体はAレコードとなっており、そのため初めに説明したDNSの制約には違反しないことになります。
設定方法はとても簡単で通常のレコードを追加する際と同じく、Create Record Set をクリックして以下のような設定にするだけです。
例:CNAMEとしてAWSのロードバランサ(ELB)を指定したい場合
名前:example.org
タイプ:A-IPv4 address
エイリアス:はい を選択します。
エイリアス先:dualstack.ロードバランサのホスト名を入力. ※2
※2 先頭にdualstack. と入れることでIPv6にも対応
エイリアスホストゾーンID:エイリアス先を指定すると自動で入力されます。
ルーティングポリシー:シンプル
ターゲットの正常性の評価:はいを選択します。
登録結果はこちらです。
冒頭でも述べていますが、残念ながらRoute 53で指定出来るALIASレコードの指定先は現状AWSのサービスに限ります。
具体的には下記のサービスで利用可能です。
・CloudFront ディストリビューション
・ローカル化されたサブドメインがある Elastic Beanstalk 環境
・ELB ロードバランサー
・ウェブサイトエンドポイントとして設定された Amazon S3 バケット
設定方法は以上です。
最後にnslookup コマンドなどで問題がないか確認してみましょう。
それでは!