エラー、タイムアウト、再試行
何か問題が発生したときに invoke が返す内容を読み取る方法、および安全に再度呼び出すことができるタイミングを確認する方法。
1. エラーオブジェクト
invoke は { data, error } を返し、決してスローしません。 error は AuraErrorであるため、 isAuraError(error) は true です。 2 つのサブクラスにより、誰が失敗したかがわかります。
| フィールド | 意味 |
|---|---|
error.status | HTTP ステータス。 0 は、クライアントで障害が発生したことを意味します (応答なし)。 |
error.code | 安定した識別子 (例: NOT_FOUND、 QUOTA_EXCEEDED、 timeout、 invalid_body)。 |
error.message | 関数が返したテキスト、またはプラットフォームの説明。 |
error.context | FunctionsHttpErrorの場合: 関数が返した本文 (解析された JSON またはテキスト)。 |
error.details | 生のエラー本体。プラットフォーム エラーの場合は、 error.request_idが含まれます。 |
2. どのエラーですか?
実行中のスタックに対して観察された動作。クォータ行はバックエンドのエラー マッピングに従いますが、テストではトリガーされませんでした。
| 何が起こったのか | クラス | status | code | message |
|---|---|---|---|---|
| 機能が存在しません | FunctionsHttpError | 404 | NOT_FOUND | 「…機能は「いや」、解決不能です」 |
関数はテキストを含む 500 を返します | FunctionsHttpError | 500 | http_500 | そのテキスト |
関数は 503 自体を返します | FunctionsHttpError | 503 | http_503 | あなたが返したもの |
| あなたの関数はスローします | FunctionsHttpError | 500 | http_500 | 「内部サーバーエラー」 |
関数が timeout_secs を超えています | FunctionsHttpError | 500または503 | http_500 / http_503 | 「関数の実行に失敗しました」または「関数が HTTP 503 を返しました」 |
| ランタイムに到達できません | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | 関数が実行されなかったことを説明します |
| 応答する前にネットワークに障害が発生する | FunctionsRelayError | 0 | network_error | ネットワークエラー |
| プランのクォータが使い果たされた | FunctionsHttpError | 403 | QUOTA_EXCEEDED | クォータメッセージ |
| 1 人のクライアントからの電話が多すぎる | FunctionsHttpError | 429 | rate_limit_exceeded | 待機メッセージ |
| リクエスト本文が大きすぎます | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | 「最大ペイロードサイズを超えました」 |
キャンセルしたか、timeout が経過しました | AuraError | 0 | timeout | 「関数の呼び出しが中止またはタイムアウトしました」 |
| 本文をJSONとして送信することはできません | AuraError | 0 | invalid_body | 避けるべきタイプの名前を付ける |
独自のコードが 502、 503 、または 504を返す場合、 FunctionsHttpErrorが返されます。クラスはステータス番号ではなく、誰が回答したかを示します。
約 256 KiB を超えるリクエスト本文は 503 SERVICE_UNAVAILABLEで拒否され、約 300 KB 以上の レスポンス は 50 秒のテスト内では返されませんでした。 の制限を参照してください。再試行しても役に立ちません。送信するデータを減らすか、ストレージを使用します。
3. 再試行するかどうかを決定する
SDK は呼び出しを再試行しません。関数には副作用がある可能性があり、POST の繰り返しはデフォルトでは安全ではありません。以下の表を使用して決定してください。
| 失敗 | 機能は実行されましたか? | 再試行しても安全ですか? |
|---|---|---|
プラットフォームからの 503 (FunctionsRelayError) | いいえ、ランタイムに到達できませんでした | はい、短いバックオフ付き |
429 | いいえ | はい、error.retryAfter の遅延後 |
403 QUOTA_EXCEEDED | いいえ | いいえ、割り当てがリセットされるかプランを変更するまでは |
status 0 (network_error) | 不明 | 関数が冪等である場合のみ |
クライアント上の timeout | 不明 | 関数が冪等である場合のみ |
FunctionsHttpError 5xx | はい、部分的または完全に | 関数が冪等である場合のみ |
FunctionsHttpError 4xx | はい | いいえ: リクエストを修正します |
プラットフォームは呼び出しの重複を排除せず、 Idempotency-Keyを無視します。支払いや電子メールの場合は、body に渡すキーを保存し、関数の開始時に確認します。
4. タイムアウト
3 つのクロックが同時に実行されます。
| 時計 | デフォルト | どこを変更するか |
|---|---|---|
| あなたのクライアント | responseTypeごとに30秒 | クライアント オプションの invoke(…, { timeout })、 { signal }、または requestTimeoutMs |
| 機能 | 30 秒、1 ~ 300 | 関数の permissions.timeout_secs |
| ゲートウェイ | 380 s | プロジェクトごとに構成できない |
関数が timeout_secsを超えると、ランタイムは関数をキャンセルし、その遅延の後に呼び出しは失敗し、上記の 500 または 503 が表示されます。原因は、raw モードの error.context.detail (WorkerRequestCancelled: request has been cancelled by supervisor) に表示されます。クライアント timeoutの代わりにこのエラーを表示するには、クライアント timeout を関数の timeout_secs の少し上に設定します。
数秒を超える作業の場合、は、接続を開いたままにするのではなく、ジョブ をキューに入れます。
5. 原因を見つける
- プラットフォーム エラーにはリクエスト ID:
error.details.error.request_idが含まれます。サポートに連絡するときにそれを引用してください。 aura functions logs <name>は、最近の HTTP リクエストをメソッド、パス、ステータス、期間、リクエスト ID とともにリストします。関数がconsole.logまたはconsole.errorで何を書いたかは表示されません。その出力はランタイム自体のログに残り、プラットフォーム オペレーターのみが読み取ることができます。このギャップとその他の現在のギャップについては、の制限 を参照してください。- 呼び出しの識別子は関数に転送されません。自分の ID を
headersに渡してログに記録します。