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

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

最終更新日:Aug 28, 2024

関数インスタンスのライフサイクルフックを実装および設定した後、対応するイベントが発生すると、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 Computeindex.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メソッドを示します。

db-node.js-lifecycle

Serverless Devsを使用したライフサイクルフックの設定

Serverless Devsを使用してライフサイクルフックを設定する場合は、InitializerフックまたはPreStopフックs.yamlファイルに追加する必要があります。

  • 初期化フックの設定

    handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.initializerpropsに追加します。

  • PreStopフックの設定

    handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.preStoppropsに追加します。

サンプルコード:

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の一般的なコマンド」をご参照ください。

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

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

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

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、テスト機能タブをクリックします。テスト機能を選択し、ログ > 関数ログ.

    [ログ] タブでは、関数呼び出しログと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」をご参照ください。

より多くの情報

関数インスタンスのライフサイクルフックの詳細については、「インスタンスライフサイクルの設定」をご参照ください。