本記事では、API GatewayからLambdaを非同期で呼び出す方法について紹介します。
WebAPIをAWSで作成する場合、API GatewayとLambdaで構築するのがよくある構成です。
しかし、この構成では問題があります。
それは、Lambdaのタイムアウトは15分まで設定できるのに対し、API Gatewayは29秒までしか設定できないことです。
そのため、Lambdaのタイムアウト前にAPI Gatewayから利用者にタイムアウトのレスポンスが発生してしまいます。
Lambdaですこし重たい処理を行うと、処理時間が29秒を超えることはよくあり、負荷が高くなるとタイムアウトエラーが頻出し困ります。
そこでこの記事では、API GatewayからLambdaを非同期で呼び出し、API Gatewayのタイムアウトする事象を対策した事例を紹介します。
なお、APIGatewayのタイムアウト対策として、Step Functionsを利用して対応する方法もあります。
StepFunctionsを使って、Lambda呼び出しを非同期にする方法は、こちらの記事をご覧ください。
APIGatewayからLambda呼び出しを非同期にする設定
APIGatewayに二つの設定をします。(どちらの設定を先にしても問題ありません)
- ひとつめリクエストヘッダーの設定
「X-Amz-Invocation-Type」に「’Event’」を設定
- ふたつめLambdaプロキシ統合をオフに設定
API Gatewayのリソースの設定
APIGatewayからLambdaの非同期呼び出し検証用に、APIGatewayのリソースを作成します。
リソースはどのようなものでも問題ありません。
メソッドの作成
以下の設定でメソッドを作成します。
Lambdaプロキシ統合をオフにして作成してください。
統合リクエスト設定の変更
リソースの作成後、統合リクエストの設定を変更します。
変更箇所はURLリクエストヘッダーのパラメータ部分となります。
変更前
変更前はパラメータがない状態。
変更後
URLリクエストヘッダーのパラメータに「X-Amz-Invocation-Type」を追加します。
追加した「X-Amz-Invocation-Type」のマッピング元に「‘Event’」を設定します。
これをすることで、クライアントからの呼び出しは全て非同期で呼び出されるようになります。
非同期にする際の注意点
Lambda呼び出しを非同期にすると、同期処理にはなかったペイロードのサイズ制限が発生します。
256KBまでしかペイロードを送信することができなくなります。
256KB以上のペイロードを設定し実行した場合、「ペイロードが256KB以上は不可」という内容のValidationErrorが発生しました。
同期処理の際にはこのような制限がなかったことから、AWSでは非同期処理の場合、ペイロードのサイズ制限が発生するようです。
余談
私は、256KB以上のペイロードで非同期処理を行いたかったのですが、今回の内容ではやりたいことを実現できませんでした。
仕方なかったので、恒久的な対応として同期処理に戻し、クライアント側で対応することにしました。
具体的には、API Gatewayからタイムアウトエラーが返却されてもクライアント側ではエラーとせず無視。
タイムアウトエラーが発生しても、処理結果を確認するLambdaを呼び出します。
処理結果を確認するLambdaからの返却値で処理結果を判断することとしました。
この方法だと、API Gatewayのログには504エラーが出力されてしまいますが、アプリケーションの実害はないのでよしとしました。
APIGatewayからLambdaを非同期呼び出しする方法のまとめ
本記事では、APIGatewayから非同期でLambda呼び出しを行う具体的な方法を紹介しました。
当記事で検証した方法だと、私が実現したい要件を達成することはできませんでしたが、AWSのペイロードの制限の傾向がわかりましたので、別案で対応する決心がつきました。
本記事が皆様の参考となりましたら幸いです。
Step Functionsを利用することで、非同期呼び出しも可能です。
興味のある方はこちらの記事をご覧ください。
参考サイト
今回の対応をするにあたり、以下のサイトを参考にさせていただきました。
ありがとうございます。
コメント