CDN・WEB高速化ブログ

CDN とCNAME Apexドメインの制限

  • CDNとCNAME、Apexドメインの制限

CDNを利用する上で避けては通れないのがDNSとの関係です。CNAMEレコードには制約事項がありCDNを利用する上で課題となる場合があります。今回はApexドメインという特殊なドメインとCNAMEレコードの制限についての紹介です。

CNAMEレコードとは

CDNはDNSの仕組みをうまく利用しアクセス元から一番近いエッジサーバーのIPアドレスを応答後、最終的にネットワーク的に近い場所にあるエッジサーバーへ誘導します。これらのロジックを利用している関係上、CDN事業者への切り替えはCDNベンダーが提供するサブドメインにCNAMEレコードを定義する方式が必須と言っても過言ではありません。

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ドメインとは?

cdn dns

ここまでは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レコードとして見せるという機能です。

Aliasレコードの仕組み

CDNはALBやCloudFrontなど状況に応じて割り当てIPアドレスが変更になりますが、Aliasレコードを設定すると、Aliasレコードの先のFQDNに紐付いているIPアドレスを変化に応じて返すような動作となります。しかし、AliasレコードはあくまでDNSベンダー独自実装となり、AWSのように独自ドメインや外部サービスに対してApexドメインをAlias設定できない場合もあるため、事前にしっかり仕様を確認しておくことがとっても大事です。

ApexドメインでCDNを利用する方法

 

apex対応DNSサーバ

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)

Route53AWS内のサービスにしか利用できない制限あり。)

DNSimple

DNS Made Easy

CDNベンダーのDNSサーバーを利用

大手CDNベンダーではDNSサービスも同時に提供していることがあります。これは、CDNベンダーのGSLBに直接登録することでApexドメインの利用を実現していますが、結局のところDNS事業者を変更することには変わりありません。

ANAMEとは

 

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ベンダー独自仕様に振り回されること無く統一された取り決めが浸透するともっと使いやすく便利になってくるでしょう。

2018 11月 30th,|CDN|