Function Computeは、ユーザーリクエストを処理するために1つ以上のインスタンスを自動的に割り当てます。 各インスタンスは、安全で分離されたランタイム環境を提供します。 Function Computeはサーバーレスアーキテクチャを使用し、関数インスタンスは一時的に作成および破棄されます。 したがって、Function Computeに移行された従来のアプリケーションでは、モニタリングデータの更新が間に合わず、メトリックデータの遅延や損失などの問題が発生する可能性があります。 これらの課題に対処するために、Function Computeは関数インスタンスのライフサイクルベースのフックを提供し、モニタリングデータのリアルタイムの精度と整合性を確保します。
関数インスタンスのライフサイクル
関数のインスタンスは、関数に送信された要求に基づいて動的に作成および破棄されます。 各関数インスタンスのライフサイクルには、Creating、Invoke、およびDestroyフェーズが含まれます。 次の図は、関数インスタンスのライフサイクルを示しています。
作成中
Function Computeは、関数設定に基づいてインスタンスを作成します。 このフェーズでは、Function Computeが次のタスクを順番に実行します。
インスタンス作成: Function Computeはコードとレイヤーを読み込み、イメージを取得してインスタンスを作成します。
Runtime Init: Function Computeはランタイムを初期化します。
Init Hook: Function Computeは、設定されたInitializerフックを実行します。 詳細については、「Initializerフック」をご参照ください。
次の図はフェーズを示しています。
インスタンスは次のシナリオで作成されます。
弾性スケールアウト
Function Computeは、既存のインスタンスが完全にロードされた場合に受信したリクエストを処理する新しいインスタンスを作成します。 作成されたインスタンスは、作成後にInvokeフェーズに入ります。 弾性スケールアウトはコールドスタートを引き起こす可能性があります。 コールドスタートを軽減する方法の詳細については、「コールドスタートの待ち時間を短縮するためのベストプラクティス」をご参照ください。
プロビジョニングされたインスタンス設定の変更
Function Computeは、プロビジョニングインスタンスを設定すると、すぐにインスタンス作成プロセスを開始します。 インスタンスは、リクエストを受信した場合にのみInvokeフェーズに入ります。 詳細は、「プロビジョニング済みインスタンスの設定」をご参照ください。
関数インスタンスの場合、設定されたInitializeフックは1回だけ実行されます。 実行に失敗した場合、別の関数インスタンスが割り当てられて、Initializerフックが実行されます。 Initializerフックが失敗したインスタンスは破棄されます。
呼び出し
Function Computeは、関数ハンドラーを使用して内部および外部リクエストを処理します。 Function Computeの標準ランタイムで実行される各インスタンスは、一度に1つのリクエストのみを実行します。 カスタムランタイムおよびカスタムコンテナランタイムで実行されるインスタンスの場合、各インスタンスは一度に複数のリクエストを処理できます。 インスタンスの同時実行機能を使用すると、1つのインスタンスが一度に複数のリクエストを実行できるようになります。 詳細については、「インスタンスの同時実行数の設定」をご参照ください。
破壊する
このフェーズは、関数インスタンスが一定期間呼び出しを受信しない場合にトリガーされます。 このフェーズでは、Function Computeはインスタンスを破棄する前にPreStopフックを実行します。 PreStopフックでクリーンアップタスクを実行できます。
次のシナリオでは、インスタンスが破棄されます。
使用されていないインスタンス: オンデマンドインスタンスが一定期間リクエストを受信しない場合、Function Computeはインスタンスを自動的に回収します。
プロビジョニングされたインスタンス設定の調整: プロビジョニングされたインスタンス設定でプロビジョニングされたインスタンスの数を減らすと、Function Computeは過剰なプロビジョニング済みインスタンスを破棄します。
インスタンス例外: Function Computeは、作成プロセスまたは実行プロセス中にインスタンスが例外を検出した場合、インスタンスを破棄します。
インスタンス凍結メカニズム
Function Computeは、呼び出しが一定期間開始されない場合にインスタンスを凍結し、新しいリクエストが送信される場合にインスタンスを凍結解除します。 次の図にプロセスを示します。
次のシナリオでは、インスタンスが凍結されます。
インスタンスは初期化され、呼び出しはまだ行われません。
インスタンスはリクエストを処理するために呼び出され、後続のリクエストはすぐには送信されません。
呼び出しが完了すると、Function Computeは関数インスタンスをフリーズします。 この場合、プログラム内のバックグラウンドプロセス、スレッド、およびコルーチンは引き続き実行できず、非同期ログの書き込みに失敗する可能性があります。
制限事項
すべてのランタイムは、InitializerフックとPreStopフックをサポートします。
PreStopフックの入力パラメーターには、イベントパラメーターがありません。
PreStopフックに戻り値がありません。 PreStopフックに追加されて値を返すロジックは有効になりません。
Javaランタイムを使用する場合は、fc-java-coreを1.4.0以降に更新する必要があります。 それ以外の場合、PreStopフックは使用できません。
関数がレスポンスを返すと、function Computeは関数インスタンスをフリーズします。 応答が返されたときに、すべての非同期プロセス、スレッド、およびコルーチンが正常に実行されたと仮定することはできません。 非同期ログの更新も想定できません。
課金
インスタンスライフサイクルフックの呼び出し回数は課金されません。 その他の請求可能なアイテムは、通常の呼び出しと同じです。 次の図は、請求可能なフェーズを示しています。 課金の詳細については、「課金の概要」をご参照ください。
前提条件
関数が作成されます。 詳細については、「関数の作成」をご参照ください。
ライフサイクルフックの設定
Function Computeコンソールでのフックの設定
関数がFunction Computeコンソールで作成されている場合、関数に対してPreStopフックを設定できません。 関数を更新するときに、関数のPreStopフックを設定できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[設定] > ライフサイクル > 変更を選択します。
ライフサイクルパネルで、フックとタイムアウト期間を設定し、[デプロイ] をクリックします。
説明各フックのタイムアウト期間を設定する必要があります。 フックの形式は [ファイル名].[フック名] です。 たとえば、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
フックを無効にするには、フックのハンドラー
パラメーターを空のままにします。 それ以外の場合、関数は更新されません。 たとえば、PreStopフックを無効にする場合は、次のパラメーターを設定してデプロイを更新する必要があります。 この場合、PreStopフックのtimeout
パラメーターは有効になりません。
codeUri: './code.zip'
......
instanceLifecycleConfig:
preStop:
handler: ""
timeout: 60
Function Computeのさまざまなランタイムにライフサイクルフックを実装する方法の詳細については、「さまざまなランタイムの関数インスタンスのライフサイクルフック」をご参照ください。
SDKを使用したフックの設定
SDKを使用して、フックをデプロイおよび更新できます。 このセクションでは、関数の作成時にPreFreezeフックを設定するために使用されるSDKサンプルコードを取得する方法について説明します。
[CreateFunction] ページで、[デバッグ] をクリックしてOpenAPIポータルに移動します。
[パラメーター] タブで、関数の基本情報に基づいて [パラメーターのリクエスト] を設定します。
パラメーターを設定したら、[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が含まれていない場合は、アイコンをクリックしてコンテキストログを取得できます。