すべてのプロダクト
Search
ドキュメントセンター

Function Compute:関数インスタンスのライフサイクルフック

最終更新日:Aug 30, 2024

このトピックでは、Node.jsランタイム環境で関数インスタンスのライフサイクルフックを設定する方法について説明します。

背景情報

ファンクションインスタンスのライフサイクルフックを設定した後、インスタンスの関連ライフサイクルイベントが発生すると、function Computeがフックを呼び出します。 Node.jsランタイム環境には、Initializer、PreFreeze、PreStopのライフサイクルフックを設定できます。 詳細は、「Functionインスタンスのライフサイクル」をご参照ください。

関数インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出し要求の課金ルールと同じです。 ただし、実行ログは、関数ログインスタンスログ、および高度なログでのみ照会できます。 ライフサイクルフックのログは通話要求リストに表示されません。 詳細については、「インスタンスライフサイクルフックのログを表示します。」をご参照ください。

初期化フック

Initializerフックは、関数インスタンスが開始された後、ハンドラーが実行される前に実行されます。 Function Computeは、Initializerフックが関数インスタンスのライフサイクル内で最大1回正常に実行されるようにします。 たとえば、Initializerフックの実行に失敗した場合、システムはInitializerフックが正常に実行されるまでInitializerフックを再試行し、ハンドラーを実行します。

Initializerフックはコンテキスト入力パラメーターで構成され、ハンドラーと同じ方法で使用できます。

次のサンプルコードは、単純なInitializerフックの例を示しています。

exports.initialize = function(context, callback) {
  console.log('initializer');
  callback(null, "");
};

Initializerは、Initializerフックのメソッド名です。 名前は、Function Computeコンソールで設定したInitializer Hookパラメーターの値と同じである必要があります。 たとえば、関数のInitializer Hookパラメーターの値がindex.initializeの場合、function Computeは、Initializerフックの設定後にindex.jsで定義されているinitializeメソッドを読み込みます。

メソッド署名

  • 入力パラメーターcontextは、Function Compute関数が呼び出されたときに提供されるランタイムコンテキストを指定します。

  • 値は返されません。

PreFreezeフック

関数インスタンスが凍結される前に、PreFreezeフックが実行されます。 PreFreezeフックのメソッド署名は、Initializerフックのメソッド署名と同じです。

次のサンプルコードは、単純なPreFreezeフックの例を示しています。

module.exports.preFreeze = function(context, callback) {
  console.log('preFreeze');
  callback(null, "");
};

PreStopフック

関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックのメソッド署名は、Initializerフックのメソッド署名と同じです。

次のサンプルコードは、単純なPreStopフックの例を示しています。

module.exports.preStop = function(context, callback){
  console.log('preStop');
  callback(null, "");
}

ライフサイクルフックの設定

Function Computeコンソールの使用

[Initializer Hook][PreFreeze Hook] 、および [PreStop Hook] パラメーターは、Function Computeコンソールfunction Compute関数設定ページで設定できます。 詳細は、「Functionインスタンスのライフサイクル」をご参照ください。 フックの形式は [ファイル名. メソッド名] です。

  • Initializer Hookindex.initializeに設定した場合、index.jsファイルのinitializeメソッドが使用されます。

  • PreFreeze Hookindex.preFreezeに設定した場合、index.jsファイルのpreFreezeメソッドが使用されます。

  • PreStop Hookindex.preStopに設定した場合、index.jsファイルのpreStopメソッドが使用されます。

db-node.js-lifecycle

Serverless Devsを使用する

Serverless Devsを使用してライフサイクルフックを設定できます。 この場合、InitializerフックPreFreezeフック、およびPreStopフックs.yamlファイルに追加する必要があります。

  • 初期化フックの設定

    initializerフィールドとinitializationTimeoutフィールドをfunctionパラメーターに追加します。

  • PreFreezeフックの設定

    handlertimeoutを含むinstanceLifecycleConfig.preFreezeフィールドをfunctionパラメーターに追加します。

  • PreStopフックの設定

    handlertimeoutを含むinstanceLifecycleConfig.preStopフィールドをfunctionパラメーターに追加します。

サンプルコード:

edition: 1.0.0          #  The version of the YAML syntax. The version complies with the semantic versioning specifications.
name: hello-world       #  The name of the project.
access: default         #  The alias of the key.

services:
  fc-deploy-test: # The name of the module.
    component: devsapp/fc  # The name of the component.
    props:                 # The property value of the component.
      region: cn-hangzhou   # The ID of the region.
      service:             # The configurations of the service.
        name: fc-deploy-service    # The name of the service.
        description: dem component # A brief description of the service.
      function:                       # The configurations of the function.
        name: fc-base-service         # The name of the function.
        description: 'this is test'   # A brief description of the function.
        codeUri: './code'             # The directory where the code is located.
        handler: 'index.handler'      # The handler of the function. The format varies based on the programming language.
        memorySize: 128               # The memory size of the function.
        runtime: nodejs14             # The runtime environment.
        timeout: 60                   # The timeout period for the execution of the function.
        initializationTimeout: 20     # The timeout period for the execution of the Initializer method.
        initializer: index.initialize # The Initializer method.
        instanceLifecycleConfig:      # The extension function.
          preFreeze:              # The PreFreeze function.
            handler: index.preFreeze  # The handler.
            timeout: 60              # The timeout period.  
          preStop:                    # The PreStop function.
            handler: index.preStop    # The handler.
            timeout: 60               # The timeout period.

Serverless DevsのYAML構文の詳細については、「Serverless Devsコマンド」をご参照ください。

インスタンスライフサイクルフックのログを表示します。

ライフサイクルフックのログは、[関数ログ] で表示できます。

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。

  3. [関数] ページで、目的の関数の名前をクリックします。 表示される [関数の詳細] ページで、[関数のテスト] タブをクリックします。

  4. [テスト関数] タブで、[テスト関数] をクリックします。 [ログ] > [関数ログ] を選択します。

    [関数ログ] タブでは、呼び出しログ、および関数のInitializerフックとPreFreezeフックのログを表示できます。 例:

    2022-10-09 19:26:17 FunctionCompute dotnetcore3.1 runtime inited.
    2022-10-09 19:26:17 FC Initialize Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Initialize start
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle initializer: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Initialize end
    2022-10-09 19:26:17 FC Initialize End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 FC Invoke Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle request: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 FC Invoke End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 FC PreFreeze Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze start
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle PreFreeze: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze end
    2022-10-09 19:26:17 FC PreFreeze End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e******

    各関数インスタンスは一定期間キャッシュされ、すぐには破棄されません。PreStopフックのログをすぐに表示することはできません。 PreStopフックをすばやくトリガーするには、関数設定または関数コードを更新します。 更新が完了すると、関数ログでPreStopフックのログを表示できます。 例:

    2022-10-09 19:32:17 FC PreStop Start RequestId: 03be685c-378b-4736-8b08-a67c1d*****
    2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop start
    2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] Handle PreStop: 03be685c-378b-4736-8b08-a67c1d*****
    2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop end
    2022-10-09 19:32:17 FC PreStop End RequestId: 03be685c-378b-4736-8b08-a67c1d*****

サンプルプログラム

Function Computeは、InitializerフックとPreStopフックを使用するMySQLデータベースのサンプルプログラムを提供します。 この例では、Initializerフックを使用して、環境変数からMySQLデータベース設定を取得し、MySQLデータベース接続を作成し、接続をテストします。 PreStopフックは、MySQL接続を閉じるために使用されます。

詳細については、「nodejs14-mysql」をご参照ください。