マルチアカウント環境などで1つのアカウントにあるプライベートホストゾーンを複数のアカウントから参照し、名前解決するための設定をしていきます。
構成イメージ
アカウントAのRoute53にプライベートホストゾーンを作成し、レコードを追加する。
アカウントBからアカウントAにあるプライベートホストゾーンのレコードを参照し、アカウントAにあるEC2インスタンスの名前解決をする。

手順の流れ
【前提】
・アカウントA/BにはそれぞれVPCを用意。(※VPCの設定でDNS ホスト名は”有効”にしておく)
・アカウントA/BにEC2インスタンスを用意。
【手順の流れ】
- 【アカウントA】プライベートホストゾーン作成
- 【アカウントA】プライベートホストゾーンにレコード追加
- 【アカウントA】EC2インスタンス(accountA-server)にIAMロールを付与
- 【アカウントA】アカウントAからアカウントBへ関連付けリクエスト
- 【アカウントB】リクエストの承認
- 【アカウントA】関連付けの確認
- 【アカウントB】名前解決できるか確認
- 【アカウントB】FQDN無し(ホスト名)で名前解決する方法
1.【アカウントA】プライベートホストゾーン作成
まずはアカウントAのRoute53でプライベートホストゾーンを作成。

ドメイン名:accounta-private.com
タイプ:プライベートホストゾーン
VPC:既に作成済のVPCを指定
上記でホストゾーンを作成。

ホストゾーンが作成されていることを確認。

2.【アカウントA】プライベートホストゾーンにレコード追加
作成したプライベートホストゾーン(accounta-private.com)にレコードを追加する。

レコード名:accountA-server
レコードタイプ:A レコード
値:アカウントAのEC2インスタンスのプライベートIPアドレス

Aレコードが作成されたことを確認。

3.【アカウントA】EC2インスタンス(accountA-server)にIAMロールを付与
Route53にアクセスするためのIAMロールを作成。
ポリシーは「AmazonRoute53FullAccess」を付与。

accountA-Serverにロールを適用。

4.【アカウントA】アカウントAからアカウントBへ関連付けリクエスト
accountA-ServerでRoute53にアクセスできるか確認します。
プライベートホストゾーンの情報が出力されるか確認する。
# aws route53 list-hosted-zones
【実行結果】
{
"HostedZones": [
{
"Id": "/hostedzone/【ホストゾーンID】",
"Name": "accounta-private.com.",
"CallerReference": "XXXXXXXXXXXXXXXXXXXXXXXXX",
"Config": {
"Comment": "",
"PrivateZone": true
},
"ResourceRecordSetCount": 3
}
]
}
ホストゾーンの情報が表示されたらRoute53にアクセスできているので、アカウントBへの関連付けリクエストを実施する。
# aws route53 create-vpc-association-authorization --hosted-zone-id【ホストゾーンID】--vpc VPCRegion=ap-northeast-1,VPCId=【アカウントBのVPCID】 【実行結果】 { "HostedZoneId": 【ホストゾーンID】, "VPC": { "VPCRegion": "ap-northeast-1", "VPCId": 【アカウントBのVPCID】 } }
5.【アカウントB】リクエストの承認
アカウントBでリクエストを承認します。
Statusが”PENDING”となります。
# aws route53 associate-vpc-with-hosted-zone --hosted-zone-id Z08487521KFII04HQ06DO --vpc VPCRegion=ap-northeast-1,VPCId=vpc-0db1f620d0a77fffb 【実行結果】 { "ChangeInfo": { "Status": "PENDING", "Comment": "", "SubmittedAt": "2022-10-22T15:57:38.121Z", "Id": "/change/XXXXXXXXXX" } }
6.【アカウントA】関連付けの確認
アカウントAのプライベートホストゾーンで「関連付けられたVPC」を確認するとアカウントBのVPCIDが表示されていることを確認します。

7.【アカウントB】名前解決できるか確認
アカウントBのaccountB-serverからaccountA-serverの名前解決ができるか確認してみる。
# dig accounta-server.accounta-private.com +short 【実行結果】 10.0.2.10
accountA-serverのIPアドレスが返ってきました。
8.【アカウントB】FQDN無し(ホスト名)で名前解決する方法
現状では名前解決を指定する際にFQDN(ドメイン名+ホスト名)指定じゃないといけないため
ホスト名だけで引けるように設定します。
まず、アカウントBのDHCPオプションセットを新規作成します。
※既にVPCに紐づいているデフォルトのDHCPオプションセットは変更不可のため、新たに作成し、VPCに紐づける必要があります。

ドメイン名:ap-northeast-1.compute.internal accounta-private.com
※ap-northeast-1.compute.internalはリージョン固有のドメイン
ドメインネームサーバ:AmazonProvidedDNS
※VPC内でのリソース名前解決に利用されるDNS

DHCPオプションセット(dhcp-optionset-accountB)が作成されていることを確認。

アカウントBのVPCを選択し、「DHCPオプションセットを編集」を選択。

dhcp-optionset-accountBを設定し、保存する。

アカウントBのEC2(accountB-server)にログインし、/etc/resolve.confを確認する。
現時点ではsearch行には「ap-northeast-1.compute.internal」のみ存在する状態。
# cat /etc/resolv.conf 【実行結果】 options timeout:2 attempts:5 ; generated by /usr/sbin/dhclient-script search ap-northeast-1.compute.internal nameserver 10.1.0.2
networkサービスを再起動する。
# systemctl restart network
再度resolve.confを確認するとsearch行に「accounta-private.com」が追加される。
# cat /etc/resolv.conf
【実行結果】
options timeout:2 attempts:5
; generated by /usr/sbin/dhclient-script
search ap-northeast-1.compute.internal accounta-private.com
nameserver 10.1.0.2
この状態でホスト名だけで(ドメイン名を省略して)名前解決することができる。
# nslookup accounta-server
【実行結果】
Server: 10.1.0.2
Address: 10.1.0.2#53
Non-authoritative answer:
Name: accounta-server.accounta-private.com
Address: 10.0.2.10
【補足】
直接/etc/resolv.confを編集し、accounta-private.comを追記してもnetworkサービスを再起動すると設定が戻ってしまうので、DHCPオプションセットから編集する必要があります。
コメント