Vercel FunctionsでFUNCTION_INVOCATION_TIMEOUTが出たら、設定時間を延ばす前に、どのデプロイ・ルート・入力で、どの処理が終わらなかったかを確認します。上流API待ち、DB接続、再試行の累積、応答を返さない分岐、処理量の増加では、必要な修正が違います。
この記事はVercel Functionsのタイムアウト診断です。関数の実行、負荷試験、設定・プラン変更、デプロイは実施していません。診断項目の表は設計例で、実環境の性能測定値ではありません。
目次
エラーコードと、時間を計る境界を固定する
リクエストID、時刻、デプロイ、ルート、ランタイム、入力規模、表示されたエラーコードを記録します。ブラウザーや外部プロキシのタイムアウトと、Vercel側のFUNCTION_INVOCATION_TIMEOUTを分けます。クライアントが切断しただけでは、外部更新が未実施だと判断できません。
公式エラー説明(新しいタブで開く)は、時間内に終わらない処理、応答を返さない経路、無限ループ、上流の問題を確認するよう案内しています。正常入力だけを見ず、失敗した入力の大きさ、件数、分岐、上流応答を照合します。
表は横にスクロールできます
| 最後に確認できた段階 | 調べる対象 | すぐにしないこと |
|---|---|---|
| ハンドラー開始前後 | 初期化と依存読込 | DBだけを疑う |
| 接続待ち | 接続プール・接続取得・並行数 | 無制限の接続追加 |
| 外部API待ち | 上流タイムアウト・再試行 | 期限なしの再試行 |
| 計算・変換 | 入力規模とアルゴリズム | 全件並列化 |
| 最後までログあり応答なし | return・await・ストリームの終端 | ログ成功だけで完了 |
ログには個人情報やプロンプト全文、トークンを出さず、段階、経過時間、件数、状態、識別子を記録します。時刻の違うリクエストを一つの処理時間へ混ぜないようにします。
実効値のmaxDurationと、適用条件を確認する
実行時間の現行資料(新しいタブで開く)で、ランタイム、Fluid Computeの有無、プラン、関数ごとの設定を確認します。コード・設定ファイル・管理画面の値が異なる場合、実際のデプロイにどの値が採用されたかを調べます。ローカルで設定した値だけで、公開済み関数の上限を断定しません。
現行のFluid Compute表では既定300秒、Hobbyの上限300秒、Pro/Enterpriseの通常上限800秒です。最大1800秒への拡張はベータで、Pro/Enterpriseが対象です。対応するランタイムはnodejs22.x、nodejs24.x、Bunの1.xと1.4.x、python3.12、python3.13、python3.14です。800秒超はコードまたはvercel.jsonで関数ごとに設定する必要があり、プロジェクト全体の既定値では指定できません。ベータ期間中、Secure ComputeとStatic IPsでは800秒超に対応していません。利用中のランタイムと構成を照合し、すべての環境で1800秒使えると判断しないでください。
上限を延ばすことは、待てる時間を増やす変更です。遅いクエリ、未完了のPromise、無限再試行、応答漏れの修正にはなりません。正常な仕事に必要な時間と、異常時に打ち切る時間を分けて判断します。
上流と再試行へ、全体期限より短い予算を置く
一回の外部API待ちだけで全体期限を使い切らず、接続、取得、再試行、後処理、応答の時間配分を決めます。SDKと自作再試行が重なっていないか、429や5xxのたびに同じ処理全体をやり直していないかを確認します。各待ちの合計と件数の増加を見ます。
表は横にスクロールできます
| 設計する項目 | 確認すること | 期限時の扱い |
|---|---|---|
| 上流要求 | タイムアウトと取消対応 | 対象だけ打切・記録 |
| 再試行 | 対象エラー・回数・残時間 | 予算外なら保留 |
| 一括処理 | 処理単位と再開位置 | 完了範囲から再開 |
| 外部書込 | 一意IDと保存後の読み戻し | 不明を即再送しない |
| 応答 | 成功・失敗の全分岐 | 必ず意味ある終端 |
タイムアウトを設定しても、上流側の処理が必ず取消されるわけではありません。書込の要求後に応答を失った場合は、処理IDや相手の状態を照合します。HTTPエラーだけを未実施と扱うと、再試行で二重登録や送信を起こし得ます。
ストリーミングとバックグラウンド処理を、無期限化と考えない
ストリーミングで途中経過を返す設計でも、関数の実行期限やストリーム終端は残ります。クライアントが早く文字を受け取ったことと、仕事全体の完了を分けます。通信のない状態が長く続く接続はクライアント・プロキシの条件も受けるため、表示上のタイムアウトと関数のログの時間を照合します。
応答後へ仕事を移す場合も、処理が永続化され、失敗から再開できるかを確認します。単に待たないPromiseを作ってreturnしただけで、処理保証が得られたと扱いません。時間を大きく超える仕事や、デプロイ・障害をまたいだ再開が必要なら、永続的なワークフローやキューなどの設計へ分けます。サービスの導入や課金は別の判断です。
正常・異常・再開の三条件で確認する
許可された検証では、代表入力、上流が遅い入力、大きな入力、上流失敗、書込後の結果不明を分けます。処理時間が収まるだけでなく、失敗時に適切な応答ステータスと処理状態を残し、同じ入力を再開しても重複しないことを確認します。件数と所要時間の比較条件も保存します。
変更前の設定とコード差分、基準入力、対象デプロイを残します。失敗時に差分を戻しても、途中の外部更新は別に照合します。完了記録は「タイムアウトが消えた」だけでなく、遅延の原因、処理した範囲、応答結果、残った未処理、未測定の負荷条件まで示せる状態にします。
