このトピックでは、"Invocation canceled by client" エラーの原因と解決策について説明します。
問題の説明
リクエストを処理するためにクライアントから関数が呼び出されると、次のエラーメッセージがリクエストログに報告されます。
FC Invoke End RequestId: 1-64263a4b-2cd7c98b677*********, Error: Invocation canceled by client (duration: 4912ms, maxMemoryUsage: 0.00MB)
考えられる原因
呼び出しを開始したクライアントがリクエストをキャンセルしました。 その結果、関数の実行が中断され、エラーが報告されます。
解決策
問題を解決するには、次の手順に従います。
返されたエラーに基づいて、クライアントがリクエストをキャンセルしたときの関数の実行時間を確認します。
この例では、
duration: 4912ms
は、関数が約5秒間実行されることを示します。実行時間がビジネス要件に基づいて期待を満たしているかどうかを判断します。
実行期間が期待どおりの場合は、クライアントのタイムアウト期間を延長します。 詳細については、「期待どおりの実行期間」セクションをご参照ください。クライアントが切断され、「クライアントによって呼び出しがキャンセルされました」というメッセージが報告された場合はどうすればよいですか? トピックを使用します。
実行時間が期待どおりでない場合は、ログに基づいて関数の実行ロジックを確認し、実行時間を延長するロジックを特定します。 詳細については、「実行期間が予想どおりではない」セクションをご参照ください。クライアントが切断され、「クライアントによって呼び出しがキャンセルされました」というメッセージが報告された場合はどうすればよいですか? トピックを使用します。
期待どおりの実行期間
SDKまたはAPI操作を使用して関数を呼び出す場合は、リクエストタイムアウト期間を関数の設定されたタイムアウト期間よりも長い値に設定することを推奨します。
たとえば、Golang言語を使用し、Function Compute APIを使用して関数を呼び出す場合、http.Clientのtimeoutプロパティを使用してリクエストのタイムアウト期間を設定できます。 リクエストの開始時にcontext.Contextが使用されている場合、コンテキストの期限またはタイムアウト期間を調整できます。
別のサービスを使用して関数を呼び出す場合、function Computeコンソールでサービスのバックエンドタイムアウト期間を変更できます。
たとえば、API操作を使用してフロントエンドで関数を呼び出す場合、API GatewayコンソールでAPI操作のバックエンドタイムアウト設定を変更できます。 詳細については、「APIの作成」をご参照ください。
function Computeコンソールで関数を呼び出す場合は、[リクエストのキャンセル] をクリックしてリクエストをキャンセルしたり、関数を実行する前にwebページを閉じたりしないでください。
実行期間が予想どおりではない
ほとんどの場合、プログラムの実行時間は次の操作によって決まります。
I/O操作
I/O動作、特にネットワークI/O動作は、実行待ち時間の増加の主な原因である。 外部サービスへのアクセス時間が正常かどうかを確認するために、外部サービスへのアクセス前後にログを追加することを推奨します。
コンピューティング操作
多数のコンピューティング動作はまた、レイテンシを増加させ得る。 CPUの仕様を増やすことを推奨します。