コーヒーが好きな木谷映見です。
AWS の DNS サービスである Amazon Route 53 では、AWS サービスの DNS 名をドメイン名に紐付けるためのエイリアスレコードというものがあります。
過去に弊社ブログでも何度か記事になっているのですが、なかなか腹落ちが難しく、絵を描きながら自分でも検証して整理してみることにしました。
DNS とは(おさらい)
DNS の仕組みについて簡単におさらいします。
DNS は FQDNに対応する IP アドレスを取得する仕組みで、DNS サーバーが階層構造になっています。
FQDN とは Fully Qualified Domain Name(フリー・クオリファイド・ドメイン・ネーム)の頭文字をとったもので、完全修飾ドメイン名のことです。
たとえば「swx.emiki.jp」という FQDN の IP アドレスは何か?というのを問い合わせると、DNS リゾルバはまずルート DNS サーバに IP アドレスは何か問い合わせます。
ルート DNS サーバはそれに対し「それは jp サーバが管理しています」ということを知らせるために、jp サーバの位置を知らせます。
結果を受け取った DNS リゾルバは、jp サーバに同様の問い合わせを行います。jp サーバはルート DNS サーバと同様に「それは emiki.jp サーバが管理しています」ということを知らせます。最終的に問い合わせを受けた emiki.jp サーバが、swx.emiki.jp の IP アドレスを返します。
DNS の委任について
委任とは、管理対象の一部分を別の管理者に委ねる仕組みのことです。
指定されたドメイン名を頂点とする別のゾーンを作り、管理を委ねることを「DNS の委任」とか、「サブドメインの委任」とかいいます。
下の図では、「emiki.jp」のサブドメイン「swx.emiki.jp」が存在し、サブドメインを委任されています。
委任するドメイン名の NS レコードを親ゾーンに追加することで、子ゾーンが作成され、サブドメインが委任された状態になります。
ゾーン
DNSにおいて、委任によって作られる管理の単位のことです。
先ほどの図では、jp ゾーンから委任された emiki.jp ゾーンがあり、emiki.jp ゾーンの中に更に委任された swx.emiki.jp ゾーンがあるということを示しています。
Zone Apex
Apex には「頂点」という意味があるのですが、ゾーンの頂点のドメイン文字列を Zone Apex と呼びます。
emiki.jp というゾーンの Zone Apex は emiki.jp になります。
swx.emiki.jp というゾーンの Zone Apex は swx.emiki.jp になります。
swx.emiki.jp というゾーンの中にあるサブドメイン「hoge.swx.emiki.jp」「fuga.swx.emiki.jp」は委任関係がなくゾーンの頂点ではないので、Zone Apex ではありません。
DNS のレコードタイプについて
Aレコード
AレコードはIPv4でホスト名とIPアドレスの関連づけを定義するレコードです。ドメイン名を問い合わせると IPv4 アドレスを応答します。
- 例
レコード名 | レコードタイプ | 値 |
---|---|---|
hoge.swx.emiki.jp | A | 192.0.2.10 |
エイリアスレコード
Amazon Route 53 ではエイリアスレコードというものがあります。
これは、AWS サービスの DNS 名をドメイン名に紐付け、直接 IP アドレスを応答してくれるものです。
- 例
レコード名 | レコードタイプ | 値 |
---|---|---|
hoge.swx.emiki.jp | A(エイリアスレコード) | dualstack.route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com |
例として以下のような構成で考えます。
Web サーバーとして稼働する EC2 インスタンスの前に ALB があり、ALB にはスライドに記載されているような DNS名が AWS から自動で発行されています。
このまま AWS が自動発行した DNS 名にアクセスしてもよいのですが、せっかくなので独自ドメインでアクセスしたいと思います。
独自ドメイン hoge.swx.emiki.jp で ALB にアクセスするために、Route 53 にレコードを登録します。
以下のように、Route 53 で swx.emiki.jp というホストゾーンを管理しているとします。
以下のようにRoute 53 で hoge.swx.emiki.jp に対してエイリアスレコードで ALB の DNS 名を登録すると、hoge.swx.emiki.jp にアクセスしたとき、ALB の DNS 名を解決して ALB の IP アドレスを返してくれるようになります。
hoge.swx.emiki.jp という独自ドメインで https アクセスできるようになりました。
エイリアスレコードの使いどころ
Zone Apex に AWS リソースの DNS 名を指定できる
エイリアスレコードを使うと、Zone Apex に AWS リソースの DNS 名を指定することができます。
CNAME レコードは Zone Apex を登録できないのですが、エイリアスレコードだと登録できるという特徴があります。
エイリアスレコードで登録した場合の名前解決結果は以下のようになります。
C:\Users\user>nslookup hoge.swx.emiki.jp サーバー: dns.google Address: 8.8.8.8 権限のない回答: 名前: hoge.swx.emiki.jp Addresses: 43.206.12.179 54.250.208.34 C:\Users\user>
利用料金がかからない
Route 53 では、AWS リソースに対するエイリアスクエリには課金されません。
AWS のリソースでエイリアスレコードに対応しているものを DNS レコード登録する際はエイリアスレコードを利用することが推奨されています。
Trusted Advisor では、エイリアスレコードに対応している AWS リソースが CNAME レコードで登録されていると、以下のようにチェックされます。
CNAME レコード
CNAME レコードは別名に対する正式名を指定するためのリソースレコードです。
- 例
レコード名 | レコードタイプ | 値 |
---|---|---|
fuga.swx.emiki.jp | CNAME | route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com |
以下のように Route 53 で fuga.swx.emiki.jp に対して CNAME レコードで正規名 ALB の DNS 名 を登録すると、fuga.swx.emiki.jp にアクセスしたとき、ALB の DNS 名 によみかえて、その後 ALB の DNS 名を解決して ALB の IP アドレスを返してくれるようになります。
fuga.swx.emiki.jp という別名のドメインにアクセスすると、hoge.swx.emiki.jp のサイトにアクセスできます。
※ fuga.swx.emiki.jp で証明書を発行していないので証明書エラーが出ています
CNAME レコードで登録した場合の名前解決結果は以下のようになります。
C:\Users\user>nslookup fuga.swx.emiki.jp サーバー: dns.google Address: 8.8.8.8 権限のない回答: 名前: route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com Addresses: 54.250.208.34 43.206.12.179 Aliases: fuga.swx.emiki.jp C:\Users\user>
CNAME レコードの制約
Zone Apex は CNAME レコードを登録できない
Zone Apex は CNAME レコードを登録できません。
今回の例で言うと、CNAME レコードを登録しようとしてレコード名のところに swx.emiki.jp(Zone Apex)を指定することはできません。
以下のように登録することはできません。
- できない例
レコード名 | レコードタイプ | 値 | |
---|---|---|---|
× | swx.emiki.jp | CNAME | route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com |
エラーが発生しました 不正なリクエストです。 (InvalidChangeBatch 400: RRSet of type CNAME with DNS name swx.emiki.jp. is not permitted at apex in zone swx.emiki.jp.)
これは RFC 1912というインターネットの技術標準を記した文書にも記載されている DNS の決まり・制約です。
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
同じドメイン名の CNAME レコードは登録できない
同じドメイン名の CNAME レコードは登録できません。
レコードタイプが CNAME でない場合も、同じドメイン名のレコードは登録できません。
以下のように登録することはできません。
- できない例
レコード名 | レコードタイプ | 値 | |
---|---|---|---|
hoge.swx.emiki.jp | A(エイリアスレコード) | dualstack.route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com | |
fuga.swx.emiki.jp | CNAME | route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com | |
× | fuga.swx.emiki.jp | CNAME | piyo.swx.emiki.jp |
× | fuga.swx.emiki.jp | A(エイリアスレコード) | dualstack.route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com |
エラーが発生しました 指定された名前のレコードは既に存在します。 (InvalidChangeBatch 400: Tried to create resource record set [name='fuga.swx.emiki.jp.', type='CNAME'] but it already exists)
参考リンク:AWS でホストしているサービスのエイリアスレコードを作成
CNAME レコードは、ホストゾーンファイル内の同じドメインの他のレコードタイプと共存することはできません。たとえば、レコードタイプが CNAME の場合、ドメイン「example.com」のレコードタイプを 1 つだけ持つことができます。次のレコードを作成することはできません。
abc.example.com CNAME www.example.com
abc.example.com A 54.239.28.85
おまけ:検証結果まとめ
イメージ図と検証結果をまとめておきます。
◎(Zone Apex ではない)サブドメイン名を A(エイリアス)レコードとして登録
C:\Users\user>nslookup hoge.swx.emiki.jp サーバー: dns.google Address: 8.8.8.8 権限のない回答: 名前: hoge.swx.emiki.jp Addresses: 43.206.12.179 54.250.208.34 C:\Users\user>
△(非推奨)(Zone Apex ではない)サブドメイン名を CNAME レコードとして登録
C:\Users\user>nslookup hoge.swx.emiki.jp サーバー: dns.google Address: 8.8.8.8 権限のない回答: 名前: route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com Addresses: 54.250.208.34 43.206.12.179 Aliases: hoge.swx.emiki.jp C:\Users\user>
CNAME で名前解決する際のレスポンスは、
「hoge.swx.emiki.jp の IP アドレスはなんですか?」
「fhoge.swx.emiki.jp の正式名は route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com です」
「route53-test-alb-1775071465.ap-northeast-1.elb.amazonaws.com の IP アドレスはなんですか?」
「54.250.208.34、43.206.12.179です」
という風に、クエリが二回走っていることになります。
◎Zone Apex を A(エイリアス)レコードとして登録
※ swx.emiki.jp で証明書を発行していないので証明書エラーが出ています
C:\Users\user> C:\Users\user>nslookup swx.emiki.jp サーバー: dns.google Address: 8.8.8.8 権限のない回答: 名前: swx.emiki.jp Addresses: 54.250.208.34 43.206.12.179 C:\Users\user>
×Zone Apex を CNAME レコードとして登録しようとする
エラーが発生しました 不正なリクエストです。 (InvalidChangeBatch 400: RRSet of type CNAME with DNS name swx.emiki.jp. is not permitted at apex in zone swx.emiki.jp.)
参考
【ドメイン】DNSレコード設定の各レコードの意味を教えてください。|ヘルプサポート | ドメイン取るならお名前.com
JPRS用語辞典|CNAMEリソースレコード(シーネームリソースレコード)
CNAMEレコードにZone Apexをマッピングできない件について - サーバーワークスエンジニアブログ
https://www.ietf.org/rfc/rfc1912.txt
https://jprs.jp/tech/material/rfc/RFC8499-ja.txt
Amazon Route 53でCNAMEレコードの登録時に、エラーが発生する場合 - サーバーワークスエンジニアブログ
エイリアスレコードと非エイリアスレコードの選択 - Amazon Route 53
emi kitani(執筆記事の一覧)
AS部LX課。2022/2入社、コーヒーとサウナが好きです。執筆活動に興味があります。AWS認定12冠。