Function Computeの関数はインスタンスの形式で呼び出され、安全で分離されたランタイム環境を提供します。 Function Computeは、インスタンスライフサイクルフックを提供します。これは、従来のアプリケーションをサーバーレスアーキテクチャに移行する場合に、メトリックデータの遅延や損失などの問題点に対処するために使用できます。 このトピックでは、関数インスタンスのライフサイクル、関数インスタンスのライフサイクルフックを設定する方法、およびフックのログを照会する方法について説明します。
インスタンスライフサイクル
前の図に示すように、Function Computeインスタンスのライフサイクルには、作成、呼び出し、および破棄フェーズが含まれます。
右上の
このフェーズでは、Function Computeが次のタスクを順番に実行します。
インスタンスを作成します。
ランタイムを初期化します。
Initフックを実行します。
プロビジョニング済みインスタンスを使用する場合、Function Computeは関数インスタンスを割り当て、プロビジョニング済みインスタンスを設定した直後に
作成
プロセスを実行します。 関数呼び出しはすぐには開始できません。 したがって、ランタイム初期化、Initフック実行、および呼び出しフェーズの間に長い時間間隔が存在する可能性があります。オンデマンドインスタンスを使用している場合、Function Computeはリクエストが送信されるとすぐに
作成
プロセスを実行します。 関数にInitフックが設定されている場合、Initフックの実行後にInvoke
プロセスが実行されます。関数インスタンスの場合、関数に設定されたInitフックは1回だけ実行されます。 実行に失敗した場合、別の関数インスタンスが
Init
プロセスを実行するために割り当てられます。Init
フックが失敗したインスタンスは破棄されます。呼び出し
デフォルトでは、Function Computeの標準ランタイムで実行されるインスタンスは、一度に1つのリクエストしか実行できません。 カスタムランタイムおよびカスタムコンテナランタイムで実行されるインスタンスは、一度に複数のリクエストを実行できます。 インスタンスの同時実行性を1より大きい値に設定して、1つのインスタンスが一度に複数のリクエストを実行できるようにすることができます。 詳細については、「インスタンス同時実行の設定」をご参照ください。
破壊する
このフェーズは、関数インスタンスが一定期間呼び出しを受信しない場合にトリガーされます。 このフェーズでは、Function Computeが最初にPreStopフックを実行します。 PreStopフックでクリーンアップタスクを実行できます。
インスタンス凍結メカニズム
Function Computeは、呼び出しが一定期間開始されない場合にインスタンスを凍結し、新しいリクエストが送信される場合にインスタンスを凍結解除します。 次の図にプロセスを示します。
次のシナリオでは、インスタンスが凍結されます。
インスタンスは初期化され、呼び出しはまだ行われません。
インスタンスはリクエストを処理するために呼び出され、後続のリクエストはすぐには送信されません。
呼び出しが完了すると、Function Computeは関数インスタンスをフリーズします。 この場合、プログラム内のバックグラウンドプロセス、スレッド、およびコルーチンは引き続き実行できず、非同期ログの書き込みに失敗する可能性があります。
アイドルモード機能が有効になっていないプロビジョニングされたインスタンスは、リクエストを処理していないときはフリーズしません。
制限事項
すべてのランタイムはInitフックとPreStopフックをサポートします。
PreStopフックの入力パラメーターには、イベントパラメーターがありません。
PreStopフックには戻り値がありません。 PreStopフックに追加されて値を返すロジックは有効になりません。
Javaランタイムを使用する場合は、fc-java-coreを1.4.0以降に更新する必要があります。 それ以外の場合、PreStopフックは使用できません。
関数がレスポンスを返すと、function Computeは関数インスタンスをフリーズします。 応答が返されたときに、すべての非同期プロセス、スレッド、およびコルーチンが正常に実行されたと仮定することはできません。 非同期ログの更新も想定できません。
前提条件
関数が作成されます。 詳細については、「イベント関数の作成」をご参照ください。
ライフサイクルフックの設定
PreStop呼び出しの課金は、InvokeFunction呼び出しの課金と同じです。 詳細については、「課金ルール」をご参照ください。
Function Computeコンソールでのフックの設定
Function Computeコンソールで関数を作成する場合、PreStopフックを設定できません。 関数の更新時にPreStopフックを設定できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[ライフサイクル] をクリックします。 次に、[デプロイ] をクリックします。
ライフサイクルパネルで、ライフサイクルフックとタイムアウト期間を設定し、[OK] をクリックします。
説明各フックのタイムアウト期間を設定する必要があります。 フックの形式は [ファイル名].[フック名] です。 たとえば、Pythonランタイムで関数を作成するときにPreStopフックをindex.preStopに設定した場合、ファイル名はindex.pyで、PreStopフックの名前はpreStopです。
フックを設定した後、コード実行でフックを実装する必要があります。
[コード] タブをクリックします。 コードエディターで、フックのコードを入力します。
たとえば、PreStopフックを
index.preStop
に設定した場合、preStopフックを実装する必要があります。 Function Computeのさまざまなランタイムにライフサイクルフックを実装する方法の詳細については、「さまざまなランタイムの関数インスタンスのライフサイクルフック」をご参照ください。説明オンラインIDEは、PHP、Python、Node.js、およびカスタムランタイムでサポートされていますが、Java、Go、などのコンパイル済み言語のランタイムではサポートされていません。NET、またはカスタムコンテナーのランタイム。
コードエディターの上部でデプロイをクリックしてテスト機能 をクリックします。
Serverless Devsを使用してフックを構成する
Serverless Devsを使用してPreStopフックを構成する場合のs.yaml
ファイルの例を次に示します。
codeUri: './code.zip'
......
instanceLifecycleConfig:
preStop:
handler: index.PreStop
timeout: 60
フックを無効にするには、フックのHandler
パラメーターを空のままにします。 それ以外の場合、関数はデフォルトで更新されません。 たとえば、PreStopフックを無効にする場合、次のパラメーターを設定してデプロイを更新する必要があります。 この場合、PreStopフックのtimeout
パラメーターは有効になりません。
codeUri: './code.zip'
......
instanceLifecycleConfig:
preStop:
handler: ""
timeout: 60
Function Computeのさまざまなランタイムにライフサイクルフックを実装する方法の詳細については、「さまざまなランタイムの関数インスタンスのライフサイクルフック」をご参照ください。
SDKを使用したフックの設定
SDKを使用して、フックをデプロイおよび更新できます。 このセクションでは、関数の作成時にPreFreezeフックを設定するために使用されるSDKサンプルコードを取得する方法について説明します。
[CreateFunction] ページで、[デバッグ] をクリックしてOpenAPIポータルに移動します。
[パラメーター] タブで、関数の基本情報に基づいて [パラメーターのリクエスト] を設定します。
instanceLifecycleConfig
フィールドでPreStopフックを設定できます。パラメーターを設定したら、[SDKサンプルコード] タブをクリックして、必要なプログラミング言語のSDKサンプルコードを取得します。
Function Computeのさまざまなランタイムにライフサイクルフックを実装する方法の詳細については、「さまざまなランタイムの関数インスタンスのライフサイクルフック」をご参照ください。
異なるランタイムでの関数インスタンスのライフサイクルフック
Function Computeのすべてのランタイムは、InitフックとPreStopフックをサポートしています。 次の表に、さまざまなランタイムでインスタンスのライフサイクルフックを実装する方法を示します。
ランタイム | 説明 | 関連ドキュメント |
Node.js | Node.jsランタイムのインスタンスのライフサイクルフックを実装します。 | |
Python | Pythonランタイムのインスタンスのライフサイクルフックを実装します。 | |
PHP | PHPランタイムのインスタンスのライフサイクルフックを実装します。 | |
Java | Javaランタイムのインスタンスのライフサイクルフックを実装します。 | |
C# | C# ランタイムのインスタンスのライフサイクルフックを実装します。 | |
Go | Goランタイムのインスタンスのライフサイクルフックを実装します。 | |
カスタムランタイム | カスタムランタイムでインスタンスのライフサイクルフックを実装します。 | |
カスタムコンテナー実行時間 | カスタムコンテナランタイムのインスタンスのライフサイクルフックを実装します。 |
フック関連のログの照会
インスタンスライフサイクルフックを設定し、フックのコードを実行した後、フックのログを照会できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[ログ] タブをクリックします。 [呼び出しリクエスト] タブで、ログを表示するリクエストを見つけ、[操作] 列の [詳細ログ] をクリックします。
コピーしたインスタンスIDを使用して、すべてのライフサイクルフックの開始ログと終了ログを照会できます。 また、インスタンスIDとhookキーワードを使用して、
c-62833f38-20f1629801fa4bd ***** やPreStop
など、指定したフックの開始ログと終了ログを照会することもできます。開始ログと終了ログのリクエストIDに基づいて、リクエストログを照会することもできます。 ユーザーログにリクエストIDが含まれていない場合は、アイコンをクリックしてコンテキストログを取得できます。
課金ルール
インスタンスライフサイクルフックの呼び出し回数は課金されません。 他の請求可能なアイテムの請求は、呼び出しフェーズにおけるものと同じである。 次の図は、請求可能なフェーズを示しています。
課金の詳細については、「課金の概要」をご参照ください。