インスタンスのライフサイクルフックを実装して設定すると、関連するインスタンスのライフサイクルイベントが発生したときに Function Compute が対応するフックを呼び出します。Node.js ランタイムは現在、Initializer と PreStop インスタンスのライフサイクルフックをサポートしています。
使用上の注意
インスタンスのライフサイクルフックは、標準の呼び出しリクエストと同じ方法で課金されます。ただし、その実行ログは [リアルタイムログ、関数ログ] または [高度なログ] でのみ表示できます。フックのログは [呼び出しリクエストリスト] には表示されません。詳細については、「インスタンスのライフサイクルフックのログを表示する」をご参照ください。
Initializer フック
Initializer フックは、関数インスタンスが開始された後、リクエストハンドラが実行される前に実行されます。Function Compute は、インスタンスのライフサイクル中に Initializer フックが 1 回だけ正常に実行されることを保証します。Initializer フックが最初の実行で失敗した場合、関数の呼び出しも失敗します。次の呼び出しでは、新しい関数インスタンスが作成され、initializer フックが実行されます。
Initializer フックがタイムアウトまたは失敗した場合、サーバーは HTTP 200 ステータスコードを返します。エラーが初期化の失敗によって引き起こされたかどうかを判断するには、X-Fc-Error-Type:InitializationError 応答ヘッダーまたは応答本文の `errorMessage` フィールドを確認する必要があります。
Initializer フックには、context 入力パラメーターが 1 つだけあります。次のサンプルコードは、単純な Initializer フックを示しています。
ES モジュール
この例は、Node.js 18 以降のランタイムのみをサポートします。
export const initialize = async (context) => {
console.log('initializer');
return "";
}
CommonJS モジュール
exports.initialize = function(context, callback) {
console.log('initializer');
callback(null, "");
}; initialize は、Initializer フックの名前です。この名前は、Function Compute コンソールで [Initializer Hook] に設定する値と一致させる必要があります。例えば、関数の [Initializer Hook] を index.initialize に設定した場合、Function Compute は index.js ファイルから initialize メソッドをロードします。
メソッドのシグネチャ
唯一の入力パラメーターは
contextで、これは呼び出し中に FC 関数にランタイムコンテキストを提供します。フックは値を返しません。関数の実行を終了するには、コードで `return` または `callback` を呼び出す必要があります。
PreStop フック
PreStop フックは、関数インスタンスが破棄される前に実行されます。メソッドのシグネチャは Initializer フックと同じです。
次のサンプルコードは、単純な PreStop フックの例を示しています。
ES モジュール
この例は、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 コンソールで、FC 関数の タブに移動して、[Initializer Hook] と [PreStop Hook] を設定します。詳細については、「インスタンスのライフサイクルを設定する」をご参照ください。フックのフォーマットは [ファイル名.メソッド名] です。例:
[Initializer Hook] を
index.initializeに設定します。これはindex.jsファイルのinitializeメソッドを指定します。[PreStop Hook] を
index.preStopに設定します。これはindex.jsファイルのpreStopメソッドを指定します。
Serverless Devs ツールを使用した設定
Serverless Devs ツールを使用する場合、[Initializer Hook] と [PreStop Hook] を s.yaml 設定ファイルに追加できます。
Initializer フックの設定
props 設定の下に instanceLifecycleConfig.initializer フィールドを追加します。このフィールドには handler と timeout フィールドが含まれます。
PreStop フックの設定
props 設定の下に instanceLifecycleConfig.preStop フィールドを追加します。このフィールドには handler と timeout フィールドが含まれます。
以下は設定例です。
edition: 3.0.0
name: hello-world-app
access: default # キーのエイリアス。
resources:
hello_world:
component: fc3 # コンポーネントの名前。Serverless Devs 自体はゲーム機のようなもので、特定のビジネス機能はありません。コンポーネントはゲームカートリッジのようなものです。コンソールにさまざまなカートリッジを挿入して、さまざまな機能を利用します。同様に、さまざまなコンポーネントを使用して、さまざまなビジネス機能を実装します。
# actions: # カスタム実行ロジック。アクションの詳細については、https://docs.serverless-devs.com/serverless-devs/yaml#%E8%A1%8C%E4%B8%BA%E6%8F%8F%E8%BF%B0actions をご参照ください。
props:
region: cn-hangzhou # 変数の使用方法の詳細については、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: "serverless devs による Node.js ライフサイクルフック"
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: autoServerless 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」をご参照ください。
参考
インスタンスのライフサイクルフックの詳細については、「インスタンスのライフサイクルを設定する」をご参照ください。