API Gateway でバックエンドへのリクエストが常に同じパスになるときの対処方法

2023.07.20

困っていた内容

API Gateway で次の構成の API を構築中です。

クライアント -> API Gateway -> VPC リンク -> 自社アプリ(EC2)

greedy パス変数({proxy+})を指定してすべてのリクエストを Catch All して自社アプリに流していますが、クライアントのリクエストしたパスが、自社アプリに反映されず、常に同じパスで自社アプリにリクエストされます。

プロキシ統合は有効にしていますが、パスはバックエンドに反映されないのでしょうか。 バックエンドにクライアントがリクエストしたパスを伝達する方法を教えてください。

どう対応すればいいの?

統合リクエストの「エンドポイント URL」末尾に{proxy}を追加してください。

# 変更前
http://my-load-balancer-1234567890abcdef.elb.ap-northeast-1.amazonaws.com/

# 変更後
http://my-load-balancer-1234567890abcdef.elb.ap-northeast-1.amazonaws.com/{proxy}

API Gateway から呼び出されるバックエンドの URL は「エンドポイント URL」で指定します。また、クライアントのリクエストしたパスは、greedy パス変数で指定した変数{proxy}に格納されます。

そのため、エンドポイント URL に greedy パス変数で指定した変数を追加すると、バックエンドの呼び出し先にクライアントがリクエストしたパスが伝達されます。

参考資料

HTTP プロキシ統合タイプを使用してプロキシリソースをセットアップするには、greedy パスパラメータ (/parent/{proxy+} など) を使用して API リソースを作成し、このリソースを https://petstore-demo-endpoint.execute-api.com/petstore/{proxy} メソッドで HTTP バックエンドのエンドポイント (ANY など) と統合します。greedy パスパラメーターは、リソースパスの末尾にある必要があります。