マルチアカウント環境におけるRoute 53 Profileの活用

4/23のAWSのアップデートで、Amazon Route 53 Profileが新規に設定可能となりました。

https://aws.amazon.com/jp/blogs/aws/unify-dns-management-using-amazon-route-53-profiles-with-multiple-vpcs-and-aws-accounts/


主な特徴は以下の通りです。
* Route 53で設定可能なプライベートホストゾーン、リゾルバー転送ルール、DNSファイアウォールルールグループ等のDNS設定をプロファイルの形式で定義する
* プロファイルは、同じリージョンの複数のVPCに適用できる
* AWS Resource Access Manager（RAM）を利用することで、プロファイルを他のAWSアカウントに共有できる
* 2024/4/23時点でカナダ西部（カルガリー）、AWS GovCloud（米国）リージョン、中国リージョン以外のすべてのAWSリージョンで利用できる


# これまでの設定方法
これまでAWSのマルチアカウント環境でDNS設定を共有する場合、個々の設定ごとに紐づけ作業が必要でした。
本記事ではまずアカウントAで定義した各DNS設定を、アカウントBに共有する手順をおさらいしてみます。

## プライベートホストゾーン
アカウントAで設定したプライベートホストゾーンを、アカウントBのVPCに共有するためには、AWS CLI、AWS SDK、Amazon Route 53 APIのいずれかを利用する必要があります。マネジメントコンソールからは設定できません。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zone-private-associate-vpcs-different-accounts.html

AWS CLIを利用する場合は、まずアカウントAより関連付けのリクエストを設定します。
```
aws route53 create-vpc-association-authorization \
  --hosted-zone-id <アカウントAのプライベートホストゾーンのHosted Zone ID> \
  --vpc VPCRegion=<リージョン>,VPCId=<アカウントBのVPC ID>
```

そしてアカウントBで以下コマンドを入力し、リクエストを承認します、
```
aws route53 associate-vpc-with-hosted-zone \
  --hosted-zone-id <アカウントAのプライベートホストゾーンのHosted Zone ID> \
  --vpc VPCRegion=<リージョン>,VPCId=<アカウントBのVPC ID>
```
承認後アカウントAのマネジメントコンソールにて、プライベートホストゾーン設定画面を開くと、アカウントBのVPCが紐づけられていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/7c9029d8-8d60-de42-8552-4a9b66299d1d.png)


## リゾルバールール
アカウントAにてRoute 53 Resolverより、共有するリゾルバルールを開き、「共有」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/32491b4e-c5a9-b577-8658-1aca3cef054f.png)


RAMの設定画面が開きます。任意の名前を入力し、「リソース」は「リゾルバルール」を選択したうえで、共有したいルールをチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/e7e5a4b2-66dd-d4cd-8cd7-fb97365c18a9.png)


「選択したリソース」でチェックを入れたルールが表示されていることを確認したら、「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/4aed000a-2cf4-efdb-ff3c-716cae46e57a.png)


アクセス許可の設定画面が表示されますが、特に変更はせず「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/a35a2902-527e-f6d9-9eed-055a3d6a2c4f.png)

ルールの共有先を設定します。AWS Organizationsを利用している場合は、「自分の組織内でのみ共有を許可」を選択します。プリンシパルで共有先のOUまたはアカウントを選んだら、下部の「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/c1d15d85-57cd-76be-e1a1-4bf21d785dd7.png)

設定内容を確認し、下部の「リソース共有の作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/6a169434-5dac-8155-34be-adbcb1e14430.png)

:::note info
AWS Organizationsと連携するためには、事前にRAMの「設定」にて「次との共有を有効にする: AWS Organizations」にチェックを入れる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/e4393de2-71b9-0b61-d83a-359092e6e550.png)

なおAWS Organizationsの「サービス」からも有効化することは可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/ba2db41b-d9c1-5263-1713-9a43b6e06a95.png)
:::

アカウントBにて共有状況を確認します。
RAMを開き、左ペインの「自分と共有」から先ほど作成した共有設定が常時されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/48db6073-c3d7-9928-8e14-edbc946e6efc.png)

## DNSファイアウォールルールグループ 
流れはリゾルバールールと同じです。
まずはアカウントAにてDNSファイアウォールルールを開き、共有対象のルールの設定画面より「ルールグループを共有」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/158b2c96-ea4b-7cf6-d5de-02f783ea39a4.png)

RAMの設定画面が開きます。任意の名前を入力し、「リソース」は「Route53リゾルバーのファイアウォールグループ」を選択したうえで、共有したいルールをチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/b982e64e-fef3-3be1-8eb5-b057aa51e971.png)


「選択したリソース」でチェックを入れたルールが表示されていることを確認したら、「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/0304f804-d46a-071b-a67e-b3f11e217447.png)

以降はリゾルバールールと同様に、ルールの共有先の設定を行います。

# Route 53 Profileの利用
これまでの設定方法では、リゾルバーやDNSファイアウォールで複数のルールを定義している場合、どのアカウントにどのルールの組み合わせを適用すべきか判別が難しいという課題があります。
また誤ったルールを適用した場合、セキュリティ上のリスクが増し、トラブルシュートも複雑化する恐れがあります。

Route 53 Profileを利用することで、上記課題は解決すると考えます。
設定方法を見てみましょう。

Route 53を開き、左ペインより「プロファイル」を選択し、「プロファイルを作成」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/81d653ea-e18a-e488-7220-d8a1b2c90cd6.png)

プロファイル名を入力し、「プロファイルを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/a3e966a8-117a-d81e-7e9e-637ff95c2854.png)

プロファイルは作成しましたが、まだいずれの設定も含まれていない状態です。ここからプロファイルに追加したい設定を選択し、関連付けを行う必要があります。
例えばDNSファイアウォールルールを設定する場合、まず「関連付ける」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/e800133d-1c17-2635-ef15-c43ee300572c.png)


追加したいルールを選択し「次へ」を押下します、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/11ad76cc-d682-9846-27db-870c2f071bdd.png)


複数のルールを関連付ける場合、ルールの優先度を設定することができます、設定したら、「送信」を押下すると、無事にプロファイルに追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/b09e2118-ceff-f956-0467-3f2cb0a74b58.png)

リゾルバールールやプライベートホストゾーンも同様に追加したら、「プロファイルを共有」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/4033d6a6-59fd-e5df-1c77-5ff90f4cadca.png)

RAMの画面が開くため、「リソース」にて「Route 53 Profiles」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/f3b45ad1-763d-d15b-8c08-6ed5560c62b8.png)


以降の設定はリゾルバールールおよびDNSファイアウォールルールと同じのため割愛します。

プライベートホストゾーンはVPCに対し共有します。
プロファイル内の「VPC」を設定することで、対象とする範囲を設定することが可能です。ただし別アカウントのVPCはオプションに表示されないため、上述の通り個別で関連付けの設定が必要のようです。（公式ドキュメント上では特に明記なし）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/627d4386-e96b-9f35-c8f6-13b6211b3657.png)

プライベートホストゾーンの共有については、依然として手間がかかりますが、環境や通信要件等に応じて複数のプロファイルを用意し、DNS関連の設定を一元管理／適用できる点が便利になりそうです。

# 参考
* [Amazon Route 53 Profiles](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/profiles.html)
* [[Route 53]他のAWSアカウントのVPCにプライベートホストゾーンを関連付ける](https://dev.classmethod.jp/articles/associate-private-hosted-zone-to-other-account-vpc/)
* [Route 53 Resolver Rule を Resource Access Manager で共有してみた](https://dev.classmethod.jp/articles/share-route-53-resolver-rule-by-ram/)