DNS レコード選び方:A・AAAA・CNAME・ALIAS・TXT・MX の使い分けと apex CNAME 問題

約11分

ドメインを運用していると「ルートドメインを CDN に向けたい」「サブドメインを別サービスに飛ばしたい」「メールサーバを設定したい」など、DNS レコードを書く場面が頻繁に出てきます。型の選択を誤ると DNS が壊れる、メールが届かない、CDN が機能しないため、本記事では実用的な選定ガイドと、特にapex CNAME 問題として知られる罠の回避策を整理します。

基本 6 種類

レコード役割値の例
Aドメイン → IPv4203.0.113.42
AAAAドメイン → IPv62001:db8::1
CNAMEドメイン → 別ドメインtarget.example.net.
TXTドメイン → 任意文字列"v=spf1 include:..."
MXメールサーバの指定10 mail.example.com.
SRVサービスのホスト/ポート指定0 5 5060 sip.example.com.

これに加えて、後述する ALIAS / ANAME(プロバイダ独自)、NS(権威 DNS の指定)、CAA(証明書発行制限)などがあります。

A vs AAAA:IPv4 と IPv6

example.com を IP アドレスに解決させる最も基本的なレコード。

example.com.   IN  A     203.0.113.42
example.com.   IN  AAAA  2001:db8::1

両方設定しておくのが現代のベストプラクティス。Google Public DNS / Cloudflare DNS のような IPv6 対応リゾルバはまず AAAA を試し、無ければ A にフォールバックします。

Happy Eyeballs

ブラウザは Happy EyeballsRFC 8305)アルゴリズムで、AAAA と A の両方に同時接続を試み、先に接続できたほうを使う仕組みを持ちます。IPv6 経路が壊れていてもユーザーには影響しない設計。

ただし、サーバ側でAAAA の経路だけ動作不安定だとユーザーが断続的に遅さを感じます。両方設定するなら両方の経路を確実に動かすこと。

CNAME:別ドメインへの参照

www.example.com.  IN  CNAME  example.com.

www.example.comexample.com の別名として扱う。リゾルバは CNAME を見つけたら、ターゲット側のレコード(A / AAAA)を再帰的に解決します。

CNAME の典型用途:

  • www.example.com → example.com (冗長な www の解決)
  • app.example.com → cname.vercel-dns.com.(CDN・ホスティングサービスへの委譲)
  • assets.example.com → s3-website.amazonaws.com.(AWS S3 静的ホスティング)

CNAME の制約

CNAME を置いた名前には他のレコードを置けません

foo.example.com.  IN  CNAME  bar.example.net.
foo.example.com.  IN  TXT    "info"   ← ✗ 同じ名前に CNAME と他のレコードは共存不可

これが RFC 1034 §3.6.2 で定義された制約。CNAME を使うと、そのサブドメインは完全に他に委ねることになります。

apex CNAME 問題

最も頻繁に踏む罠。ルートドメイン(apex / zone apex)に CNAME を設定できない

example.com.   IN  CNAME  cname.vercel-dns.com.   ← ✗ RFC 違反

理由:apex には NS レコード(権威 DNS の指定)と SOA レコード(zone の管理情報)が必須で、CNAME と他のレコードの共存禁止に違反する。

「CNAME OK」「CNAME 不可」のサイト一覧:

場所CNAME 可否
www.example.com
api.example.com
example.com(apex)
*.example.com(wildcard)

回避策 1:A レコードで IP 直指定

サービスが提供する IP を A レコードで指定:

example.com.   IN  A  76.76.21.21

問題:CDN サービスは IP が変わる可能性があり、IP 直書きは推奨されない。Vercel・Netlify・Cloudflare Pages などは固定 IP を提供しますが、変更リスクが残る。

回避策 2:ALIAS / ANAME / Flattening

DNS プロバイダが提供する疑似 CNAME

  • Cloudflare:CNAME Flattening(apex に CNAME を書ける、内部で A に解決して配信)
  • Route 53:ALIAS(AWS 内部サービス向けに最適化)
  • DNSimple / Dynadot:ALIAS / ANAME(汎用)
  • Vercel:apex に対しては A 76.76.21.21 を推奨(独自 IP を持っている)
example.com.   IN  ALIAS  cname.vercel-dns.com.   ← プロバイダ独自記法

ALIAS はDNS プロバイダ側で動的に CNAME 解決して A レコードとして応答する仕組み。標準仕様ではないので、移行時に他プロバイダの ALIAS への書き換えが必要。

回避策 3:apex リダイレクト

apex を CDN にせず、www.example.com だけを CDN に向け、apex は HTTP リダイレクトwww.example.com に飛ばす。古い手法だが今も使われる。

example.com.       IN  A      203.0.113.42      ← 単純な HTTP リダイレクトサーバ
www.example.com.   IN  CNAME  cname.vercel-dns.com.

TXT:任意の文字列メタデータ

example.com.   IN  TXT  "v=spf1 include:_spf.google.com ~all"
example.com.   IN  TXT  "google-site-verification=abc..."

主な用途:

用途形式
SPF(メール送信元認証)v=spf1 include:... ~all
DKIM(メール署名公開鍵)v=DKIM1; k=rsa; p=...<selector>._domainkey. サブドメイン)
DMARC(メール認証ポリシー)v=DMARC1; p=reject;_dmarc. サブドメイン)
ドメイン所有確認google-site-verification=...stripe-verification=...
Let’s Encrypt DNS-01 認証_acme-challenge.example.com の TXT

TXT レコードは複数設定可能。1 つの値の長さは 255 文字制限があるが、複数の文字列を空白区切りで連結できる:

example.com.   IN  TXT  "first-part" "second-part"

MX:メール配信先

example.com.   IN  MX  10  mail.example.com.
example.com.   IN  MX  20  backup.example.com.

MX1020優先度(priority)で、小さいほど優先。複数 MX があるとき、まず 10 のサーバを試し、失敗したら 20

メール運用に必須。Google Workspace なら 1 ASPMX.L.GOOGLE.COM.、Microsoft 365 なら 0 example-com.mail.protection.outlook.com.

SRV:サービス検出

_sip._tcp.example.com.  IN  SRV  0 5 5060 sip.example.com.

_<service>._<protocol> の名前で、サービスのホストとポートを動的に発見する仕組み。Microsoft Active Directory、SIP、XMPP(Jabber)などで使われる。

Web サービスでの登場頻度は低い。

設計時の選定フロー

新しいレコードを書くとき:

  1. メールが必要? → MX を最初に。
  2. 静的サイト・CDN を apex に置く? → ALIAS(プロバイダ独自)、または www 経由+apex リダイレクト。
  3. サブドメインを外部サービスに委ねる? → CNAME。
  4. ドメイン所有確認・SPF・DMARC を設定? → TXT。
  5. IPv6 対応する? → A と AAAA を両方。
  6. 証明書発行を制限したい? → CAA レコード。

TTL の選び方

TTL(Time To Live)はリゾルバがレコードをキャッシュする秒数:

用途推奨 TTL
安定したレコード(A / AAAA / NS)86400(1 日)〜 604800(1 週間)
ロードバランサ向け、変更予定あり60-300 秒
移行期間中・実験60 秒

TTL を短くしてから変更する慣習:移行の 1 日以上前に TTL を 60 秒に下げ、変更を反映、その後 TTL を戻す。これでキャッシュ伝播の時間を短くできます。

落とし穴

1. CNAME チェーンが深い

a.example.com → b.example.net → c.example.org → 203.0.113.42

各リゾルバは再帰解決するので、深すぎる CNAME チェーンは遅延を生み、タイムアウトのリスクもあります。CNAME のホップは 3 段までを目安

2. NS レコードと CNAME の混同

サブドメインを別の DNS で管理させたい場合は NS レコード(DNS 委譲)であって CNAME ではない:

sub.example.com.  IN  NS   ns1.other-provider.com.
sub.example.com.  IN  NS   ns2.other-provider.com.

CNAME は「ドメイン → 別ドメイン」、NS は「このサブドメインの権威 DNS は別」。違いを理解せず CNAME で代用すると、サブドメイン以下の細かい設定ができなくなります。

3. キャッシュ NXDOMAIN

存在しないレコードへのリクエストは「NXDOMAIN」として否定キャッシュされます。ドメイン作成後すぐにテストすると、リゾルバが「無い」とキャッシュしている可能性。

新規ドメイン作成後は dig +trace example.com で権威 DNS から直接確認するのが確実です。

まとめ

DNS レコードは A / AAAA / CNAME / TXT / MX が日常 95% を占め、apex CNAME 問題と TTL 設計の 2 つを把握すれば実用上のトラブルはほぼ回避できます。ALIAS / ANAME はプロバイダ独自なのでロックインに注意。新規プロジェクトでは IPv6(AAAA)と CAA レコードも忘れずに設定すると、現代的な DNS 運用になります。

IP アドレスの形式・範囲確認は IP アドレスツール で確認できます。