クロスアカウントの VPC ピアリング接続を経由して RDS に接続する検証。
要するにアカウント A と B があって、それぞれに VPC があり、ピアリング接続されている状態で、A の RDS に B の EC2 インスタンスから接続します。
ただし RDS の元々の DNS 名ではなく、RDS 側のアカウントの Route53 プライベートホストゾーンに登録された CNAME で接続します。
プライベートホストゾーンをクロスアカウントで VPC に関連付け
RDS の DNS 名は VPC とか関係なしにグローバルに解決できるので、ピアリング接続・ルーティング・セキュリティグループなどの設定が正しければ、普通にクロスアカウントのピアリング接続を経由して接続できます。
ただ、RDS の DNS 名をそのまま用いずに Route53 プライベートゾーンにそれっぽい CNAME を登録している場合、その CNAME を引くためにはプライベートゾーンを VPC に関連付ける必要があります。
下記の通り手順でクロスアカウントでも関連付けることができます。
マネジメントコンソールからはできないもよう・・ Terraform なら下記を使えばできます。
aws_route53_zone
に lifecycle.ignore_changes = [vpc]
が必要なのがイケてない・・次のような段階で処理されるものの、
- A の
aws_route53_zone
でプライベートゾーン作成&VPC を関連付け - A の
aws_route53_vpc_association_authorization
でクロスアカウントの VPC への関連を許可 - B の
aws_route53_zone_association
で VPC を追加で関連付け
これの 1. と 3. が競合するため ignore_changes
が必要、とのこと。
最初のプライベートゾーンの作成時に VPC を関連付けずに作成し、その後 VPC の関連付けはすべて aws_route53_zone_association
だけでやれば解決な気もするけれども、
プライベートゾーンは作成時点で必ずひとつは VPC を関連付けておく必要がるためダメでした。
Route53 Resolver アウトバウンドから Route53 Resolver インバウンドに転送
プライベートホストゾーンをクロスアカウントに関連付けなくても、ピアリング接続がつながっているなら次の方法でも A のプライベートゾーンの CNAME を B の VPC から解決できます。
- A に Route53 Resolver インバウンドエンドポイントを作成
- B の Route53 Resolver アウトバウンドエンドポイントを作成&転送ルールで A のドメインを A の Route53 Resolver に転送
ただ Route53 Resolver の分の余計な費用がかかるし、無駄に複雑なので最初の方法のが良いですね。
プライベートホストゾーンの上位ドメインを Route53 Resolver の転送ルールに設定
本題の RDS の件とはぜんぜん関係無いですけど、要する次のように設定したときにどうなるか。
- プライベートホストゾーン aaa.example.com を作成して VPC に割当
- Route53 Resolver アウトバウンドを作成し example.com を転送するルールを VPC に割当
これだと 2. による転送のルールが 1. での名前解決を阻害してしまうのではないかと思ったのです・・・特にそんなことはなく aaa.example.com
の名前解決は 1. のプライベートホストゾーンで、それ以外の example.com
の名前解決は 2. の Route53 Resolver の転送が行われました。
下記の記述によるとプライベートホストゾーンを VPC に関連つけると暗黙的に Resolver にルールが作成されるようです。
https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resolver.html#resolver-overview-forward-vpc-to-network-domain-name-matches VPC に関連付けるプライベートホストゾーンごとに、Resolver はルールを作成して、その VPC に関連付けます。プライベートホストゾーンを複数の VPC に関連付けている場合、Resolver はルールを、それらと同じ複数の VPC に関連付けます。
そして以下の記述の通り、元も具体的なルールが優先されます。
クエリが (example.com と acme.example.com など) 複数のルールと一致する場合、Resolver では最も具体的なルール (acme.example.com) が選択され、そのルールで指定している IP アドレスに対しクエリが転送されます。
なお、下記記事によるとプライベートホストゾーンと Route53 Resolver のルールとで同じドメイン名が登録されている場合は Route53 Resolver の方が優先されるようです。
その場合も Route53 Resolver で System ルールを定義することで対応できるようです。
さいごに
これ別に RDS は全然関係ないですね。