🍠

Amazon API Gatewayの統合リクエストで、パスパラメータが自動でマッピングされなかった

2024/03/25に公開

AWSでAPI Gatewayを扱っていて、少しハマりました。ググっても情報が見つからず、ChatGPTに聞いても答えを知らなかったので、記録を残しておきます。

事象

API Gatewayでは統合リクエストをデフォルト設定にしておけば、リクエストのパラメータはそのままバックエンドに渡してくれるものだと思っていました。しかし、クエリパラメータは自動でマッピングしてくれたのに、パスパラメータは指定したら500エラーになってしまいました。

解決策

統合リクエストのURLパスパラメータにマッピングの設定を追加したらパスパラメータを正常に使用することができました。

詳細

今回の状況

今回の事象は以下のような状況で発生しました。

  • API GatewayはOpenAPIのドキュメントから作成しました。
  • proxy統合は使用していません。
  • 統合リクエストの統合タイプはHTTP。
    • 再現環境はHTTPで作りましたが、VPCリンクでも同様の事象が発生しました。

再現環境

記事用に再現環境つくりました。
https://github.com/k-ibaraki/apigateway-from-openapi/tree/2024-03-24

APIのコード

再現環境APIはLambda(serverless-express)で書きました。
確認のために、クエリパラメータを指定するエンドポイント/queryと、パスパラメータを指定するエンドポイント/pathを作りました。
https://github.com/k-ibaraki/apigateway-from-openapi/blob/2024-03-24/lambda/index.ts

Lambdaのデプロイ

LambdaはCDKでデプロイしました。
LambdaでAPIを書いたのであれば通常はLambda統合をすればいいのですが、今回はHTTP統合をする為にわざわざLambdaURLを作成してそこに統合しています。
https://github.com/k-ibaraki/apigateway-from-openapi/blob/2024-03-24/app.ts#L15-L29

OpenAPIドキュメントでAPI Gatewayの定義

OpenAPIでAPI Gatewayを定義する為にこんな感じで、x-amazon-apigateway-integrationをドキュメントに定義します。
https://github.com/k-ibaraki/apigateway-from-openapi/blob/2024-03-24/api-doc/api.old.yaml#L25-L40

書き方の詳細は公式ドキュメントを読みましょう。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-swagger-extensions-integration.html

OpenAPIドキュメントからAPI Gatewayのデプロイ

API GatewayもCDKでデプロイしました。OpenAPIのドキュメントを読み込み、そこにLambdaのURLを埋め込んだ上でAPI Gatewayにわたしています。
https://github.com/k-ibaraki/apigateway-from-openapi/blob/2024-03-24/app.ts#L31-L42

API Gatewayをデプロイして確認

実際にAPI Gatewayをデプロイして確認すると、、、

クエリパラメーター

問題なく動作しました。

パスパラメータ

500 Internal Server Error

エラーになってしまいました。
なんで???

解決方法

手動でパスパラメータのマッピングを定義したら動きました。

OpenAPIでの設定

https://github.com/k-ibaraki/apigateway-from-openapi/blob/2024-03-23/api-doc/api.new.yaml#L36-L42

比較いただければ分かりますが、この行の追加することで手動でマッピングをしています。

+ requestParameters:
+   integration.request.path.id: "method.request.path.id"

AWSコンソール上での設定

OpenAPIではなくコンソール上で設定する場合は、統合リクエストのURLパスパラメータにマッピングの設定を追加すればOKです。

実際にデプロイして確認

正常応答になりました。

まとめ

API Gatewayでパスパラメータを指定すると500エラーになる時は、手動でマッピング設定をいれればなんとかなる。

良くわからないこと

クエリパラメーターは何も設定不要なのに、パスパラメータは設定必要なのは何故なのか、分かりません。
統合パススルーの動作とかのドキュメントを読むと、何も設定しなければ自動で全パラメータをバックエンドに送ってくれそうに見えますが、違うのでしょうか?
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/integration-passthrough-behaviors.html
API Gatewayに詳しい人がいたら教えて下さい。

NCDCエンジニアブログ

Discussion