【初心者向け】DNSレコードの基本的な知識

記事タイトルとURLをコピーする

こんにちは。DevOpsが好きなアプリケーションサービス部の兼安です。
本記事ではDNSレコードの基本的な知識についてお話しします。

本記事の対象者

DNSレコードについて知識がない方を対象としています。

対象者の説明がてら、ちょっと補足させていただきます。
もしあなたがDNSレコードについての知識がないとしてもあまり気にしないでください。
Web開発を長年やっている方でもDNSに馴染みがない方はたくさんいらっしゃいます。
これは、DNSレコードの編集の機会が非常に少ないためです。
基本的にDNSレコードを編集するのはWebサイトのオープンや移転を行う時なので、学習の機会がとても少ないのです。

DNSとは

DNS(Domain Name System)は、インターネット上のドメイン名とIPアドレスを対応付けるための仕組みです。
そして、DNSレコードは、そのDNSの仕組みの中で、ドメイン名とIPアドレスの対応付けなどのドメインに対するリクエストを処理するための情報を格納するデータのことです。

ブログなどでドメインの例を書く時の注意事項

ここからDNSレコードについて説明していきますが、ブログなどでドメインの例を書く時の注意事項を書いておきます。
世の中には膨大な数のドメインがあるので、例え設計書やブログ上の例示であったとしても、適当なドメインを使用するのは危険です。

明確に例として使えるドメインとして、example.comが定義されているのでこちらを使うのが安全です。
datatracker.ietf.org

本記事でもexample.comを使って説明していきます。

ドメインレジストラとAmazon Route53

DNSは、インターネット上のドメイン名とIPアドレスを対応付けるための仕組みですが、そのDNSの仕組みを提供するサービスをドメインレジストラと呼びます。
AWSにおいては、Amazon Route53がドメインレジストラとして提供されています。

aws.amazon.com

サブドメインとZone Apexドメイン(ネイキッドドメイン、ルートドメイン)

example.comに対し、a.example.comb.example.comc.example.comをサブドメインと呼びます。
a.example.comb.example.comc.example.comというサブドメインに対して、example.comはZone Apexドメインと呼びます。
DNSレコードは、Zone Apexドメイン・サブドメインに対してIPアドレス・ホスト名・別のドメイン名などを対応付けるための情報を格納します。

Zone Apexドメインは、ネイキッドドメイン・ルートドメインと呼ばれることもあります。
Zone Apexドメインの呼び方は組織や文化によって異なりますが、本記事ではZone Apexドメインで統一します。

代表的なDNSレコード

Aレコード

Aレコードは、ドメイン名とIPアドレスを対応付けるためのレコードです。
AWSで言うと、ドメインとElastic IPを紐づけたりするのに使います。
Aレコードを使ってドメインとElastic IPを紐づけて、Elastic IPをEC2インスタンスに関連づければ、ドメイン名でEC2インスタンスにアクセスできるようになります。

レコード名 タイプ
example.com A xxx.xxx.xxx.xxx(数字が入ります)

AAAAレコード

AAAAレコードは、IPv6アドレスを対応付けるためのレコードです。
Aレコードとの違いは、AレコードがIPv4アドレスを対応付けるのに対して、AAAAレコードはIPv6アドレスを対応付けるところです。

CNAMEレコード

CNAMEレコードは、ドメイン名を別のドメイン名に対応付けるためのレコードです。
AWSで言うと、Elastic Load Balancerのドメイン名と自分のドメイン名を紐づけるのに使ったりします。

レコード名 タイプ
b.example.com CNAME ロードバランサーのドメイン

Route53特有のレコード:エイリアスレコード

Route53特有のレコードとして、エイリアスレコードがあります。
Route53でAレコードを作るときに、エイリアスをONにすると作れます。

AレコードでエイリアスをONにするとエイリアスレコードになる

ONにすると、ドメインとElastic Load BalancerやCloudFrontなどのAWSリソースを紐づけることができます。

なぜエイリアスという独自の機能があるかというと、Elastic Load BalancerやCloudFrontが固定のIPアドレスではなく、複数かつ変動するIPアドレスを持っているためです。
明確なIPアドレスを持たないので、Aレコードを使ってもリソースを指定することができません。
ではCNAMEは?Elastic Load BalancerやCloudFrontもURLを持っていますよね?と思われるかもしれません。
それは、正しくはあります。
CNAMEで任意のドメインとElastic Load BalancerやCloudFrontのURLを紐づけることは可能です。
しかし、CNAMEが設定できるのはサブドメインのみであり、Zone Apexドメインは不可能です。
これはRoute53ではなく、DNSそのものの仕様による制限です。

このことは、RFC1912の文書に記載されています。
該当箇所を引用します。

2.4 CNAME records

A CNAME record is not allowed to coexist with any other data. In other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you can't also have an MX record for suzy.podunk.edu, or an A record, or even a TXT record. Especially do not try to combine CNAMEs and NS records like this!:

      podunk.xx.      IN      NS      ns1
                      IN      NS      ns2
                      IN      CNAME   mary
      mary            IN      A       1.2.3.4

This is often attempted by inexperienced administrators as an obvious way to allow your domain name to also be a host. However, DNS servers like BIND will see the CNAME and refuse to add any other resources for that name. Since no other records are allowed to coexist with a CNAME, the NS entries are ignored. Therefore all the hosts in the podunk.xx domain are ignored as well!

この部分では、CNAMEレコードが他のデータと共存できないことを説明しています。
特にNSレコードとの組み合わせが問題になることを指摘しています。
これが、CNAMEレコードがZone Apexドメインに設定できない理由です。

この制限を回避するためにRoute53で用意されているのがエイリアスレコードです。
エイリアスレコードを使うことで、Zone ApexドメインでもサブドメインでもElastic Load BalancerやCloudFrontと紐づけることができます。

その他のレコード

MXレコード

MXレコードは、メールサーバのホスト名を指定するためのレコードです。

TXTレコード

TXTレコードは、テキスト情報を格納するためのレコードです。

NSレコード

NSレコードは、ドメインの権威サーバを指定するためのレコードです。

SOAレコード

SOAレコードは、ドメインに関する権威情報を格納するためのレコードです。

DNSレコードの使い道

Aレコードの使い道

Aレコードは、ドメイン名とIPアドレスを対応付けるためのレコードです。
AWSの世界においては、ドメインとElastic IPを紐づけたりするのに使います。

CNAMEレコードの使い道

CNAMEレコードは、ドメイン名を別のドメイン名に対応付けるためのレコードです。
Elastic Load Balancerのドメイン名と自分のドメイン名を紐づけたりすることができます。
ただし、Route53を使っている場合はエイリアスレコードが存在するので、CNAMEレコードを使う機会は少ないかもしれません。

AWS Certificate Managerで証明書を発行すると、CNAMEレコードを使ってドメインの認証を行うことができるので、このケースで見たことがある方はいると思います。

docs.aws.amazon.com

CNAMEレコードなどを使って認証を行う方式をDNS認証と呼びます。
DNSレコードを編集することができるのは、基本的にドメインの管理者のみです。
したがって、DNSレコードに要求される情報を持っていることが、そのドメインの管理者であることの証明になります。
この理屈を使って、認証を行うのがDNS認証です。

TXTレコードの使い道

TXTレコードは、テキスト情報を格納するためのレコードです。
用途としては上述のAWS Certificate Managerでの認証と同じように、ドメインの認証を行うために使われることがあります。

AWSのサービスで例を挙げると、SESでメール送信を行う際に、SPFレコードを設定するためにTXTレコードを使うことがあります。

docs.aws.amazon.com

NSレコードの使い道

NSレコードは、ドメインの権威サーバーを指定するためのレコードです。
権威サーバーとは、ドメインの管理者がドメインに関する情報を保持しているサーバーのことです。

下の画像はRoute53を使っている場合の例です。
NSレコードに、複数のURLで権威サーバーが登録されていることがわかります。

NSレコードの例

NSレコードを意識するシチュエーションには、ドメインの管理設定を移す時があります。
例えば、Route53以外のどこかの外部ドメインレジストラでドメインを取得し、管理していたとします。
ドメインレジストラにはNSレコードがあり、問い合わせの際はそのNSレコードを元に権威サーバーを特定、問い合わせを行います。

問い合わせのイメージ

AWSの各種サービスを使うようにしたため、AWSリソースとの親和性を高めるために、Route53にドメインの管理設定を移すことにします。
これを実現するには、外部ドメインレジストラのNSレコードをRoute53のNSレコードで上書きします。
こうすることで、ドメインを問い合わせた時に、Route53のDNSレコードを参照するようになります。

管理設定を移動した時のイメージ

注意事項として、この方法は管理設定だけをRoute53に移したにすぎません。
ドメインそのものは、外部ドメインレジストラに存在します。
したがって、外部ドメインレジストラの方を解約してしまうと、ドメインそのものが消えてしまいます。

そうではなくて、ドメインを丸ごとRoute53に移す場合は、所謂「ドメインの移管」という手続きを行います。

docs.aws.amazon.com

DNSレコードの編集ではTTLに気をつける

DNSレコードには、TTL(Time To Live)という値が設定されています。
TTLは、DNSレコードのキャッシュを保持する時間を指定する値です。
TTLが短いほど、DNSレコードの変更が早く反映されます。
逆に言うと、TTLの時間の間は、DNSレコードの変更が反映されないことがあります。

では、TTLが切れるのを待てば、DNSレコードの変更が反映されるのかというと、これがまた難しいところでして・・・。
筆者はDNSレコードの更新後、変更の反映がスマホでは確認できたが、とある組織のネットワークに繋いでいるPCでは1日待たないと反映されなかったという経験があります。
これは該当組織の当時のネットワークの構成によるものです。
このように、DNSレコードの変更の反映は、TTLや環境次第のところがあり、反映に計りづらい時間がかかります。

曖昧な答えで申し訳ないのですが、DNSレコードの更新は十分な余裕時間を持って行うことをお勧めします。

最後に

DNSレコードの知識はWebのアプリやサイトを公開するには必要不可欠です。
本記事をきっかけに、DNSに対しても興味を持っていただければ幸いです。

弊社のエンジニアブログでは他にもDNSの記事を掲載しています。
本記事とはまた異なる切り口で記載していますので、併せて読んでいただくとDNSについてより理解が深まると思います。

blog.serverworks.co.jp

[Appendix]Route53のCloudFormationテンプレート

DNSレコードの操作は緊張を伴うものです。
ヒューマンエラーを防ぐために、できるだけIaC(Infrastructure as Code)を使って自動化することをお勧めします。
CloudFormationテンプレートでDNSレコードを操作する場合は、こちらのページが参考になります。

docs.aws.amazon.com

兼安 聡(執筆記事の一覧)

アプリケーションサービス部 DS3課所属
2024 Japan AWS Top Engineers (Database)
2024 Japan AWS All Certifications Engineers
認定スクラムマスター
広島在住です。今日も明日も修行中です。