PR

【AWS】APIGatewayからLambdaを非同期呼び出しする設定

記事内に広告が含まれています。
SNSフォローボタン
z_a_k_iをフォローする

本記事では、API GatewayからLambdaを非同期で呼び出す方法について紹介します。

こんな悩みをお持ちの方にオススメ!
  • Lambdaの処理完了を待たずに、利用者にレスポンスを返却したい。
  • Lambda呼び出しを非同期にして、API Gatewayの29秒タイムアウト制限をクリアしたい。

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に二つの設定をします。(どちらの設定を先にしても問題ありません)

Lambdaを非同期呼び出しする設定
  • ひとつめ
    リクエストヘッダーの設定

    「X-Amz-Invocation-Type」に「’Event’」を設定

  • ふたつめ
    Lambdaプロキシ統合をオフに設定

API Gatewayのリソースの設定

APIGatewayからLambdaの非同期呼び出し検証用に、APIGatewayのリソースを作成します。

リソースはどのようなものでも問題ありません。

メソッドの作成

以下の設定でメソッドを作成します。

Lambdaプロキシ統合をオフにして作成してください。

API Gatewayのリソースを設定

統合リクエスト設定の変更

リソースの作成後、統合リクエストの設定を変更します。

変更箇所はURLリクエストヘッダーのパラメータ部分となります。

変更前
URL リクエスおtヘッダーのお粗mーえたの変更箇所

変更前はパラメータがない状態。

変更後
URLリクエストヘッダーのパラメータの設定値

URLリクエストヘッダーのパラメータに「X-Amz-Invocation-Type」を追加します。

追加した「X-Amz-Invocation-Type」のマッピング元に「‘Event’」を設定します。

これをすることで、クライアントからの呼び出しは全て非同期で呼び出されるようになります。

この設定をすることで、このリソースはLambdaを起動するだけの処理となります。

Lambdaの処理状態や処理結果を受け取る場合は、別のLambdaの作成が必要となります。

処理結果を確認するためのロジックは独自で実装が必要です。

処理結果確認するLambdaのために、非同期対象のLambdaには、DynamoDBなどに処理状況書き込み処理などが必要となります。

リクエストヘッダーのパラメータの変更は、Lambdaプロキシ統合をオンにしている場合だと、変更できません。

非同期にする際の注意点

Lambda呼び出しを非同期にすると、同期処理にはなかったペイロードのサイズ制限が発生します。

256KBまでしかペイロードを送信することができなくなります

256KB以上のペイロードを設定し実行した場合、「ペイロードが256KB以上は不可」という内容のValidationErrorが発生しました。

同期処理の際にはこのような制限がなかったことから、AWSでは非同期処理の場合、ペイロードのサイズ制限が発生するようです。

余談

私は、256KB以上のペイロードで非同期処理を行いたかったのですが、今回の内容ではやりたいことを実現できませんでした。

仕方なかったので、恒久的な対応として同期処理に戻し、クライアント側で対応することにしました。

具体的には、API Gatewayからタイムアウトエラーが返却されてもクライアント側ではエラーとせず無視。

タイムアウトエラーが発生しても、処理結果を確認するLambdaを呼び出します。

処理結果を確認するLambdaからの返却値で処理結果を判断することとしました。

Z-A-K-I
Z-A-K-I

この方法だと、API Gatewayのログには504エラーが出力されてしまいますが、アプリケーションの実害はないのでよしとしました。

APIGatewayからLambdaを非同期呼び出しする方法のまとめ

本記事では、APIGatewayから非同期でLambda呼び出しを行う具体的な方法を紹介しました。

当記事で検証した方法だと、私が実現したい要件を達成することはできませんでしたが、AWSのペイロードの制限の傾向がわかりましたので、別案で対応する決心がつきました。

本記事が皆様の参考となりましたら幸いです。

Step Functionsを利用することで、非同期呼び出しも可能です。

興味のある方はこちらの記事をご覧ください。

参考書籍

参考サイト

今回の対応をするにあたり、以下のサイトを参考にさせていただきました。
ありがとうございます。

バックエンド Lambda 関数の非同期呼び出しをセットアップする - Amazon API Gateway
Lambda 統合における Lambda 非同期呼び出しについて説明します。
API ゲートウェイから非同期で Lambda 関数を呼び出す
Amazon API Gateway API に対して、AWS Lambda 関数を同期ではなく非同期で呼び出したいと考えています。

コメント