このトピックでは、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 Computeはindex.py
ファイルで定義されたinitialize
メソッドを読み込みます。
メソッド署名
入力パラメーターは
context
のみで、呼び出し中にFC関数に実行中のコンテキストを提供します。値は返されません。
PreStopフック
関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックのメソッド署名は、Initializerフックのメソッド署名と同じです。
次のサンプルコードは、単純なPreStopフックの例を示しています。
def preStop(context):
print("preStop invoked")
ライフサイクルフックの設定
Function Computeコンソールの使用
Function Computeコンソールで、関数のInitializer HookパラメーターとPreStop Hookパラメーターを設定できます。 詳細は、「インスタンスのライフサイクルの設定」をご参照ください。
フックの形式は [ファイル名. メソッド名]
です。 たとえば、Initializer Hookをindex.initialize
に設定した場合、index.py
ファイルのinitialize
メソッドが読み込まれます。
Serverless Devsを使用する
Serverless Devsを使用する場合は、s.yaml
ファイルにInitializerフックとPreStopフックを追加する必要があります。
初期化フック
handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.initializerをfunctionに追加します。
PreStopフック
instanceLifecycleConfig.preStopをfunctionに追加します。これには、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
インスタンスライフサイクルフックのログを表示する
ライフサイクルフックのログは、[ログ] で表示できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、テスト機能タブをクリックします。テスト機能を選択し、 を選択します。
[ログ] タブでは、関数呼び出しログと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」をご参照ください。