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

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

最終更新日:Jul 19, 2024

このトピックでは、Pythonランタイムで関数インスタンスのライフサイクルフックを実装する方法について説明します。

背景

関数インスタンスのライフサイクルフックを実装および設定した後、対応するインスタンスのライフサイクルイベントが発生すると、Function Computeがフックを呼び出します。 Pythonランタイム用に構成できるライフサイクルフックは、InitializerフックとPreStopフックです。 詳細は、「」をご参照ください。

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

初期化フック

初期化フックは、関数インスタンスが開始された後、ハンドラが実行される前に呼び出されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に呼び出されるようにします。 Initializerフックの実行に失敗した場合、関数の呼び出しに対してエラーが返されます。 次回関数を呼び出すと、システムは別の関数インスタンスを作成してInitializerフックを実行します。

Initializerフックにはコンテキスト入力パラメーターのみが含まれており、ハンドラーと同じ方法で呼び出すことができます。

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

def initialize(context):
    print("initialize invoked")

上記のサンプルコードでは、InitializerはInitializerフックの名前です。 名前は、Function Computeコンソールで設定したInitializerフックと同じである必要があります。 たとえば、関数に対してInitializer Hookをindex.initializeに設定した場合、Initializerプロパティが設定された後、Function Computeindex.pyファイルで定義されたinitializeメソッドを読み込みます。

メソッド署名

  • 入力パラメーターはcontextのみで、呼び出し中にFC関数に実行中のコンテキストを提供します。

  • 値は返されません。

PreStopフック

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

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

def preStop(context):
    print("preStop invoked")

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

Function Computeコンソールの使用

Function Computeコンソールで、関数のInitializer HookパラメーターとPreStop Hookパラメーターを設定できます。 詳細は、「インスタンスのライフサイクルの設定」をご参照ください。

フックの形式は [ファイル名. メソッド名] です。 たとえば、Initializer Hookindex.initializeに設定した場合、index.pyファイルのinitializeメソッドが読み込まれます。

shengmingzhouqi

Serverless Devsを使用する

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

  • 初期化フック

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

  • PreStopフック

    instanceLifecycleConfig.preStopfunctionに追加します。これには、handlerフィールドとtimeoutフィールドが含まれます。

サンプルコード:

edition: 3.0.0
name: fcDeployApp
access: "default"

vars: # グローバル変数
  リージョン: 「cn-hangzhou」

resources:
  hello_world:
    component: fc3 # コンポーネントの名前
     props:
      region: ${vars.region}  # 変数の使用方法については、https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC. をご覧ください。
      functionName: "emojipy"
      description: 'this is emoji'
      runtime: "python3"
      code: ./
      handler: index.handler
      memorySize: 128
      timeout: 30
      environmentVariables:
        PYTHONPATH: /code:/code/python:/opt/python
initializationTimeout: 20  # 初期化メソッドの実行のタイムアウト期間。
# initializer: index.my_initializer# 初期化メソッド
      instanceLifecycleConfig: # 拡張関数
        preStop: # PreStopフック
          handler: index.preStop # ハンドラー
          timeout: 60 # タイムアウト期間
        initializer: # Initializerフック
          handler: index.initialize
          timeout: 60

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

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

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

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

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

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

    [ログ] タブでは、関数呼び出しログとInitializerログを表示できます。 例:

    2024-03-04 17:57:28FC Initialize Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
    2024-03-04 17:57:282024-03-04 09:57:28.192 1-65e59b07-1520da26-bf73bbb91b69 [info] initializer
    2024-03-04 17:57:28FC Initialize End RequestId: 1-65e59b07-1520da26-bf73bbb91b69
    2024-03-04 17:57:28FC Invoke Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
    2024-03-04 17:57:28FC Invoke End RequestId: 1-65e59b07-1520da26-bf73bbb91b69 

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

    2024-03-04 18:33:26FC PreStop Start RequestId: 93c93603-9fbe-4576-9458-193c8b213031
    2024-03-04 18:33:262024-03-04 10:33:26.077 93c93603-9fbe-4576-9458-193c8b213031 [info] preStop
    2024-03-04 18:33:26FC PreStop End RequestId: 93c93603-9fbe-4576-9458-193c8b21303 1 

サンプルプログラム

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

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