こんにちは。6月よりEC部技術3課に配属されました、山本拓海です。
ザ・ポリスの好きなアルバムはゼニヤッタ・モンダッタです。
今回はスプリットビューDNSについての調査と実装方法をご案内します。
スプリットビューDNSとは
DNSクエリ送信元によって、異なるDNS情報のセットを提供する機能をスプリットビューDNSといいます。
スプリットビューDNSには、他にもスプリットホライズンDNS, スプリットブレインDNS, スプリットDNSという呼び方あるようですが、
今回はスプリットビューDNSという呼称で統一して話を進めます。
スプリットビューDNSを利用することで、VPC内部からのDNSクエリへの応答とインターネットからのDNSクエリの応答を変えることができます。 また、VPC内部からのみ名前解決できるドメインを用意することもできます。
AWS環境へのマイグレーション時に、スプリットビューDNSを実装することでこれまでインターネットに公開していた社内用ドメインを、ローカルや社内ネットワークからしか名前解決できないように改修したいなどのご要望に対応できます。
AWSでのスプリットビューDNSの実装方法
AWSのDNSサービスAmazon Route53にはホストゾーンをプライベートにするオプションがあります。 パブリックホストゾーンはインターネットからの名前解決時に使います。 webサイトなど一般公開する場合に使用されます。
プライベートホストゾーンはインターネットには公開せず、VPCやオンプレミス環境から名前解決することが可能です。 また、同じドメインのホストゾーンをパブリック、プライベートの両方の公開範囲で作成することで、スプリットビューDNSを実装できます。
ハンズオン1. スプリットビューDNSを実装し応答が異なることを確認する
Route53に同じドメインでパブリックとプライベートのホストゾーンを作成し、 スプリットビューDNSを検証します。手順は以下の通りです。
- パブリックホストゾーンの作成
- プライベートホストゾーンの作成
- コマンドによる検証
事前準備
事前準備として、使用するドメインをドメインレジストラでご用意ください。ここでは tkm-ymmt-test.xyzを使用します。
AWSにはVPCとパブリックサブネットを作成します。
VPC作成時にenableDnsHostnamesとenableDnsSupportの設定を確認します。
プライベートホストゾーンを使用するには、次の Amazon VPC 設定で true を指定する必要があります:
enableDnsHostnames
enableDnsSupport
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-considerations.html#hosted-zone-private-considerations-vpc-settings
パブリックサブネットにEC2を立て、パブリックIPの自動割り当てを有効化します。 インスタンスのIPv4の値とVPC IDをメモします。 事前準備完了後の構成図です。
1. パブリックホストゾーンの作成
Route53にパブリックホストゾーンを作ります。
■ 1 Route53のダッシュボード画面から、ホストゾーンの画面へ遷移し、ホストゾーンの作成をクリックします。
■ 2 遷移した画面でドメインの必要な情報を記入します。パブリックホストゾーンを選択していることを確認し、「ホストゾーンの作成」をクリックします。
■ 3 パブリックホストゾーンができました。次にAレコードを作成します。レコードを作成ボタンをクリックし、画面遷移します。
■ 4 Aレコードを編集します。IPアドレスは事前準備でメモしたEC2インスタンスに紐づいているパブリックIPを使います。レコードを作成ボタンをクリックします。
Aレコードを作成しました。
注意点
Route53以外のドメインレジストラ(ドメイン取得サービス)でドメインを購入した場合、 作成されたNSレコードをご利用のレジストラのドメイン管理画面にてネームサーバとして登録の必要がありますのでご対応ください。
2. プライベートホストゾーンの作成
続いて、Route53にプライベートホストゾーンを作ります。
■ 1 ホストゾーンの画面のホストゾーンの作成をクリックします。
■ 2 遷移した画面でドメインの必要な情報を記入します。プライベートホストゾーンを選択していることを確認します。事前準備でメモしておいたVPC IDをホストゾーンに関連付けるVPC IDを入力し、「ホストゾーンの作成」をクリックします。
■ 3 プライベートホストゾーンができました。こちらにもAレコードを作成します。レコードを作成ボタンをクリックし、画面遷移します。
■ 4 Aレコードを編集します。IPアドレスはEC2インスタンスに紐づいているプライベートIPを使います。
Aレコードを作成しました。 プライベートホストゾーンはネームサーバ登録の必要はありません。 ここまでで、同じドメインでパブリックホストゾーン、プライベートホストゾーンの用意ができました。
3. digコマンドによる検証
事前準備で用意したインスタンスからドメインの名前解決を確認する前に、 ネームサーバのIPアドレスを記述している /etc/resolve.confを見てみます。
options timeout:2 attempts:5 search ap-northeast-1.compute.internal nameserver 10.0.0.2
10.0.0.2になっています。 AWSはVPC内のRoute53 Resolver(ここではネームサーバと考えてOK)のアドレスに関して以下の通りアナウンスしており、 デフォルトの設定ではその内容が反映されている状態です。
Route 53 Resolver は 169.254.169.253 (IPv4)、fd00:ec2::253 (IPv6)、および VPC+2 にプロビジョニングされたプライマリプライベート IPV4 CIDR 範囲に配置されています。 例えば、IPv4 CIDR が 10.0.0.0/16 で、IPv6 CIDR が fd00:ec2::253 の VPC がある場合、Route 53 Resolver には 169.254.169.253 (IPv4)、fd00:ec2::253 (IPv6)、または 10.0.0.2 (IPv4) でアクセスできます。 https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html#AmazonDNS
そのため、VPC内部でDNSクエリを送信した場合、プライベートホストゾーンの値が応答されるはずです。
# プライベートホストゾーンへの問い合わせ $ dig -t any tkm-ymmt-test.xyz ;; ANSWER SECTION: tkm-ymmt-test.xyz. 60 IN A 10.0.0.206 ;; Query time: 1 msec ;; SERVER: 10.0.0.2#53(10.0.0.2) ;; WHEN: Thu Jun 08 00:56:24 UTC 2023 ;; MSG SIZE rcvd: 62
応答されました。
次にパブリックホストゾーンの値を確認してみます。
オプションでネームサーバの値を変更することで、インターネットからの名前解決を行い、確認してみます。
# パブリックホストゾーンへの問い合わせ $ dig -t a @8.8.8.8 tkm-ymmt-test.xyz ;; ANSWER SECTION: tkm-ymmt-test.xyz. 60 IN A 18.183.116.228 ;; Query time: 8 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Thu Jun 08 00:56:33 UTC 2023 ;; MSG SIZE rcvd: 62
確認できました。 スプリットビューDNSは実装されている状態です。
ハンズオン2. 別アカウントのVPCからプライベートホストゾーンで名前解決をする
Route53を管理するアカウント(アカウントA)と別アカウント(アカウントB)のVPCにプライベートホストゾーンを紐づけて、アカウントBのVPC内からのDNSクエリの応答がプライベートホストゾーンで設定した内容であることを確かめます。
アカウントの規模が大きくなることで、アプリケーションをホストするアカウントと異なるアカウントでRoute53のホストゾーンを管理することがあるかと思います。
別アカウントでも以下の構成を用意します。
■ 1 アカウントAのCloudShellで以下のコマンドを実行します。VPC IDはアカウントBに準備したVPC IDを使用します。リージョンはご使用中のリージョン名をお使いください。
$ aws route53 create-vpc-association-authorization --hosted-zone-id <プライベートホストゾーンのID> --vpc VPCRegion=<リージョン名>,VPCId=<アカウントBのVPC ID> --region us-east-1 { "HostedZoneId": "プライベートホストゾーンのID", "VPC": { "VPCRegion": "リージョン名", "VPCId": "アカウントBのVPC ID" } }
■ 2 アカウントBのCloudShellで以下のコマンドを実行し、アカウント A のプライベートホストゾーンとアカウント B の VPC 間の関連付けを作成します。
$ aws route53 associate-vpc-with-hosted-zone --hosted-zone-id <プライベートホストゾーンのID> --vpc VPCRegion=<リージョン名>,VPCId=<アカウントBのVPC ID> --region us-east-1 { "ChangeInfo": { "Id": "/change/C102003CQ3FF", "Status": "PENDING", "SubmittedAt": "2023-06-08T14:01:01.320000+00:00", "Comment": "" } }
■ 3 アカウントAのCloudShellに戻り、以下のコマンドを実行し関連付けの状態を確認します。
$ aws route53 list-vpc-association-authorizations --hosted-zone-id <プライベートホストゾーンのID> --region us-east-1 { "VPCs": [ { "VPCRegion": "ap-northeast-1", "VPCId": "<アカウントBのVPC ID>" } ], "HostedZoneId": "<プライベートホストゾーンのID>" }
関連付けされているのを確認できました。
■ 4 アカウントBのEC2からコマンドで検証する
$ dig -t a tkm-ymmt-test.xyz ;; ANSWER SECTION: tkm-ymmt-test.xyz. 60 IN A 10.0.0.206 ;; Query time: 1 msec ;; SERVER: 10.0.0.2#53(10.0.0.2) ;; WHEN: Thu Jun 08 14:12:13 UTC 2023 ;; MSG SIZE rcvd: 62
このアカウントからもプライベートホストゾーンとVPCが関連付けされていることを確認できました。
注意点
アカウントをまたいだプライベートホストゾーン使用時の注意点として、プライベートアドレスを応答させる場合、同一VPC内のIPアドレスへルーティングしないよう、CIDRやネットワークの設計をする必要があります。
最後に
Route53のパブリックホストゾーンとプライベートホストゾーンを使って、スプリットビューDNSを実装してみました。
この記事がお役にたてれば幸いです。