Webサービスを公開する際、https://example.com(wwwなし)でもアクセスできるようにしたい、という要件はよくあります。
しかし、DNSの仕様上、example.com のようなゾーン頂点(Zone Apex)には通常のCNAMEレコードを設定できません。
そこで登場するのが、AWS Route 53の「Alias」やCloudflareの「CNAME Flattening」など、ゾーン頂点でCNAME相当の名前解決を行う機能です。
本記事では、www 付きドメインとゾーン頂点の違いから、いわゆる「裸ドメイン問題」、そしてその解決方法までを簡単に整理します。
1. wwwが付くドメインについて
www.example.com のように、先頭に www が付いたドメインは、example.com 配下のサブドメインです。
- example.com:ゾーン頂点(Zone Apex / Naked Domain)
- www.example.com:サブドメイン
DNSの構造としては、www は特別なものではありません。例えば、以下はいずれも example.com 配下の名前です。
www.example.commail.example.comapi.example.com
www は歴史的にWebサイトを表す名前として広く使われてきましたが、DNS上は単なるサブドメインの一つです。
サブドメインでは、条件を満たせばCNAMEレコードを利用できます。例えば、以下のような設定が可能です。
www.example.com
↓ CNAME
xxx.cloudfront.net
2. 裸ドメイン問題(Naked Domain Problem)とは?
裸ドメイン(Naked Domain)とは、www などのサブドメインを含まないドメインそのものを指します。例えば example.com が裸ドメインであり、DNSでは**ゾーン頂点(Zone Apex)**にあたります。
ここで問題になるのが、CDNやPaaSなどのサービスを利用する場合です。
例えば、サービス側から xxx.cloudfront.net のようなホスト名が提供され、example.com を直接紐付けたいケースがあります。
通常のサブドメインであれば、CNAMEを利用できます。
www.example.com
↓ CNAME
xxx.cloudfront.net
しかし、ゾーン頂点である example.com には、通常のCNAMEを設定できません。
なぜCNAMEを設定できないのか?
主な理由は2つあります。
① ゾーン頂点にはSOAやNSなどのレコードが存在する
ゾーン頂点には、ゾーンの管理に必要なSOAやNSなどのレコードが存在します。また、メールを利用している場合は、MXレコードなどが設定されることもあります。
② CNAMEは他のレコードと共存できない
DNSの仕様では、CNAMEが設定された名前には原則として他のレコードデータを共存させることができません。RFC 1034でも、CNAMEが存在する名前には他のデータを配置しないというルールが定義されています。
example.com
├─ SOA
├─ NS
└─ CNAME (※共存不可ため設定エラーになる)
このように、ゾーン頂点に通常のCNAMEを置くことができないのが「裸ドメイン問題」のポイントです。
3. 解決策:Apex向けのエイリアス機能
この問題を解決するため、DNSサービスではゾーン頂点でCNAME相当の名前解決を行う機能が提供されています。
サービスによって名称や実装方法が異なり、代表的なものとして以下があります。
- AWS Route 53:Aliasレコード
- Cloudflare:CNAME Flattening
- Google Cloud DNS:ALIAS(Preview)
これらはすべて同じDNSレコードタイプというわけではありませんが、まとめて「Apexエイリアス機能」と考えると分かりやすいでしょう。
4. 仕組みは「CNAMEをそのまま返さない」
例えば、CloudflareのCNAME Flatteningなどでは、ゾーン頂点に設定されたCNAME相当の情報をDNSサービス側で処理し、最終的なIPアドレスを返す仕組みが使われます。
【ユーザー】
│
│ example.com のIPアドレスは?
↓
【権威DNS】
│
│ 裏側でターゲットを名前解決
↓
【xxx.cloudfront.net】
│
│ A / AAAA
↓
【権威DNS】
│
│ IPアドレスを返す
↓
【ユーザー】
ユーザー側から見ると、以下のように名前解決できます。
example.com → IPアドレス
通常のCNAMEをゾーン頂点に直接配置するのではなく、DNSサービス側がCNAME相当の名前解決を処理することで、ゾーン頂点でも別のサービスを参照できるようにしています。
5. 主なDNSサービスの対応
現在は、主要なDNSサービスでこのようなApex向けのエイリアス機能が提供されています。
| 提供事業者 / サービス | 機能名称 | 概要 |
|---|---|---|
| AWS Route 53 | Aliasレコード | CloudFront、ELB、S3など、対応するAWSリソースをゾーン頂点から参照可能 |
| Cloudflare | CNAME Flattening | ゾーン頂点のCNAMEを名前解決し、最終的なIPアドレスを返す |
| Google Cloud DNS | ALIAS(Preview) | ゾーン頂点でCNAME相当の名前解決を行い、A/AAAAとして応答 |
AWS Route 53の場合
Route 53のAliasは、通常のCNAMEとは異なるRoute 53独自の機能です。
example.com
↓ Alias
CloudFront
CloudFrontなど一部のAWSリソースへのAliasクエリについては、DNSクエリ料金が発生しない仕組みもあります。(※「Aliasレコード自体がすべて無料」という意味ではありません)
また、Route 53のAliasは任意の外部ホスト名を自由に指定する汎用CNAMEではなく、対応するAWSリソースなどを対象とする機能です。
Cloudflareの場合
CloudflareではCNAME Flatteningという機能によって、ゾーン頂点でCNAMEを利用するような構成を実現できます。設定されたCNAMEのターゲットをCloudflare側で解決し、最終的なIPアドレスを返します。
Google Cloud DNSの場合
Google Cloud DNSでは、現在ALIAS(Preview)が提供されています。ゾーン頂点で利用でき、A/AAAA問い合わせに対してターゲットの名前解決結果を返す仕組みです。
6. 「wwwあり」と「wwwなし」の違い
ここまでの内容を整理すると、次のようになります。
wwwあり
www.example.com
↓
CNAME
↓
xxx.cloudfront.net
www.example.com はサブドメインなので、通常のCNAMEを利用できます。
wwwなし
example.com
↓
ゾーン頂点
↓
通常のCNAMEは設定できない
そのため、以下のようなDNSサービス提供機能を利用します。
example.com
↓
Route 53 Alias または Cloudflare CNAME Flattening
↓
CloudFront または サービスのホスト名
まとめ
www.example.comはexample.com配下のサブドメイン。example.comはDNSのゾーン頂点(Zone Apex)。- ゾーン頂点にはSOAやNSなどのレコードが存在するため、通常のCNAMEを設定できない。
- CNAMEは、同じ名前に他のレコードデータを共存させられないという制約がある(RFC 1034)。
- この制約を解決するため、DNSサービスではApexエイリアス機能(Route 53のAlias、CloudflareのCNAME Flattening、Google Cloud DNSのALIAS等)が提供されている。
- CDNやPaaSなどのホスト名を
example.comに関連付けたい場合は、利用するDNSサービスのApex向け機能を確認して適用する。
つまり、以下のように整理できます。
【wwwありの場合】
www.example.com ──(CNAME)──> サービスのホスト名 (※標準設定で可能)
【wwwなしの場合】
example.com ──(通常のCNAME不可)──> Apex機能(Alias/Flattening等) ──> サービスのホスト名
ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。
- 選考ではありません
- 履歴書不要
- 技術の話が中心
- 所要時間30分程度
- オンラインOK