クロスアカウントの VPC ピアリング接続を経由してカスタム CNAME で RDS に接続

クロスアカウントの 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_zonelifecycle.ignore_changes = [vpc] が必要なのがイケてない・・次のような段階で処理されるものの、

  1. A の aws_route53_zone でプライベートゾーン作成&VPC を関連付け
  2. A の aws_route53_vpc_association_authorization でクロスアカウントの VPC への関連を許可
  3. 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 の件とはぜんぜん関係無いですけど、要する次のように設定したときにどうなるか。

  1. プライベートホストゾーン aaa.example.com を作成して VPC に割当
  2. 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 は全然関係ないですね。