AWS経験5年以上の僕が詳しくご説明します。
本記事の内容
- Route 53のプライベートホストゾーンを作成する
- 作成したプライベートホストゾーンを別アカウントのVPCと関連付ける
もくじ
別アカウントのプライベートホストゾーンを名前解決:はじめに
今回はアカウントBで作成したプライベートホストゾーンのDNSレコードを、アカウントAから名前解決できるように設定します。
プライベートホストゾーンとは
- 設定したVPC内でのみ使用できるプライベート用のドメイン
- インターネットに公開するパブリックドメインとは使用目的が異なる
- [VPCの関連付け] を行うことで、別のAWSアカウントからも名前解決できる
別アカウントのプライベートホストゾーンを名前解決するための準備
事前準備として、アカウントAとアカウントBでVPCとEC2を作成します。
2つのアカウントのVPC DNS設定を有効化
アカウントAとアカウントBのVPC画面で、以下のDNS設定が [有効] になっていることを確認します。
- DNSホスト名
- DNS解決
もし無効になっている場合は、対象のVPCを選択 -> 右上の [アクション] -> [DNSホスト名を編集] または [DNS解決を編集] からそれぞれ有効化します。
2つのアカウントでEC2を用意
プライベートホストゾーンへのVPC関連付けは、マネジメントコンソールからは設定できません。
AWS CLIやAWS SDKなどを使用する必要がありますが、今回はAWS CLIを使用します。
アカウントAとアカウントBでEC2 (Amazon Linux 2) をt2.microで作成、パブリックサブネットに配置しパブリックIPアドレスを付与します。
EC2の作成手順は以下記事をご参照ください。
-
【AWS】EC2でAmazon Linux 2を構築しSSH接続してみよう
続きを見る
2つのアカウントのEC2にIAMロールを設定
IAMポリシーはRoute 53のCreateVPCAssociationAuthorization
などが必要です。
今回はテスト目的のため、上記権限が含まれるIAMポリシーPowerUserAccess
をIAMロールに付与し、それぞれのEC2に設定します。
プライベートホストゾーン作成
アカウントBでプライベートホストゾーンとAレコードを作成します。
1. アカウントBのEC2 プライベートIPアドレスをメモ
アカウントBのEC2画面から、EC2に設定されているプライベートIPアドレスをテキストエディタなどにコピペしておきます。
2. アカウントBでプライベートホストゾーンを作成
アカウントBのRoute 53画面でプライベートホストゾーン を作成します。
[ホストゾーン] -> [ホストゾーンの作成] をクリック。
[ホストゾーン設定] は以下のとおり設定。今回はテスト目的なのでドメイン名は [example.com] としました。
- ドメイン名:example.com
- 説明:(オプション)今回は設定しない
- タイプ:プライベートホストゾーン
[ホストゾーンに関連付けるVPC] は以下のとおり設定し、[ホストゾーンの作成] をクリック。
- リージョン:アジアパシフィック (東京)
- VPC ID:アカウントB側のVPC
- タグ:(オプション)今回は設定しない
3. プライベートホストゾーンにAレコードを作成
アカウントBのEC2 プライベートIPアドレスに紐づくAレコードを作成します。
[レコードを作成] をクリック。
以下のとおり設定し [レコードを作成] をクリックします。[TTL] と [ルーティングポリシー] はデフォルトのままで大丈夫です。
- レコード名:ec2-account-b
- レコードタイプ:A - IPv4アドレスと一部のAWSリソースに・・略
- 値:前の手順でメモしたアカウントBのEC2プライベートIPアドレス
Aレコードを作成できました。
4. アカウントB側のホストゾーンIDを確認
[ホストゾーンの詳細] をクリックし、[ホストゾーン ID] をテキストエディタなどにコピペしておきます。このあとのAWS CLI実行時に使用します。
ちなみに、[関連付けられた VPC] にはアカウントBのVPC IDだけが表示されていますが、本手順を進めるとアカウントAのVPC IDも追加されます。
5. アカウントBで名前解決できることを確認
アカウントBのEC2 (Amazon Linux 2)にSSH接続します。
アカウントBのEC2で以下を実行し、作成したプライベートホストゾーンのレコードが名前解決できることを確認します。
名前解決に失敗する場合は、数分待ったあと再度確認します。DNSレコードが浸透(伝播)されるまで少し時間がかかるためです。
$ dig ec2-account-b.example.com +short
172.16.0.56
名前空間 (example.com など) が重複する場合、パブリックDNSよりプライベートDNSが優先的に名前解決されます。
プライベートホストゾーンへのVPC関連付け (VPC associate)
アカウントAとアカウントBで、プライベートホストゾーンへのVPC関連付けを行います。
1. アカウントA側のVPC IDを確認
アカウントAのVPC画面から、VPC IDをテキストエディタなどにコピペしておきます。このあとのAWS CLI実行時に使用します。
2. アカウントB側でアカウントAのVPCからの関連付けを許可
アカウントBのプライベートホストゾーンに対して、アカウントAのVPCからの関連付けを許可します。
アカウントBのEC2で以下のcreate-vpc-association-authorization を実行します。
少し混乱しやすいのですが、プライベート ホストゾーンIDはアカウントB側で、VPC IDはアカウントA側である点に注意しましょう。
# 変数HOSTED_ZONE_IDに [アカウントBのプライベート ホストゾーンID] を代入
$ HOSTED_ZONE_ID=<hosted-zone-id>
# 変数VPC_IDに [アカウントAの VPC ID] を代入
$ VPC_ID=<vpc-id>
# 変数REGIONにリージョンを代入(今回はap-northeast-1)
$ REGION=ap-northeast-1
# [create-vpc-association-authorization] を実行
$ aws route53 create-vpc-association-authorization \
--hosted-zone-id ${HOSTED_ZONE_ID} \
--vpc VPCRegion=${REGION},VPCId=${VPC_ID} \
--region ${REGION}
出力例
{
"HostedZoneId": "ZXXXXXXXXXXXXXXXXXXX",
"VPC": {
"VPCId": "vpc-xxxxxxxxxxxxxxxxxx",
"VPCRegion": "ap-northeast-1"
}
}
3. アカウントA側からアカウントBのプライベートホストゾーンへのVPC関連付け
アカウントAから、アカウントBのプライベートホストゾーンに対してVPC関連付けを行います。
アカウントAのEC2 (Amazon Linux 2)にSSH接続し、アカウントAのEC2で以下の associate-vpc-with-hosted-zone
を実行します。
# アカウントBで実行した以下の変数代入コマンドを、アカウントA側に対してコピペで実行する
$ HOSTED_ZONE_ID=<hosted-zone-id>
$ VPC_ID=<vpc-id>
$ REGION=ap-northeast-1
# [associate-vpc-with-hosted-zone] を実行
$ aws route53 associate-vpc-with-hosted-zone \
--hosted-zone-id ${HOSTED_ZONE_ID} \
--vpc VPCRegion=${REGION},VPCId=${VPC_ID} \
--region ${REGION}
出力例:コマンド実行直後は [Status] が [PENDING] となっている
{
"ChangeInfo": {
"Status": "PENDING",
"Comment": "",
"SubmittedAt": "2021-10-10T08:57:10.114Z",
"Id": "/change/CXXXXXXXXXXXXXXXXXXX"
}
}
数秒経過後に再度 associate-vpc-with-hosted-zone
を実行してみます。
$ aws route53 associate-vpc-with-hosted-zone \
--hosted-zone-id ${HOSTED_ZONE_ID} \
--vpc VPCRegion=${REGION},VPCId=${VPC_ID} \
--region ${REGION}
通常であれば以下が表示されますが、「既にVPC関連付けが済んでいる」という内容なので、これは正しい結果です。(以下は見やすいように改行しています)
An error occurred (ConflictingDomainExists) when calling the AssociateVPCWithHostedZone operation:
The VPC vpc-xxxxxxxxxxxxxxxxxx in region ap-northeast-1 has already been associated
with the hosted zone ZXXXXXXXXXXXXXXXXXXX with the same domain name.
アカウントBのRoute53 画面を更新すると、[関連付けられたVPC] にアカウントAの VPC ID が追加されています。
4. VPC関連付けの許可を削除
手順3のVPC関連付けが完了したあとは、手順2で実施した「VPC関連付けの許可」を削除しておきます。同じVPC IDからのVPC関連付けの再実行を防ぐためです。
例えば、今後アカウントBのプライベートホストゾーンで他アカウントからのVPC関連付け削除したとします。その場合は上記の「VPC関連付けの許可」を削除しておかないと、アカウントBの同じVPC IDから再度 VPC関連付けができてしまいます。
別の言い方をすると、プライベートホストゾーンを持つAWSアカウントが許可した時だけ、他のアカウントからのVPC関連付けできるようにするということですね。
- VPC関連付けの許可を削除しても、設定済みのVPC関連付けには影響しません。
- 今後、プライベートホストゾーンとアカウントAのこのVPCを再度関連付けたい場合は、手順 2 および 3 を繰り返します。
アカウントBのEC2で以下の list-vpc-association-authorizations
を実行します。
$ aws route53 list-vpc-association-authorizations \
--hosted-zone-id ${HOSTED_ZONE_ID}
出力例:[VPCs] にVPC関連付けを許可しているVPCが表示される
{
"VPCs": [
{
"VPCId": "vpc-xxxxxxxxxxxxxxxxxx",
"VPCRegion": "ap-northeast-1"
}
],
"HostedZoneId": "ZXXXXXXXXXXXXXXXXXXX"
}
アカウントBのEC2で以下の delete-vpc-association-authorization
を実行します。
$ aws route53 delete-vpc-association-authorization \
--hosted-zone-id ${HOSTED_ZONE_ID} \
--vpc VPCRegion=${REGION},VPCId=${VPC_ID} \
--region ${REGION}
コマンドが成功した場合は、結果は何も出力されません。
アカウントBのEC2で以下の list-vpc-association-authorizations
を実行します。
$ aws route53 list-vpc-association-authorizations \
--hosted-zone-id ${HOSTED_ZONE_ID}
出力例:[VPCs] が空になった
{
"VPCs": [],
"HostedZoneId": "ZXXXXXXXXXXXXXXXXXXX"
}
5. アカウントAで名前解決できることを確認
アカウントAのEC2で以下を実行し、作成したプライベートホストゾーンのレコードが名前解決できることを確認します。
名前解決に失敗する場合は、数分待ったあと再度確認します。
$ dig ec2-account-b.example.com +short
172.16.0.56
他アカウントのプライベートホストゾーンを名前解決:まとめ
別アカウントで作成したプライベートホストゾーンのレコードを、DNSで名前解決する手順をご紹介しました。
VPC関連付けのコマンドで、VPC IDの指定が少し混乱しやすいので、手順をよく確認しながらAWS CLIを実行していただければと思います。
最後に、テスト目的で作成したプライベートホストゾーンは忘れずに削除しましょう。