ECS(VPC内)からPublicなREST API gatewayにアクセスしようとしたとき、403エラーが発生してしまいました。その際の解決方法についてメモ書きします。
通信経路は次のルールを想定していました。
ECS(VPC内) --> NATGateWay--> PublicなREST APIGateWay
原因
APIGateWay用のVPCエンドポイントがアタッチされていたことが原因でした。
アタッチされていたVPCエンドポイントは次の経路で通信を行う際は必要です。
ECS(VPC内) --> プライベートなREST APIGateWay
参考: マニュアル
ただ、このVPCエンドポイントを作成してVPCに紐づけると、名前に~.execute-api.<リージョン名>.amazonaws.com
とつくURLは全てプライベートアクセスの通信として処理されます。
VPC エンドポイントでプライベート DNS が有効になっている場合、API の呼び出し URL はプライベート DNS 名 *.execute-api.us-east-1.amazonaws.com でカバーされます。ここで、* は API ID のプレースホルダーです。DNS クエリが VPC 内からパブリック API に対して解決されると、解決された DNS は、パブリック API のパブリック IP ではなく、関連付けられた VPC エンドポイントのプライベート IP をポイントします。API コールは、インターネット経由でルーティングされるのではなく、VPC エンドポイントを介してパブリック API にルーティングされます。VPC エンドポイントはトラフィックをプライベート API にしかルーティングできないため、結果として HTTP 403 エラーが表示されます。
引用: マニュアル
下記はAPIGateWay用のVPCエンドポイントの作成例です。
PublicなREST API gatewayのデフォルトのURLは~.execute-api.<リージョン名>.amazonaws.com
です。(プライベートなREST APIGateWayと同じ)
つまり、この状態でECS(VPC内) からPublicなREST APIGateWayに通信を行うと次のようになります。
ECS(VPC内) --> VPCエンドポイント--> プライベートなREST APIGateWayがない --> 403エラー
解決策
APIGateWay用のVPCエンドポイントを削除するのが一番簡単な方法です。
システム構成上、削除できない場合はAPIGateWayにカスタムドメイン
を設定することで、NATGateWay経由での通信となり、この問題を回避できます。
カスタムドメインの設定方法については、下記に記載しています。参考までに。
RAST APIGatewayにカスタムドメインを設定する方法
お世話になったサイト
VPC内からPublicなAPI gatewayにアクセスできなくて困った話
API GatewayのVPCエンドポイント導入で障害が発生してしまったw