Route53 Resolver を使って VPC Endpoint の名前解決が有効な VPC から Private・Regional・Edge API にアクセスしてみる

本記事で検証した内容は実験的なものですので、実環境へ導入する際は自己責任でお願いします。

はじめに

VPC Endpoint を設定している環境で、API Gateway の Regional API または Edge API にアクセスすると 403 エラーが発生することがあります。
これは VPC Endpoint の Private DNS が以下のように機能して発生します。
※以降の図で、波線矢印は名前解決の流れを表しています

これを解消するには、カスタムドメインで Regional / Edge API にアクセスするか、

Private DNS を無効にして、Private API と VPC Endpoint を関連付けすることで生成される以下のようなURLを介して Private API にアクセスする必要があります。
https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}

VPC から API Gateway API に接続するときに HTTP 403 Forbidden エラーが発生するのは何故ですか?
プライベート API を呼び出す方法

しかし、

  • Regional / Edge API にカスタムドメインを用意するのは難しいが (外部システムなど)
  • VPC Endpoint ID が含まれないシンプルな URL で Private API にアクセスしたい

という場合を考慮して、Route53 Resolver の Outbound Rule を使ってこれを実現できないか検証してみました。
検証に利用した CloudFormation テンプレートは、本記事の末尾に載せました。

検証してみた

VPC Endpoint と Route53 Resolver Outbound Rule の有無でフェーズ1, 2, 3 に分けました。

フェーズ1

フェーズ1 は、VPC Endpoint も Outbound Rule も無い状態です。

図中の VPC Lambda は各 API にアクセスし、API が使っているIPアドレスと API のレスポンスを表示します。
VPC Lambda をテスト実行すると以下のようになりました。

フェーズ1の図の通り、

  • Regional / Edge API に Public IP でアクセスし、
  • Private API のエンドポイントの名前解決が出来ていない

ということが分かります。

フェーズ2

フェーズ2には、Private DNS が有効化された VPC Endpoint が配置されています。

VPC Lambda をテスト実行すると以下のようになりました。

フェーズ2の図の通り、

  • 全ての API に Private IP でアクセスし、
  • Regional / Edge API へのアクセスは Forbidden となっている

ということが分かります。

フェーズ3

こちらが本記事のキモです。
フェーズ3は、フェーズ2に Route53 Resolver Outbound Rule を追加した形になっています。
Outbound Rule により Regional / Edge API のドメイン名の名前解決を 8.8.8.8 (Google Public DNS) に転送します。

VPC Lambda をテスト実行すると以下のようになりました。

フェーズ3の図の通り、

  • Regional / Edge API へ Public IP でアクセスし、
  • Private API へ Private IP でアクセスしている
  • いずれの API にもアクセス出来ている

という結果になりました。

CloudFormationテンプレート

VPC Lambda が利用しているレイヤーの関係で、本テンプレートそのままだと東京リージョンでしか動作しません。
別リージョンへ展開する場合はこちらを参考に該当部分を適宜修正ください。