[Route 53]他のAWSアカウントのVPCにプライベートホストゾーンを関連付ける

Route 53で作成したプライベートホストゾーンを他のAWSアカウントのVPCに関連付ける方法をご紹介します。
2018.04.09

こんにちは、佐伯です。

結構昔のアップデートで追加された機能であり、既に当ブログでも紹介されていますが改めてご紹介したいと思います。今回は下記の合せ技みたいな感じです。

Amazon Route 53 Private Hosted Zoneを異なるAWSアカウントに設定する

Amazon Route 53 Private DNSを複数VPCに適用する

構成

ざっくりした構成は以下の通りです。VPCピアリングで接続したVPC同士でプライベートホストゾーンの関連付けを行います。

注意点

VPCの設定

プライベートホストゾーンを使用するにはVPCの設定で enableDnsHostnamesenableDnsSupport をtrueに設定する必要があります。

制限事項

VPCに関連付けるプライベートホストゾーンの名前空間が重複する場合、関連付けすることができません。

複数のプライベートホストゾーンに VPC に関連付けることができますが、名前空間が重複することはできません。たとえば、example.com と acme.example.com の両方のホストゾーンは、どちらの名前空間も example.com で終わるため、VPC を関連付けることはできません。

引用元: プライベートホストゾーンの使用 - Amazon Route 53

やってみた

VPC作成やVPCピアリング作成、ルートテーブルや疎通確認のためのセキュリティグループの編集については省略します。

アカウントA

Route 53でプライベートホストゾーン exapmle1.local を作成します。

作成したプライベートホストゾーンにAレコードを作成します。AレコードにはアカウントAのVPC上で稼働するEC2インスタンスのプライベートIPアドレスを設定しました。

アカウントB

アカウントBでも同様にプライベートホストゾーン example2.local を作成します。手順はアカウントAと同じなので省略します。また、アカウントBでも同様にAレコードを作成しました。

アカウントAのプライベートホストゾーンをアカウントBのVPCに関連付ける

他のAWSアカウントへの関連付けの操作はAWSマネジメントコンソールで対応していませんので、AWS CLIから行います。

関連リンク: 作成済みの Amazon VPC と、別の AWS アカウントで作成したプライベートホストゾーンを関連付ける - Amazon Route 53

アカウントAからアカウントBへ関連付けリクエスト

アカウントAから関連付けのリクエストを行います。 --hosted-zone-id はアカウントAで作成したプライベートホストゾーンのHosted Zone IDです。 VPCId は関連付けをリクエストするアカウントBのVPC IDです。

aws route53 create-vpc-association-authorization \
  --hosted-zone-id Z3A22JQCBOXXXX \
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-4d4bXXXX

アカウントBでリクエストの承認

アカウントBでリクエストの承認をします。

aws route53 associate-vpc-with-hosted-zone \
  --hosted-zone-id Z3A22JQCBOXXXX \
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-4d4bXXXX

アカウントBで承認されるとアカウントAのマネジメントコンソールから関連付けしたVPCが確認できます。

アカウントBのプライベートホストゾーンをアカウントAのVPCに関連付ける

アカウントBからアカウントAへ関連付けリクエスト

アカウントBでも同じくリクエストを行い、アカウントAで承認します。

aws route53 create-vpc-association-authorization \
  --hosted-zone-id ZDFHP1LZ1XXXX \
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-32e6XXXX

アカウントAでリクエストの承認

aws route53 associate-vpc-with-hosted-zone \
  --hosted-zone-id ZDFHP1LZ1XXXX \
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-32e6XXXX

こちらもアカウントAで承認されるとアカウントBのマネジメントコンソールから関連付けしたVPCが確認できます。

VPC上のインスタンスから名前解決してみる

VPC上に作成したEC2インスタンスから名前解決と疎通確認を行いました。

アカウントAのEC2インスタンス

[ec2-user@ip-172-16-1-199 ~]$ dig ec2.example2.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.57.amzn1 <<>> ec2.example2.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52111
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;ec2.example2.local.		IN	A

;; ANSWER SECTION:
ec2.example2.local.	60	IN	A	192.168.0.178

;; Query time: 2 msec
;; SERVER: 172.16.0.2#53(172.16.0.2)
;; WHEN: Mon Apr  9 01:25:50 2018
;; MSG SIZE  rcvd: 52

[ec2-user@ip-172-16-1-199 ~]$ ping ec2.example2.local
PING ec2.example2.local (192.168.0.178) 56(84) bytes of data.
64 bytes from ip-192-168-0-178.ap-northeast-1.compute.internal (192.168.0.178): icmp_seq=1 ttl=255 time=0.444 ms
64 bytes from ip-192-168-0-178.ap-northeast-1.compute.internal (192.168.0.178): icmp_seq=2 ttl=255 time=0.976 ms
64 bytes from ip-192-168-0-178.ap-northeast-1.compute.internal (192.168.0.178): icmp_seq=3 ttl=255 time=0.425 ms
64 bytes from ip-192-168-0-178.ap-northeast-1.compute.internal (192.168.0.178): icmp_seq=4 ttl=255 time=0.491 ms
64 bytes from ip-192-168-0-178.ap-northeast-1.compute.internal (192.168.0.178): icmp_seq=5 ttl=255 time=0.391 ms
^C
--- ec2.example2.local ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 0.391/0.545/0.976/0.218 ms

アカウントBのEC2インスタンス

[ec2-user@ip-192-168-0-178 ~]$ dig ec2.example1.local

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.57.amzn1 <<>> ec2.example1.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39912
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;ec2.example1.local.		IN	A

;; ANSWER SECTION:
ec2.example1.local.	60	IN	A	172.16.1.199

;; Query time: 2 msec
;; SERVER: 192.168.0.2#53(192.168.0.2)
;; WHEN: Mon Apr  9 01:26:01 2018
;; MSG SIZE  rcvd: 52

[ec2-user@ip-192-168-0-178 ~]$ ping ec2.example1.local
PING ec2.example1.local (172.16.1.199) 56(84) bytes of data.
64 bytes from ip-172-16-1-199.ap-northeast-1.compute.internal (172.16.1.199): icmp_seq=1 ttl=255 time=0.340 ms
64 bytes from ip-172-16-1-199.ap-northeast-1.compute.internal (172.16.1.199): icmp_seq=2 ttl=255 time=0.513 ms
64 bytes from ip-172-16-1-199.ap-northeast-1.compute.internal (172.16.1.199): icmp_seq=3 ttl=255 time=0.546 ms
64 bytes from ip-172-16-1-199.ap-northeast-1.compute.internal (172.16.1.199): icmp_seq=4 ttl=255 time=0.472 ms
64 bytes from ip-172-16-1-199.ap-northeast-1.compute.internal (172.16.1.199): icmp_seq=5 ttl=255 time=0.501 ms
^C
--- ec2.example1.local ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 0.340/0.474/0.546/0.073 ms
[ec2-user@ip-192-168-0-178 ~]$

まとめ

名前空間が重複してはいけないという制限事項はありますが、今回のようにVPCピアリング先の名前解決に使用することができます。他の組織が管理するAWSアカウントとVPCピアリング接続する場合、ひとつのプライベートホストゾーンでDNSレコードの管理すると、変更の際に依頼などが発生してしまいますが、この機能を使えばDNSレコードを各々のAWSアカウントで管理することができるかと思います。