Amazon API Gatewayの統合リクエストで、パスパラメータが自動でマッピングされなかった
AWSでAPI Gatewayを扱っていて、少しハマりました。ググっても情報が見つからず、ChatGPTに聞いても答えを知らなかったので、記録を残しておきます。
事象
API Gatewayでは統合リクエストをデフォルト設定にしておけば、リクエストのパラメータはそのままバックエンドに渡してくれるものだと思っていました。しかし、クエリパラメータは自動でマッピングしてくれたのに、パスパラメータは指定したら500エラーになってしまいました。
解決策
統合リクエストのURLパスパラメータにマッピングの設定を追加したらパスパラメータを正常に使用することができました。
詳細
今回の状況
今回の事象は以下のような状況で発生しました。
- API GatewayはOpenAPIのドキュメントから作成しました。
- proxy統合は使用していません。
- 統合リクエストの統合タイプはHTTP。
- 再現環境はHTTPで作りましたが、VPCリンクでも同様の事象が発生しました。
再現環境
記事用に再現環境つくりました。
APIのコード
再現環境APIはLambda(serverless-express)で書きました。
確認のために、クエリパラメータを指定するエンドポイント/query
と、パスパラメータを指定するエンドポイント/path
を作りました。
Lambdaのデプロイ
LambdaはCDKでデプロイしました。
LambdaでAPIを書いたのであれば通常はLambda統合をすればいいのですが、今回はHTTP統合をする為にわざわざLambdaURLを作成してそこに統合しています。
OpenAPIドキュメントでAPI Gatewayの定義
OpenAPIでAPI Gatewayを定義する為にこんな感じで、x-amazon-apigateway-integration
をドキュメントに定義します。
書き方の詳細は公式ドキュメントを読みましょう。
OpenAPIドキュメントからAPI Gatewayのデプロイ
API GatewayもCDKでデプロイしました。OpenAPIのドキュメントを読み込み、そこにLambdaのURLを埋め込んだ上でAPI Gatewayにわたしています。
API Gatewayをデプロイして確認
実際にAPI Gatewayをデプロイして確認すると、、、
クエリパラメーター
問題なく動作しました。
パスパラメータ
500 Internal Server Error
エラーになってしまいました。
なんで???
解決方法
手動でパスパラメータのマッピングを定義したら動きました。
OpenAPIでの設定
比較いただければ分かりますが、この行の追加することで手動でマッピングをしています。
+ requestParameters:
+ integration.request.path.id: "method.request.path.id"
AWSコンソール上での設定
OpenAPIではなくコンソール上で設定する場合は、統合リクエストのURLパスパラメータにマッピングの設定を追加すればOKです。
実際にデプロイして確認
正常応答になりました。
まとめ
API Gatewayでパスパラメータを指定すると500エラーになる時は、手動でマッピング設定をいれればなんとかなる。
良くわからないこと
クエリパラメーターは何も設定不要なのに、パスパラメータは設定必要なのは何故なのか、分かりません。
統合パススルーの動作とかのドキュメントを読むと、何も設定しなければ自動で全パラメータをバックエンドに送ってくれそうに見えますが、違うのでしょうか?
API Gatewayに詳しい人がいたら教えて下さい。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion