CDNを利用する上で避けては通れないのがDNSとの関係です。CNAMEレコードには制約事項がありCDNを利用する上で課題となる場合があります。今回はApexドメインという特殊なドメインとCNAMEレコードの制限についての紹介です。
CNAMEレコードとは
CDNはDNSの仕組みをうまく利用しアクセス元から一番近いエッジサーバーのIPアドレスを応答後、最終的にネットワーク的に近い場所にあるエッジサーバーへ誘導します。これらのロジックを利用している関係上、CDN事業者への切り替えはCDNベンダーが提供するサブドメインにCNAMEレコードを定義する方式が必須と言っても過言ではありません。
まず、CNAMEレコードについておさらいです。CNAMEとは既に定義されてるドメイン名の別名を定義することです。おなじみのAレコードは以下のようなフォーマットでドメイン名とIPアドレスを1対1で紐付けます。※DNSの機能などによってこの限りではありませんが今回は割愛します。
・通常のAレコード
www.redbox.ne.jp A WebサーバーIPアドレス
CNAMEレコードは、以下のようにIPアドレスではなくホスト名(FQDN)を指定し、最終的に指定したホスト名のAレコードを参照させる仕組みです。
・CNAME利用時
www.redbox.ne.jp CNAME test.redbox.ne.jp
CNAMEは、CDNのようにベンダーが提供するサービスにおいて、独自ドメインを利用するために用いられることが多いです。
代表的なサービスとしては、Heroku、AWS(ALB・CloudFront)、github pages、Google Appsなどが挙げられます。CDNは多数のエッジサーバー群のIPアドレスから成り立っており、アクセス元から近いエッジサーバーに都度誘導する必要があるため、Aレコードで直接エッジサーバーのIPアドレスを指定できません。そのため、応答するIPアドレスが都度変化に対応できるよう別名が定義できるCNAMEレコードを利用します。
CNAMEの制約
CDNに限らず外部サービスを独自ドメインで利用する上で、CNAMEレコードの設定は欠かせません。便利なCNAMEレコードですが、実はRFC 1912 で他のレコードと同居できないという制約があります。
2.4 CNAME records
A CNAME record is not allowed to coexist with any other data.
an A record, or even a TXT record. Especially do not try to combine CNAMEs and NS records like this!
具体的に以下のようなレコードは設定ができません。
・同じドメイン名で複数CNAME設定すること
www.redbox.ne.jp. CNAME cdn1.redbox.ne.jp.
www.redbox.ne.jp. CNAME cdn2.redbox.ne.jp.
・CNAME以外のレコード(Aレコード)との同居
www.redbox.ne.jp. CNAME cdn1.redbox.ne.jp.
www.redbox.ne.jp. A 1.2.3.4
・MXレコードとの同居
redbox.ne.jp. CNAME cdn1.redbox.ne.jp.
redbox.ne.jp. MX mail.redbox.ne.jp.
・NSレコードとの同居
redbox.ne.jp. CNAME cdn1.redbox.ne.jp.
redbox.ne.jp. NS ns1.redbox.ne.jp.
Route53などのクラウド型DNSサービスの多くは、RFCでNGとなるレコードは登録できないようになっています。しかし、DNSサーバー(bind、djbdns、NSD等)で自社DNSサーバーを運用している場合は注意が必要です。それは、クラウド型DNSサービスのように警告がでるわけではなく、そのまま設定できてしまうソフトウェアもあるためRFCに従ったレコードを登録しないといけません。
自前DNSサーバーで間違った登録した際の影響
もし誤って自前DNSサーバーにCNAMEと他のレコードを一緒に設定してしまうと、 正しく名前解決できなくなります。 よって、ブラウザでアクセスできなかったりメールが届かないといった問題が起こるようになります。
先ほどのようにMXレコードと被っていると、メールが突然送れなくなりますし、NSレコードと被っていると全てのレコードが参照出来ず、そのドメインで設定されているサービスが全て名前解決できなくなるという最悪の事態も起こりえます。そのため、自前DNSサーバーでCNAMEを設定するときはしっかり既存のレコードに何が登録されているか確認することをお勧めします。
CNAMEレコードが利用できないApexドメインとは?
ここまではCNAMEレコードの制約とおさらいでした。ここからは本題のCNAME設定ができないApexドメインについてご紹介します。Apexドメイン(Naked Domainとも呼ばれる)とは、ホスト部が無いドメインのことを指します。
Apexドメインの例:redbox.ne.jp
(www.redbox.ne.jpはwwwが付与されているためApexドメインではありません。)
Zone Apex(ドメイン名そのもの)のDNS設定では、最低でもNS(ネームサーバ)レコードの指定が必要であるため、既にホスト部がないドメイン名のNSレコードが必ず存在していることになります。おそらく皆様のDNSサーバ-のレコードにも同じようにNSレコードが登録されているはずです。ApexドメインをCNAME設定しようとすると、既にNSレコードが存在するため、他のレコードと共存することができないという制約に引っかかり結果定義ができないということになります。
NSレコードが存在するためCNAME追加できない例
redbox.ne.jp CNAME aaa.redbox.ne.jp
redbox.ne.jp NS ns.redbox.ne.jp
CNAMEの制約を回避するAliasレコード
大手AWSも従来までDNSサービス Route53にてApexドメインを利用しているユーザーは、AWSで提供しているALBやCloudFrontにCNAMEすることができませんでした。しかし、Route53はAliasレコードという機能を実装しCNAMEの制約を回避しています。
Aliasレコードとは
Aliasレコードとは、DNSサーバー内部ではCNAMEのような別名として扱い外部DNSから参照される際にAレコードとして見せるという機能です。
CDNはALBやCloudFrontなど状況に応じて割り当てIPアドレスが変更になりますが、Aliasレコードを設定すると、Aliasレコードの先のFQDNに紐付いているIPアドレスを変化に応じて返すような動作となります。しかし、AliasレコードはあくまでDNSベンダー独自実装となり、AWSのように独自ドメインや外部サービスに対してApexドメインをAlias設定できない場合もあるため、事前にしっかり仕様を確認しておくことがとっても大事です。
ApexドメインでCDNを利用する方法
ApexドメインをCDNで利用したい場合、CNAMEは使えません。ではどうすれば利用できるようになるのかいくつか方法をご紹介します。
CNAME Flattening(Alias)機能つきDNSサービスの利用
現在CNAMEレコードで設定する外部サービスは以前よりかなり多くなってきました。また、ブランディングなどの目的でなるべくわかりやすく短いドメインを利用する目的からApexドメインが用いられるケースも多くみられます。このような背景から、Apexドメインに対応したDNSサービスというのも増えてきました。
一番現実的なのはCNAME Flattening対応DNSサービスに乗り換えてしまうことです。CNAME Flatteningとは以下のようにApexドメインに対してCNAMEレコード設定を行い、権威DNSがCNAMEで定義された先のIPアドレスを検索しそのIPアドレスをクライアントに応答します。これにより、通常他のレコードと同居できないというCNAMEの制約をDNSサーバーの振る舞いで回避する機能です。
・CNAME Flattingレコード例
redbox.ne.jp CNAME aaa.redbox.ne.jp
aaa.redbox.ne.jp A 1.2.3.4
※redbox.ne.jpでレコードを参照すると1.2.3.4が返却される
CNAME Flattening対応DNSベンダーは以下の通りです。
CNAME Flattening(Aliasレコード)対応ベンダー
・Gehirn DNS(サービス自体は米CloudFlareのDNS)
・dozens(国産自前DNS)サービス終了
・Route53(AWS内のサービスにしか利用できない制限あり。)
CDNベンダーのDNSサーバーを利用
大手CDNベンダーではDNSサービスも同時に提供していることがあります。これは、CDNベンダーのGSLBに直接登録することでApexドメインの利用を実現していますが、結局のところDNS事業者を変更することには変わりありません。
ANAMEとは
AliasレコードはDNSサーバー内部ではCNAMEのような扱いをし、外部からの応答はあくまでRFCに順序したAレコードのように振る舞う機能で技術でカバーしている感が否めません。そのためAWSのように、実は外部ドメインに対して利用できないなどの制約も存在します。そこで、近年ではANAME(Address-specific DNS aliases)というレコードの定義が進められています。
ANAMEレコードはCNAMEと同じような動きをしますが、Aliasレコードなどと異なりAまたはAAAAレコードへの問い合わせのみリダイレクトを行う動作をします。よって、ApexドメインでMXレコードやNSレコードなどがあったとしても、AやAAAAレコードがなければCNAMEのような振る舞いが正式に可能となります。
まとめ
CDNを利用する上でCNAMEレコードは切ってもきれない関係です。現在利用しているドメインがApexドメインの場合、まず利用中のDNSサーバーがApexドメインに対応しているかどうか確認しましょう。そして、Apexドメイン対応といってもDNSベンダー独自仕様の可能性もあるため外部ドメインに対して利用できるかどうかも合わせて確認する必要があります。
CDNの動作確認も完了し、いざ切り替えするタイミングで慌てないようCDN導入前にしっかりと現状を制約事項を確認しておくことが重要です。
ANAMEが正式策定された際には、AliasレコードのようにDNSベンダー独自仕様に振り回されること無く統一された取り決めが浸透するともっと使いやすく便利になってくるでしょう。