関数インスタンスのライフサイクルフックを実装および設定した後、対応するイベントが発生すると、Function Computeはライフサイクルフックを呼び出します。 Node.jsランタイムで実行される関数のライフサイクルフックは、InitializerフックとPreStopフックです。
使用上の注意
関数インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出し要求の課金ルールと同じです。 ただし、実行ログは、関数ログ、リアルタイムログ、および高度なログでのみ照会できます。 ライフサイクルフックのログは、呼び出し要求リストに表示されません。 詳細については、「インスタンスライフサイクルフックのログの表示」をご参照ください。
初期化フック
Initializerフックは、関数インスタンスが開始された後、ハンドラが実行される前に呼び出されます。 Function Computeは、Initializerフックが関数インスタンスのライフサイクル内で最大1回正常に呼び出されるようにします。 たとえば、Initializerフックの実行に失敗した場合、システムはInitializerフックが正常に実行されるまでInitializerフックを再試行し、ハンドラーを実行します。
Initializerコールバックには、コンテキスト入力パラメーターが1つだけあります。 次のサンプルコードは、単純なInitializerコールバックを示しています。
ECMAScriptモジュール
この例では、Node.js 18以降のみをサポートします。
export const initialize = async (context) => {
console.log('initializer');
return "";
}
CommonJSモジュール
exports.initialize = function(context, callback) {
console.log('initializer');
callback(null, "");
};
Initializer
は、Initializerフックの名前です。 名前は、Function Computeコンソールで設定したInitializerフックと同じである必要があります。 たとえば、関数のInitializerフックの名前をindex.initialize
に設定した場合、Initializerプロパティが設定された後、Function Computeはindex.js
ファイルで定義されたinitialize
メソッドを読み込みます。
メソッド署名
入力パラメーターは
context
のみで、呼び出し時にFunction Compute関数に実行中のコンテキストを提供します。値は返されません。 関数を終了するには、コードでreturnまたはcallbackを呼び出す必要があります。
PreStopフック
関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックのメソッド署名は、Initializerフックのメソッド署名と同じです。
次のサンプルコードは、単純なPreStopフックの例を示しています。
ECMAScriptモジュール
この例では、Node.js 18以降のみをサポートします。
export const preStop = async (context) => {
console.log('preStop');
return "";
}
CommonJSモジュール
module.exports.preStop = function(context, callback){
console.log('preStop');
callback(null, "");
}
ライフサイクルフックの設定
Function Computeコンソールの使用
Function Computeコンソールでは、関数設定でInitializerフックとPreStopフックを設定できます。 詳細は、「インスタンスライフサイクルの設定」をご参照ください。 フックの形式は [ファイル名. メソッド名]
です。 例:
index.initialize
は、index.js
ファイルのinitialize
メソッドを示します。index.preStop
は、index.js
ファイルのpreStop
メソッドを示します。
Serverless Devsを使用したライフサイクルフックの設定
Serverless Devsを使用してライフサイクルフックを設定する場合は、InitializerフックまたはPreStopフックをs.yaml
ファイルに追加する必要があります。
初期化フックの設定
handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.initializerをpropsに追加します。
PreStopフックの設定
handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.preStopをpropsに追加します。
サンプルコード:
edition: 3.0.0
name: hello-world-app
access: default # The alias of the key.
resources:
hello_world:
component: fc3 # The name of the component. Serverless Devs is similar to a game console and does not have specific business capabilities without components. A component is similar to a game card. You can insert different game cards into the game console to play different games. Similarly, you can use different components to implement different business capabilities.
# actions: # The custom execution logic. For more information about actions, visit https://docs.serverless-devs.com/serverless-devs/yaml#%E8%A1%8C%E4%B8%BA%E6%8F%8F%E8%BF%B0actions.
props:
region: cn-hangzhou # For more information about how to use variables, visit https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC.
functionName: nodejs-fc-hooks
description: "Node.js lifecycle hooks by serverless devs"
runtime: nodejs20
code: ./code
handler: index.handler
memorySize: 128
timeout: 30
instanceLifecycleConfig:
preStop:
handler: index.preStop
timeout: 3
initializer:
handler: index.initialize
timeout: 3
internetAccess: true
logConfig: auto
Serverless DevsのYAML設定の詳細については、「Serverless Devsの一般的なコマンド」をご参照ください。
インスタンスライフサイクルフックのログを表示する
ライフサイクルフックのログは、[ログ] で表示できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、テスト機能タブをクリックします。テスト機能を選択し、 .
[ログ] タブでは、関数呼び出しログとInitializerログを表示できます。 例:
2023-09-06 11:18:10FC Initialize Start RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7 2023-09-06 11:18:10load code for handler:index.initialize 2023-09-06 11:18:102023-09-06 11:18:10 1-64f7ef72-64caf1ff0046194d9a26bbd7 [verbose] initializer 2023-09-06 11:18:10FC Initialize End RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7 2023-09-06 11:18:10FC Invoke Start RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7 2023-09-06 11:18:10load code for handler:index.handler 2023-09-06 11:18:10FC Invoke End RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
各関数インスタンスは一定期間キャッシュされ、すぐには破棄されません。PreStopフックのログをすぐに表示することはできません。 PreStopフックをすばやくトリガーするには、関数設定または関数コードを更新します。 更新が完了すると、関数ログでPreStopフックのログを表示できます。 次のサンプルコードは例を示しています。
2023-09-06 11:08:10FC PreStop Start RequestId: 944bca62-b209-47a1-9e48-2723647bce0a 2023-09-06 11:08:10load code for handler:index.preStop 2023-09-06 11:08:102023-09-06 11:08:10 944bca62-b209-47a1-9e48-2723647bce0a [verbose] preStop 2023-09-06 11:08:10FC PreStop End RequestId: 944bca62-b209-47a1-9e48-2723647bce0a
サンプルプログラム
Function Computeは、InitializerフックとPreStopフックを使用するMySQLデータベースのサンプルプログラムを提供します。 この例では、Initializerフックを使用して、環境変数からMySQLデータベース構成を取得し、MySQLデータベース接続を作成し、接続をテストします。 PreStopフックは、MySQL接続を終了するために使用されます。
詳細については、「nodejs14-mysql」をご参照ください。
より多くの情報
関数インスタンスのライフサイクルフックの詳細については、「インスタンスライフサイクルの設定」をご参照ください。