CDNにおけるCNAMEレコード利用の欠点とAmazon Route53のALIASレコードを利用した解決策

CDNを利用する際、エッジサーバーにユーザーの端末をルーティングするためにDNSのCNAMEレコードを使うことは一般的です。クライアントは、Webサイトのドメイン名->CDNのドメイン名->エッジサーバーのIPアドレスと2回の名前解決の後にエッジサーバーと接続します。

一方で、この方法には2つの欠点があります。

  1. DNSサーバーへの問い合わせが2回実行されるため遅延が大きくなる
  2. Zone Apex(bloomblock.netなど)のドメイン名にはCNAMEレコードを作れない

これらの欠点を解決する方法は、CDNベンダー各社から提供されており、条件が合えば解決することが可能です。

本記事では、AWSのDNSサービスであるAmazon Route53とCDNサービスであるAmazon CloudFrontを例として、CNAMEレコードを利用する場合の欠点と解決策について説明します。

目次

CDNにおけるCNAMEレコードの利用

CDNを利用する際、エッジサーバーにユーザーの端末をルーティングするためにDNSのCNAMEレコードを使うことが一般的です。

ユーザーの端末がエッジサーバーに接続するためには、DNSによる名前解決が必要です。弊社のホームページである www.bloomblock.net を例にして解説します。

まずはじめに、1. www.bloomblock.netの名前解決を行います。

この時、2. CNAMEレコードが返却され、abc.cloudfront.netを名前解決することを促します。 CNAMEレコードの登録は、bloomblock.netドメインの持ち主が行う必要があります。

次に、ユーザーの端末は、3. abc.cloudfront.netの名前解決を行います。

4. CloudFrontのネームサーバーはAあるいはAAAAレコードを返却し、エッジサーバーのIPアドレスを通知します。AはIPv4、AAAAはIPv6のアドレスを返却するために使用されます。ユーザーの端末がIPv6に対応しており、CloudFrontでIPv6を有効化している場合はIPv6で接続されます。

最後に、5. ユーザーの端末はエッジサーバーへ接続を行います。 ここでの接続は、HTTPのセッションを表しています。

以上の手順により、ユーザーの端末がエッジサーバーに接続でき、CDNを利用できるようになりました。

CNAMEレコード利用の欠点

ここまでCNAMEレコードを使用してエッジサーバー(CDN)へユーザーの端末を接続する流れを見てきました。

CNAMEレコードを使用する方法は、CDNを導入する一般的な方法ではありますが、欠点が2つあります。

名前解決にかかる時間が長くなる

1つ目の欠点は、DNSサーバーへの問い合わせが2回実行されるため、名前解決にかかる時間が長くなることです。CNAMEレコードを使用するとwww.bloomblock.netabc.cloudfront.netのそれぞれを名前解決する必要があります。 一度名前解決した結果はブラウザにDNSキャッシュとして残るため、この遅延は初回接続時(及びDNSキャッシュのTTLが切れた後)にしか発生しませんが、少なからずユーザー体験に悪影響があるでしょう。

Zone ApexをCDNにルーティングできない

2つ目の欠点は、Zone ApexをCDNにルーティングできないことです。 Zone Apexとは、ドメインの最上位レベルを指します。弊社のドメインの場合、bloomblock.netがZone Apexに当たります。wwwのつかないZone Apexは短くて覚えやすいことから、法人を中心に利用ニーズがあります。

残念ながら、Zone Apexでは、CNAMEレコードが利用できない制約があります。DNSの仕様では、CNAMEレコードが設定されているドメイン名には、他のどんなレコードも存在してはならないとされています。Zone Apexには、MXレコード(メール交換サーバーのアドレス)、NSレコード(ネームサーバー情報)、SOAレコード(ゾーンの権威情報)など、他の重要なレコードが必要です。したがって、これらの必須レコードとCNAMEレコードが共存することはできません。

この制約は、DNSの使用を定義しているRFC 1912の次の記載から読み取れます。

Don’t use CNAMEs in combination with RRs which point to other names like MX, CNAME, PTR and NS.

RFC1912 section-3.6.2

Amazon Route53のALIASレコードを使った解決

ここまで、CDNへのユーザーの端末のルーティングにCNAMEレコードを使う場合の2つの欠点を見てきました。

これらの欠点を解決する手段が各CDNベンダーから提供されています。解決策は、CNAMEレコードを使わないです。

Amazon Route 53では、CNAMEの代わりに利用できるALIASレコードが提供されています。ALIASレコードを利用するとwww.bloomblock.netをCloudFrontのエッジサーバーのIPアドレスに名前解決をするという設定が可能です。これにより、見かけ上はwww.bloomblock.netの名前解決をするとAレコード(あるいはAAAAレコード)が返却され一回のクエリでIPアドレスを取得することができます。

弊社のホームページもこの方法でCDNにルーティングしています。下記のようにwww.bloomblock.netを名前解決するとAレコードが返却されており、1度の名前解決でエッジサーバーのIPアドレスを取得できています。

$ dig www.bloomblock.net

www.bloomblock.net. 60 IN A 13.32.50.30
www.bloomblock.net. 60 IN A 13.32.50.71
www.bloomblock.net. 60 IN A 13.32.50.102
www.bloomblock.net. 60 IN A 13.32.50.25

Zone Apexであるbloomblock.netの名前解決をした結果が下記です。こちらも同様にAレコードが返却されています。

$ dig bloomblock.net 

bloomblock.net.         60      IN      A       13.32.50.71
bloomblock.net.         60      IN      A       13.32.50.25
bloomblock.net.         60      IN      A       13.32.50.102
bloomblock.net.         60      IN      A       13.32.50.30

IPアドレスチェッカーで13.32.50.71を検索するとこのIPアドレスがCloudFrontのものであることが分かります。

ただし、ALIASレコードは標準DNSの独自拡張であるため、DNSにRoute53、CDNにCloudFrontを利用した時だけALIASレコードは使用できます。 CDNはCloudFrontだがDNSはオンプレミス、DNSはRoute53だがCDNは他ベンダーといったケースではこの解決策は使えず、CNAMEレコードによるルーティングが必須になります。そのため、2回DNSにより名前解決が発生することは許容する、Zone ApexのドメインはCDNにルーティングしないという妥協が必要となります。したがって、特段の理由がない限りはCDNとDNSサービスは同じベンダーを利用することをおすすめしています。

AWS以外のベンダーでも同様の機能が提供されております。例えば、AkamaiではFastDNSのZone Apex Mapping (ZAM)、CloudflareではCloudflare DNSのCNAME flatteningという名前で提供されています。

おわりに

本記事では、CDNのエッジサーバーにユーザーの端末がルーティングされるようにCNAMEレコードを使う方法を紹介しました。

CNAMEを利用したルーティングは一般的に行われていますが、次のの2つの欠点がありました。

  1. DNSによる名前解決が2回実行されるため遅延が大きくなる
  2. Zone ApexのドメインはCNAMEできない

AWSのRoute53とCloudFrontを同時に使用している場合は、Route53のALIASレコードを使用することでCNAMEレコードを置き換えることができ、これらの欠点を解決することができます。

AWS以外でも、CNAMEを置き換えるレコードは各CDNベンダーから提供されているため、CDNとDNSで同じベンダーのサービスを利用している場合は、CNAMEの置き換えを検討することをおすすめします。

よかったらシェアしてね!

CD

目次