API Gateway - LambdaでWebアプリを作成するケースが増えているが、その際API GatewayとLambdaでタイムアウト値が異なり、Lambdaの処理が終わる前にAPI Gatewayのタイムアウトにより処理を終了してしまうケースがあったので少し掘ってみた。
タイムアウト値
・API Gateway:最大29秒
・lambda:最大15分
タイムアウトが発生した場合の挙動
・Lambdaが実行中にAPI Gatewayにてタイムアウトが発生した場合、API Gatewayにて504 Gateway Time-outが発生する。
・Lambdaが先にタイムアウトした場合、API Gatewayにて502 Bat Gatewayが発生する。また、LambdaにてTask timed out afterログが発生する。
対策案
※ChatGPT様よりご提案
非同期処理の使用:
長いタスクを非同期で処理するように設計することで、クライアントはタスクの完了を待たずにレスポンスを受け取ることができます。具体的には以下のようなステップが考えられます。
クライアントからリクエストを受け取ったら、すぐに一意のタスクIDなどを返す。長い処理をバックグラウンドで開始し、完了したら結果をデータベースなどに保存する。クライアントはタスクIDを使用して、別のエンドポイントにポーリングリクエストを行い、結果を取得する。
Step Functionsの使用:
AWS Step Functionsを使って、複数のLambda関数を協調して動作させる長いワークフローを設計することも可能です。Step Functionsは状態を管理し、各ステップの実行状況を監視します。
Websocketの使用:
API GatewayのWebSocket APIを使用することで、リアルタイム通信が可能となります。長いタスクが完了したら、WebSocketを通じてクライアントに結果をプッシュすることができます。
アプリケーションの調整:
タイムアウトが問題となる処理を分析し、処理時間を短縮できる最適化を検討する。例えば、バッチ処理を分割する、キャッシュを使用するなどの調整が考えられます。
感想
パット見非同期がよいように見えたがアプリケーションやらApi Gateway、Lambda周りで変更が入りそうで大変そうなイメージ。次点はStep Functionsか。( 一一)