概要
AWS API GatewayとLambdaを利用した構成を実装し、API Gatewayのドメインにアクセスすると以下のエラーに遭遇。解決方法を紹介します。
{"errorMessage": "The adapter was unable to infer a handler to use for the event. This is likely related to how the Lambda function was invoked. (Are you testing locally? Make sure the request payload is valid for a supported handler.)"
Mangum
というライブラリを使うことで、リクエストとレスポンスをLambdaとAPI Gatewayが扱える形式に変換できるので、そちらを利用してFastAPIのアプリを動かしています。
Mangum is an adapter for running ASGI applications in AWS Lambda to handle Function URL, API Gateway, ALB, and Lambda@Edge events.
https://pypi.org/project/mangum/
解決方法
API Gateway構築時に「Lambdaプロキシ統合」がオフになっているのが原因でした。
オフの場合、Mangum
のようなアダプターがリクエストを正しく処理する際にエラーが発生してしまいます。
Lambdaプロキシ統合とは?
設定「Lambdaプロキシ統合」とは、API GatewayとLambda関数の間でリクエストとレスポンスを直接やり取りするための統合方法。
この統合方法をオンにしていると、API GatewayはHTTPリクエストをそのままLambda関数に渡し、Lambda関数のレスポンスをそのままクライアントに返す、という形式を取ります。
Lambda プロキシ統合を使用すると、API ルートを Lambda 関数と統合できます。クライアントが API を呼び出すと、API Gateway はリクエストを Lambda 関数に送信し、関数のレスポンスをクライアントに返します。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html
これにより標準化された形式でLambda関数に渡されるため、Mangum
のようなアダプターがリクエストを正しく処理できるのです。
Lambdaプロキシ統合がオフの場合、API GatewayはMangum
のようなアダプターが正しく処理できない形式でLambda関数に送ってしまうようで、上述のエラーが出ます。
ということで、API Gatewayの画面からオンにすれば解決しました。
参考:
- AWS repost
The issue was with the request mapping. There were none. SInce lambda is expecting a HTTP request mapping is needed before passing to the lambda.
https://repost.aws/ja/questions/QUxHgwh_cIRPuuy_sHav7pnQ/magnum-with-api-gateway
- StackOverflor
This error occurs when we don't enable below flag in the create method page under any Resource in API gateway.
Enable this flag
Lambda proxy integration Send the request to your Lambda function as a structured event. Please click on the below image
https://stackoverflow.com/questions/77562091/mangum-adapter-unable-to-infer-handler-to-use-for-event-on-aws-api-gateway