CNAMEレコードとAレコードの違い — SaaSに『CNAMEを設定してください』と言われたときDNS管理画面の何処に入れるか

初級InfraDB編集部

TL;DR

SaaSの設定画面に書いてある値が「数字」(例: 203.0.113.10)ならAレコード、「ドメイン名」(例: cname.vercel-dns.com)ならCNAMEレコードに設定します。ルートドメイン(example.com)にはCNAMEを設定できないのが標準仕様で、Cloudflareのフラット化機能で回避できます。


SaaSの設定画面に「以下のCNAMEレコードを設定してください」と書いてある。DNS管理画面を開いたはいいが、左の欄に何を入れ、右の欄に何を入れれば良いのか分からない——そこから始めましょう。

まず結論を書きます。SaaSの設定画面に書いてある「設定の値(右辺)」を見てください。数字が並んでいればAレコード、文字列(英字のドメイン名)が書いてあればCNAMEレコードです。これだけ覚えれば、設定画面で迷わなくなります。

この記事では、SaaSのカスタムドメイン設定で詰まりやすいポイントを順に書きます。GitHub PagesとVercelの具体的な設定手順、ルートドメインでCNAMEがエラーになる理由と回避策、設定後の確認方法まで一通り書きます。

DNSレコード全体の役割についてはDNSレコードとは何かもあわせて参照してください。


AレコードとCNAMEレコードは何が違いますか?

Aレコードはドメインを「IPアドレス(数字)」に直接向けます。CNAMEレコードはドメインを「別のドメイン名(文字列)」に向けます。SaaSの設定値が数字ならA、ドメイン名ならCNAMEです。

1行で覚える定義

  • Aレコード: ドメインをIPv4アドレス(203.0.113.10 のような数字4つ区切り)に向けるレコード
  • CNAMEレコード: ドメインを別のドメイン名(cname.vercel-dns.com のような英字の文字列)に向けるレコード
AレコードCNAMEレコード
右辺の値IPアドレス(数字)ドメイン名(文字列)
主な使い場面自社サーバーのIPを直接指定外部SaaSのドメイン名を指定
ルートドメインへの設定できるできない(標準仕様)
IP変更時の追従手動でAレコードを更新する向け先のA/AAAAが変われば自動追従

「数字か文字列か」で迷わない

SaaSの設定画面には必ず「設定してほしいレコードの値」が書いてあります。その値を見て、次のルールを当てはめてください。

  • 203.0.113.10 のように数字とドットだけAレコードに設定する
  • cname.example-saas.com のように英字のドメイン名CNAMEレコードに設定する

SaaSがCNAMEを指定する理由は、接続先のIPアドレスが変わってもこちらの設定を変えずに済むからです。たとえばVercelがサーバーを増やしたり構成を変えたりしても、Vercel側のCNAMEターゲットが内部で更新されるため、あなたのDNS設定はそのままで追従できます。


SaaSに「CNAMEを設定してください」と言われました。DNS管理画面の何処に入れますか?

SaaSが指示する「ホスト名」をDNS管理画面の「NAME(またはHOST)」欄に、「ポインター先のドメイン名」を「VALUE(またはPOINTS TO)」欄に入力します。欄の名前はサービスによって異なりますが役割は同じです。

SaaS側の設定画面とDNS管理画面の対応

SaaSの設定画面には「以下のDNSレコードを追加してください」という形で、設定すべきレコードの情報が表示されます。典型的な表示例は次のとおりです。

Type: CNAME
Host: www
Value: cname.vercel-dns.com

または:

Type: CNAME
Name: www.example.com
Points to: your-username.github.io

この情報をDNS管理画面に入力するときの対応は次のとおりです。

SaaS画面の項目名DNS管理画面の対応欄入力する内容
Host / Name / ホスト名NAME(またはHOST)www(またはwww.example.com
Value / Points to / 向き先VALUE(またはPOINTS TO / ANSWER)cname.vercel-dns.com 等のドメイン名
TypeTypeCNAME を選択

NAME欄の入力形式に注意

DNS管理画面のNAME欄に入力する形式は、サービスによって異なります。

  • www とだけ入れる形式(末尾にドメイン名を自動補完する)
  • www.example.com と完全なドメイン名で入れる形式

SaaSの指示に書かれている形式に従ってください。「www」と書いてあれば「www」だけを入力します。「www.example.com」と書いてあれば完全な形で入力します。独自に短縮しないことが重要です。

GitHub Pagesのカスタムドメイン設定手順

GitHub Pagesでカスタムドメインを使う場合、サブドメイン(www.example.com)はCNAMEで設定します。

  1. GitHubの対象リポジトリを開き、「Settings」→「Pages」を開く
  2. 「Custom domain」欄に使いたいドメイン(www.example.com)を入力して「Save」をクリックする
  3. 画面に「Add a CNAME record…」という指示が表示される
  4. DNS管理画面を開き、次のCNAMEレコードを追加する
NAME(またはHOST): www
VALUE(またはPOINTS TO): your-username.github.io
TYPE: CNAME

your-username の部分はGitHubのユーザー名(または Organization 名)に置き換えてください。

  1. DNS管理画面で保存する
  2. GitHubの設定画面に戻り、DNSの確認が完了するまで待つ(数分〜数時間かかる場合がある)

Vercelのカスタムドメイン設定手順

VercelでカスタムドメインのCNAMEを設定する手順は次のとおりです。

  1. Vercelのプロジェクト画面を開き、「Settings」→「Domains」を開く
  2. 使いたいドメイン(例: www.example.com)を入力して「Add」をクリックする
  3. 画面にCNAMEの設定情報が表示される(Vercelが指示する値はプロジェクトによって異なるため、必ず画面の指示を確認する)
  4. DNS管理画面を開き、指示に従ってCNAMEレコードを追加する
NAME: www
VALUE: cname.vercel-dns.com(Vercelが指示した値を入力)
TYPE: CNAME
  1. DNS管理画面で保存する
  2. Vercelの画面でDNSの検証が完了するまで待つ

ルートドメイン(example.com)にCNAMEを設定しようとしたらエラーになりました。なぜですか?

ルートドメイン(zone apex)にはCNAMEを設定できないのがDNSの標準仕様です。ルートドメインには必ずNSレコードとSOAレコードがあり、CNAMEはこれらと共存できません。操作ミスではなく仕様です。

「wwwはできたのに」という状況について

www.example.com(サブドメイン)にはCNAMEを設定できたのに、example.com(ルートドメイン)では同じ操作がエラーになった——この状況は非常によくあります。操作を間違えたわけではなく、DNSの仕様としてルートドメインへのCNAMEが禁止されているためです。

ルートドメインには、そのドメインのDNSを管理するNSレコードとSOAレコードが必ず存在します。CNAMEは「このドメインのすべての情報を別名に委ねる」という意味のレコードであるため、NSやSOAと共存できません。このためDNSの仕様として、zone apex(ルートドメイン)へのCNAMEは設定できないと定められています。

解決策1: Aレコードで設定する

最も一般的な解決策は、ルートドメインにはCNAMEの代わりにAレコードを使うことです。

SaaSがIPアドレスを提供している場合:

NAME: @ (または空欄、または example.com そのまま)
VALUE: 203.0.113.10(SaaSが指示したIPアドレス)
TYPE: A

ただし、SaaSのIPアドレスが変更されたとき、こちらのAレコードも更新する必要があります。SaaSによっては「ルートドメインにはAレコードでこのIPを設定してください」という指示を出しているケースがあります。SaaSの指示画面を必ず確認してください。

解決策2: CloudflareのCNAMEフラット化を使う

CloudflareのCNAMEフラット化を使えば、ルートドメインにもCNAMEのような設定ができますか?

Cloudflareのフラット化(CNAME Flattening)機能を使うと、ルートドメインにCNAMEを設定できます。Cloudflareが内部でCNAMEが指すIPアドレスを調べ、CNAMEの代わりにIPアドレスを返します。

Cloudflareをネームサーバーとして使っている場合、CNAME Flattening(CNAMEフラット化)という仕組みを利用できます。Cloudflareの管理画面でルートドメイン(@)にCNAMEレコードを追加するだけで、Cloudflareが内部でCNAMEが指すドメインのIPアドレスを解決し、外部にはIPアドレスとして返します。

設定手順:

  1. Cloudflareの管理画面を開き、対象ドメインのDNSレコード画面を開く
  2. 「レコードを追加」をクリックする
  3. タイプを「CNAME」に設定する
  4. 名前に @(ルートドメインを意味する)を入力する
  5. 「ターゲット」にSaaSが指示したCNAMEの値を入力する
  6. 保存する

CloudflareがルートドメインへのCNAMEを受け付け、内部でフラット化してIPアドレスとして返すため、zone apexへのCNAME制約を回避できます。

詳細はCloudflareの公式ドキュメントを参照してください: Cloudflare CNAME Flattening

AWSを使っている場合はRoute53の「Aliasレコード」が同等の機能を持ちます。


CNAMEを設定したのにサイトが表示されません。確認することは何ですか?

CNAMEの右辺(ポインター先)のドメインが正しく設定されているか、nslookup -type=CNAME 自分のサブドメイン で確認します。ターゲット先が存在しない(Dangling CNAME)場合、DNSは応答できません。

CNAMEを設定してもサイトが表示されない原因

CNAMEを設定した後にサイトが表示されない場合、原因は大きく3つに絞られます。

原因1: CNAMEの右辺(ターゲット)のドメイン名が間違っている SaaSが指示したCNAMEの値をコピーした際に誤字が混入した、またはドメイン名が古くなっているケースです。SaaSのダッシュボードに表示されているCNAMEの値を再確認してください。

原因2: ターゲット先のドメインが存在しない(Dangling CNAME) CNAMEが指している先のドメインが、SaaS側で削除または変更されている状態です。たとえば、SaaSのプロジェクトを削除・リセットした後、古いCNAMEターゲットが無効になるケースがあります。Dangling CNAME(宙ぶらりんのCNAME)と呼ばれ、DNSは問い合わせを受けてもIPアドレスを返せないため、サイトにアクセスできません。

原因3: TTLの待ち時間中 DNSの変更は即時には反映されません。TTL(キャッシュの有効期限)が切れるまで、各地のDNSサーバーが古い情報を返し続けます。後述のnslookupで確認して正しく返ってきていれば、TTLの待ち時間中と判断できます。

nslookupでCNAMEを確認する手順(Windows)

Windowsのコマンドプロンプトで次のコマンドを実行します。www.example.com の部分を確認したいサブドメインに置き換えてください。

nslookup -type=CNAME www.example.com

出力パターン別の読み方:

CNAMEが正しく設定されている場合:

Server:  dns.example.net
Address:  192.168.1.1

Non-authoritative answer:
www.example.com     canonical name = your-username.github.io

canonical name = に続いてSaaSのドメインが表示されれば、CNAMEは正しく設定されています。サイトが表示されない場合はTTLの待ち時間中か、SaaS側の設定が未完了の可能性があります。

CNAMEが設定されていない場合(Aレコードのみ、またはレコードなし):

Server:  dns.example.net
Address:  192.168.1.1

www.example.com     internet address = 203.0.113.10

CNAMEではなくAレコードが返ってきている状態です。設定がCNAMEになっていない、またはCNAMEを設定したつもりがAレコードとして保存されているケースです。

Dangling CNAMEの場合(CNAMEは設定されているがターゲットが存在しない):

Server:  dns.example.net
Address:  192.168.1.1

Non-authoritative answer:
www.example.com     canonical name = deleted-project.example-saas.com
*** dns.example.net can't find deleted-project.example-saas.com: Non-existent domain

CNAMEの設定は正しいが、CNAMEが指している先のドメインが存在しない状態です。SaaSのダッシュボードに戻り、CNAMEターゲットの値が現在も有効かを確認してください。

設定ミスかTTL待ちかの切り分け

nslookupでCNAMEレコードが正しく返ってきている場合は、設定自体は正しく反映されています。サイトが表示されない場合は、SaaS側の設定(SaaSのダッシュボードでDNS検証が完了しているか)を確認してください。

nslookupでCNAMEが返ってこない場合は、まだDNSに変更が反映されていないか、設定に誤りがあります。TTLの仕組みと反映待ちの詳細はDNSのTTLと反映待ちを参照してください。

macOSやLinuxでは dig -t CNAME www.example.com で同じ情報を確認できます。

同じドメインでメールも使っている場合、メールの宛先を決めるのはCNAMEでもAでもなくMXレコードです。切り分けの対象が「サイトではなくメール」であれば、MXレコードの設定方法を参照してください。


まとめ

設定前の判断ルール:

  1. SaaSの設定値が数字(IPアドレス) → Aレコードに設定する
  2. SaaSの設定値がドメイン名(英字の文字列) → CNAMEレコードに設定する
  3. ルートドメイン(example.com)にCNAMEを設定しようとしてエラーになった → Aレコードで代替するか、Cloudflareのフラット化機能を使う

設定後の確認:

nslookupで canonical name = が返ってくれば設定は反映されています。サイトが表示されなければSaaS側の設定(ダッシュボードのDNS検証ステータス)を確認してください。

CNAMEとAの区別は、技術の話に見えて、実は設定画面に書いてある値を読めるかどうかの話です。数字が書いてあればA、ドメイン名が書いてあればCNAME。それだけ分かれば、SaaSの設定ページの指示をそのままDNS管理画面に入れられます。zone apexのエラーも、Cloudflareを使っているなら回避策があります。知識が足りないのではなく、知っておくべきポイントが一つ抜けていただけです。

SaaSのカスタムドメイン設定やDNSまわりで詰まっているなら、メールでご相談ください

DNSCNAMEAレコードCloudflareSaaS

関連記事

ネットワーク・DNSAAAAレコードとは — Cloudflareの設定画面に知らないAAAAがある場合の確認手順と、設定が必要かどうかの判断基準ネットワーク・DNSDNS TTLとは — 設定を変えたのに古いサイトが見えると言われる理由と、あと何分待てばいいかの調べ方ネットワーク・DNSCloudflareのプロキシ(オレンジ雲)オンオフの選び方
記事一覧に戻る