API Gatewayのデフォルトエンドポイントをパブリックに公開してたのに通信不達で悩んだ話
オペレーション部の加藤(早)です。
発端
とあるAPIサービスについて、こんなやり取りがありましたとさ。(フィクションです)
公開側「API公開しました!URLはこちらです!」
https://{API-ID}.execute-api.ap-northeast-1.amazonaws.com/prod
とある利用者「うちのサーバから到達できないみたいなんだけど…」
公開側「え?インターネットに公開しているし、特にアクセス制限もしてないよ?他の人はみんな使えてるし、URL間違えてない?」
原因
到達できなかった利用者のサーバはAWS上にあり、そのサーバが存在するVPCに東京リージョンのAPI Gateway( *.execute-api.ap-northeast-1.amazonaws.com ) 宛のVPC Endpointが設定されていたため、対象APIへの接続経路にプライベートリンクを使っていました。
一方、API公開側はインターネットからのアクセスを前提に想定しており、プライベート接続を想定していませんでした。
API Gatewayに対してプライベート接続を行う場合はAPI側にリソースポリシーの設定を入れる必要がありますが、リソースポリシーの設定がないために、到達が不可能になってしまっていました。
(参考) この状態で利用者のサーバからAPI Gatewayのデフォルトエンドポイントの名前解決をするとVPC EndpointのプライベートIPが返ってくるようになっています。
対処
以下のどちらかで対応します。
(1) リソースポリシーに利用者のVPC Endpointからのアクセス許可を設定する。
(2) APIのドメインに *.execute-api.ap-northeast-1.amazonaws.com 以外を指定する(カスタムドメインの設定)
今回は、提供側はリソースポリシーに利用者のVPC Endpoint IDを逐一追加していくようなオペレーションをしたくなかったため、APIにカスタムドメイン名を設定して回避しました。
HTTP API のカスタムドメイン名の設定 - Amazon API Gateway
これでプライベート接続は避けられ、名前解決リクエストにはグローバルIPアドレスが返ってきます。
公開側「カスタムドメイン設定してみました。 https://example.com/hoge だとどう?」
利用者「接続できるようになりました!」
教訓
API公開側
利用者のプライベートネットワークの構成によっては、パブリックなAPI Gatewayであっても、デフォルトエンドポイントに到達できないことがあります。
不特定多数あるいは詳細な構成を教えてもらうことができないサーバに対して公開するAPI Gatewayでは、デフォルトエンドポイントを使わずにカスタムドメインを設定しておくのが無難です。
利用者側
上記の事象がおきたら、カスタムドメインの設定をお願いしましょう。
もしも何らかの事情でデフォルトエンドポイントの利用を譲れない(カスタムドメインが使えない)という場合、提供側にあなたのVPC Endpoint IDを教えてあげて、APIのリソースポリシーの更新ができないかを交渉しましょう。
参考リンク
HTTP API のカスタムドメイン名の設定 - Amazon API Gateway
Amazon API Gateway でのプライベート API の作成 - Amazon API Gateway
[新機能] Amazon API GatewayプライベートAPIとVPCエンドポイントでプライベートなサーバーレスアプリ構築 | DevelopersIO