A レコード
概要
A レコード(Address Record) は、ドメイン名を 32 ビットの IPv4 アドレスに対応付ける DNS レコードです。RFC 1035 で定義されており、example.com に対して 93.184.216.34 のような IPv4 アドレスを返します。ブラウザーが URL を入力されたときに最初に問い合わせるレコードであり、DNS の根幹を担う型です。
IPv6 アドレスを扱う場合は AAAA レコード(RFC 3596)を使います。A レコードが 32 ビット(4 オクテット)の IPv4 アドレスを格納するのに対し、AAAA レコードは 128 ビットの IPv6 アドレスを格納します。現代の運用では A レコードと AAAA レコードを同一ドメインに並行して設定し、クライアントがどちらのアドレスファミリーにも対応できるようにするのが標準的な構成です。
仕組み
A レコードのフィールド構成、名前解決の流れ、ラウンドロビンによる負荷分散を順に見ていきます。
レコードの構造
A レコードは次のフィールドで構成されます。
example.com. IN A 93.184.216.34
| フィールド | 説明 |
|---|---|
| NAME | レコードの所有者名。ゾーンの頂点(example.com.)やサブドメイン(www.example.com.)を指定する |
| TTL | キャッシュの有効秒数。省略時はゾーンの $TTL が適用される |
| CLASS | 通常は IN(Internet) |
| TYPE | A(レコードタイプ番号 1) |
| RDATA | 32 ビットの IPv4 アドレス(ドット区切り 10 進表記) |
クエリの流れ
ブラウザーが example.com にアクセスするとき、OS のリゾルバーがキャッシュを確認し、存在しなければ再帰リゾルバーへ問い合わせます。再帰リゾルバーはルートサーバー → TLD ネームサーバー → 権威ネームサーバーの順に委任をたどり、最終的に example.com の権威ネームサーバーから A レコードの値を受け取ります。
この応答は TTL(Time To Live)で指定された秒数だけキャッシュされます。TTL が 300 の場合、5 分間はキャッシュされた IPv4 アドレスが使われ続けます。
複数 A レコードとラウンドロビン
1 つのドメインに対して A レコードを複数設定することができます。DNS サーバーはクエリのたびにレコードの順番を変えて返すことがあり、この仕組みを DNS ラウンドロビンと呼びます。単純な負荷分散として機能しますが、応答が返ってこないサーバーを自動的に除外するヘルスチェック機能は持っていません。
example.com. IN A 93.184.216.34
example.com. IN A 198.51.100.1
CDN での活用
CloudFront、Fastly、Cloudflare のような CDN は、ユーザーの地理的位置に近い PoP(Point of Presence)の IP アドレスを A レコードとして返します。dig で同じドメインを引いても、クライアントの場所によって異なる IP アドレスが返ってくるのはこのためです。CDN の A レコードは数分単位で変わることがあるため、短い TTL(通常 60〜300 秒)が設定されています。
設定例
A レコードの基本設定、IPv6 との併用、ゾーンファイルでの記述パターンを示します。
基本的な A レコード
example.com. IN A 93.184.216.34
www.example.com. IN A 93.184.216.34
IPv4/IPv6 の併用
example.com. IN A 93.184.216.34
example.com. IN AAAA 2606:2800:21f:cb07:6820:80da:af6b:8b2c
クライアントが IPv6 に対応していれば AAAA レコードを優先して使います(RFC 6724 の宛先アドレス選択ルールに従います)。
ゾーンファイルでの記述
$TTL 3600
@ IN A 93.184.216.34
@ はゾーンの頂点(Apex ドメイン)を表します。多くの DNS プロバイダーの管理画面では @ をそのまま入力欄に使えます。
確認方法
dig でドメインの A レコードを確認するには次のコマンドを使います。
dig A example.com
出力の ANSWER SECTION に IPv4 アドレスが表示されます。
;; ANSWER SECTION:
example.com. 86400 IN A 93.184.216.34
TTL フィールドの値(上記では 86400)がキャッシュの残り秒数です。複数の IP アドレスが返ってくる場合は、DNS ラウンドロビンまたは Anycast 構成です。
特定のネームサーバーに直接問い合わせるには @ でサーバーを指定します。
dig A example.com @8.8.8.8
外部の視点からも確認したい場合は、Labee Dev Toolbox の DNS API を使うと、外部の視点から見た結果を取得できます。
curl "https://labee.dev/api/dns?domain=example.com&type=A"
レスポンスは次の形式で返ります。
{
"success": true,
"data": {
"domain": "example.com",
"records": {
"A": [
{ "address": "93.184.216.34", "ttl": 86400 }
]
}
},
"error": null,
"meta": { "responseTime": 42 }
}
records.A が配列で返るため、複数の IP アドレスが設定されている場合は複数エントリが含まれます。dig の結果と差異がある場合は、API 側のリゾルバーのキャッシュと手元のリゾルバーのキャッシュが一致していない可能性があります。
よくある問題
A レコードの設定・運用で発生しやすいトラブルと、その原因・対処法を整理します。
AAAA を設定したが IPv6 で繋がらない
A レコードだけ設定して AAAA レコードを設定しないと、IPv6 のみの環境からはドメインにアクセスできません。IPv6 対応が必要なサービスでは A と AAAA を両方設定します。逆に AAAA だけ設定した場合、IPv4 環境から接続できなくなります。
IP アドレスを変えたのにアクセスが古いサーバーに届く
A レコードの TTL が長いと(例: 86400 秒 = 24 時間)、変更が世界中に伝播するまでに同じ時間がかかります。IP 変更を計画する場合は、変更の 24〜48 時間前に TTL を 300 秒に下げておき、変更後に元の値に戻すのが標準的な手順です。
Apex ドメインに CNAME を設定しようとしている
example.com(ゾーンの頂点)に CNAME を設定することは RFC 上できません。ルートドメインをロードバランサーや CDN のエンドポイントに向けたい場合は、DNS プロバイダーが提供する ALIAS レコードや CNAME Flattening を使います。これらは Cloudflare、Route 53、NS1 など主要プロバイダーでサポートされています。
同一 IP の別ドメインへの移行後に証明書エラーが出る
A レコードを新しいサーバーの IP に変更したが、SSL 証明書が古いドメインのものしか発行されていない場合にエラーが出ます。証明書の発行・更新は A レコードの変更と別のタスクとして扱い、順序を明確にしてから作業します。