Route 53 Private Hosted ZoneとRoute 53 Resolver Ruleの優先順位を確認してみた

DNSの設計をする際は名前解決の経路を意識しよう
2022.10.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

正しく名前解決できるか気になる

こんにちは、のんピ(@non____97)です。

皆さんは「サブドメインをRoute 53 Private Hosted Zoneで管理している状態で、Route 53 Resolver Ruleで親ドメインの転送する設定をすると、サブドメインの名前解決を行う場合にどのような挙動をするのか」は気になったことはありますか? 私はあります。

言葉だけだと分かりづらいので図にします。

Route 53 Resolver Outbound検証環境構成図

この状態でサブドメインであるroute-53.corp.non-97.netのゾーンが管理している名前(例えばa.route-53.corp.non-97.net)を名前解決しようとすると、以下のようにループしてしまいそうに思いませんか?

  1. Route 53 Resolverに問い合わせ
  2. Route 53 Resolver Ruleを参照し、問い合わせされたa.route-53.corp.non-97.netと比較
  3. 部分的に一致しているためRoute 53 Resolver Ruleに従ってcorp.non-97.netのゾーンを管理しているDNSサーバーに転送
  4. サブドメインであるroute-53.corp.non-97.netの名前解決をするために、RouteRoute 53 Resolverに転送

Route 53 Resolver Outbound検証環境でroute-53.corp.non-97.netの名前解決

AWS公式ドキュメントには以下のような記載がありました。

プライベートホストゾーンと Route 53 Resolver ルール

プライベートホストゾーン (example.com) があり、ドメイン名が同じであるトラフィックをネットワークにルーティングする Resolver ルールがある場合、Resolver はルールを優先します。

例えば、次の設定があるとします。

  • example.com というプライベートホストゾーンがあり、それを VPC に関連付けます。

  • example.com のトラフィックをネットワークに転送する Route 53 Resolver ルールを作成し、そのルールを同じ VPC に関連付けます。

この設定では、Resolver ルールがプライベートホストゾーンよりも優先されます。DNS クエリは、プライベートホストゾーンのレコードに基づいて解決されるのではなく、ネットワークに転送されます。

プライベートホストゾーンを使用する場合の考慮事項 - Amazon Route 53

ドメインが同じであればResolver Ruleを優先するようです。

しかし、今回気になっているResolver Ruleに親ドメインを指定して、サブドメインのRoute 53 Private Hosted Zoneの名前解決をした時の優先順位は特に言及されていないですね。

気になったので確認してみました。

いきなりまとめ

  • 以下環境ではRoute 53 Private Hosted Zoneを優先する
    • Route 53 Private Hosted Zoneでサブドメインを管理
    • Route 53 Resolver Ruleで親ドメインへの問い合わせが来た場合は、親ドメインのゾーンを管理しているDNSサーバー転送

検証環境の準備

Route 53 Private Hosted Zoneの作成

それでは、検証環境を準備します。

VPCやcorp.non-97.netのゾーンを管理するDNSサーバーは以下記事の検証環境を流用します。また、名前解決の比較用にa.corp.non-97.net10.2.2.2のAレコードを作成しておきます。

それでは、Route 53 Private Hosted Zoneでサブドメインであるroute-53.corp.non-97.netのPrivate Hosted Zoneを作成します。

Route 53のコンソールからホストゾーン-ホストゾーンの作成をクリックします。

ホストゾーンの作成

ドメイン名にroute-53.corp.non-97.netを指定してPrivate Hosted Zoneを作成します。

ホストゾーン設定

Route 53 Private Hosted Zoneの作成が完了したら、Aレコードとしてa.route-53.corp.non-97.netを追加します。

ホストゾーンの作成確認

Route 53 Resolver Outbound Endpointの作成

次にRoute 53 Resolver Outbound Endpointを作成します。

Route 53のコンソールからアウトバウンドエンドポイント-アウトバウンドエンドポイントの作成をクリックします。

アウトバウンドエンドポイントの作成

アウトバウンドルールをVPC内に作成します。

アウトバウンドエンドポイントの全般設定とIPアドレス

Route 53 Resolver Outbound Endpointの作成が完了したら、Route 53 Resolver Ruleを作成します。

Route 53 Resolver Outbound Endpoint作成確認

親ドメインであるcorp.non-97.netの問い合わせの場合に、corp.non-97.netのゾーンを管理するDNSサーバーのIPアドレスに転送するようなルールを作成します。

アウトバウンドトラフィックのルール

Route 53 Resolver Ruleが作成されたことを確認します。

Route 53 Resolver Ruleの確認

名前解決してみる

検証環境の準備ができたので、名前解決してみます。

# 親ドメインのAレコードを名前解決できるか確認
$ dig a.corp.non-97.net

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> a.corp.non-97.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31857
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;a.corp.non-97.net.             IN      A

;; ANSWER SECTION:
a.corp.non-97.net.      300     IN      A       10.2.2.2

;; Query time: 3 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Fri Oct 28 01:04:25 UTC 2022
;; MSG SIZE  rcvd: 62

# サブドメインのAレコードを名前解決できるか確認
$ dig a.route-53.corp.non-97.net

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> a.route-53.corp.non-97.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47304
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;a.route-53.corp.non-97.net.    IN      A

;; ANSWER SECTION:
a.route-53.corp.non-97.net. 300 IN      A       10.1.1.1

;; Query time: 1 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Fri Oct 28 01:04:34 UTC 2022
;; MSG SIZE  rcvd: 71

正常に名前解決できました。

どうやら、Route 53 Resolver Ruleで転送設定をしたドメインとRoute 53 Private Hosted Zoneで管理しているゾーンが一致している場合、Route 53 Private Hosted Zoneが優先されるようです。

もちろん、各ゾーンのNSレコードの問い合わせも以下のように正しくできています。

# サブドメインのゾーンのNSレコードの確認
$ dig route-53.corp.non-97.net NS

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> route-53.corp.non-97.net NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41337
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;route-53.corp.non-97.net.      IN      NS

;; ANSWER SECTION:
route-53.corp.non-97.net. 172800 IN     NS      ns-512.awsdns-00.net.
route-53.corp.non-97.net. 172800 IN     NS      ns-0.awsdns-00.com.
route-53.corp.non-97.net. 172800 IN     NS      ns-1024.awsdns-00.org.
route-53.corp.non-97.net. 172800 IN     NS      ns-1536.awsdns-00.co.uk.

;; Query time: 1 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Fri Oct 28 00:56:47 UTC 2022
;; MSG SIZE  rcvd: 188

# 親ドメインのゾーンのNSレコードの確認
$ dig corp.non-97.net NS

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> corp.non-97.net NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33892
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;corp.non-97.net.               IN      NS

;; ANSWER SECTION:
corp.non-97.net.        3600    IN      NS      ec2amaz-75jbqck.corp.non-97.net.

;; Query time: 2 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Fri Oct 28 00:57:03 UTC 2022
;; MSG SIZE  rcvd: 74

DNSの設計をする際は名前解決の経路を意識しよう

Route 53 Private Hosted ZoneとRoute 53 Resolver Ruleの優先順位を確認してみました。

親ドメインのゾーンはオンプレのADの統合ゾーンで管理しており、AWSで稼働しているサービスで使うドメインのゾーンはRoute 53 Private Hosted Zoneで管理するといったこともあるかと思います。

もし、ループするような仕様である場合ドメインの設計が大きな影響を与えるので、そのような仕様でなくて安心しました。

DNS周りを設計する場合は、「どこから」「何を」「どのような経路」で名前解決するのか正しく把握しておくことが重要です。DNSの設計をする場合パターンを洗い出して名前解決の経路に違和感がないか確認しましょう。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!