AWS

【Route 53】別アカウントのプライベートホストゾーンを名前解決

【Route 53】別アカウントのプライベートホストゾーンを名前解決
エンジニア
別AWSアカウントのプライベートホストゾーンで作成したDNSレコードを名前解決したいです。

AWS経験3年以上の僕が詳しくご説明します。

 

本記事の内容

  • Route 53のプライベートホストゾーンを作成する
  • 作成したプライベートホストゾーンを別アカウントのVPCと関連付ける

別アカウントのプライベートホストゾーンを名前解決:はじめに

別アカウントのプライベートホストゾーンを名前解決

今回はアカウントBで作成したプライベートホストゾーンのDNSレコードを、アカウントAから名前解決できるように設定します。

 

プライベートホストゾーンとは

  • 設定したVPC内でのみ使用できるプライベート用のドメイン
  • インターネットに公開するパブリックドメインとは使用目的が異なる
  • [VPCの関連付け] を行うことで、別のAWSアカウントからも名前解決できる

 

別アカウントのプライベートホストゾーンを名前解決するための準備

IAMポリシーとDNS設定

事前準備として、アカウントAとアカウントBでVPCとEC2を作成します。

 

2つのアカウントのVPC DNS設定を有効化

アカウントAとアカウントBのVPC画面で、以下のDNS設定が [有効] になっていることを確認します。

  • DNSホスト名
  • DNS解決

VPC 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接続してみよう
【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アドレスをテキストエディタなどにコピペしておきます。

プライベートIPアドレス

 

2. アカウントBでプライベートホストゾーンを作成

アカウントBのRoute 53画面でプライベートホストゾーン を作成します。

[ホストゾーン] -> [ホストゾーンの作成] をクリック。

プライベートホストゾーン作成1

 

[ホストゾーン設定] は以下のとおり設定。今回はテスト目的なのでドメイン名は [example.com] としました。

  • ドメイン名:example.com
  • 説明:(オプション)今回は設定しない
  • タイプ:プライベートホストゾーン

プライベートホストゾーン作成2

 

[ホストゾーンに関連付けるVPC] は以下のとおり設定し、[ホストゾーンの作成] をクリック。

  • リージョン:アジアパシフィック (東京)
  • VPC ID:アカウントB側のVPC
  • タグ:(オプション)今回は設定しない

プライベートホストゾーン作成3

 

3. プライベートホストゾーンにAレコードを作成

アカウントBのEC2 プライベートIPアドレスに紐づくAレコードを作成します。

[レコードを作成] をクリック。

プライベートホストゾーンにAレコード作成1

 

以下のとおり設定し [レコードを作成] をクリックします。[TTL] と [ルーティングポリシー] はデフォルトのままで大丈夫です。

  • レコード名:ec2-account-b
  • レコードタイプ:A - IPv4アドレスと一部のAWSリソースに・・略
  • 値:前の手順でメモしたアカウントBのEC2プライベートIPアドレス

プライベートホストゾーンにAレコード作成2

 

Aレコードを作成できました。

プライベートホストゾーンにAレコード作成3

 

4. アカウントB側のホストゾーンIDを確認

[ホストゾーンの詳細] をクリックし、[ホストゾーン ID] をテキストエディタなどにコピペしておきます。このあとのAWS CLI実行時に使用します。

ちなみに、[関連付けられた VPC] にはアカウントBのVPC IDだけが表示されていますが、本手順を進めるとアカウントAのVPC IDも追加されます。

ホストゾーン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)

プライベートホストゾーンへのVPC関連付け1

アカウントAとアカウントBで、プライベートホストゾーンへのVPC関連付けを行います。

 

1. アカウントA側のVPC IDを確認

アカウントAのVPC画面から、VPC IDをテキストエディタなどにコピペしておきます。このあとのAWS CLI実行時に使用します。

VPC IDを確認

 

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 が追加されています。

関連付けられたVPCを確認

 

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を実行していただければと思います。

最後に、テスト目的で作成したプライベートホストゾーンは忘れずに削除しましょう。

-AWS

© 2022 ふにノート