このトピックでは、Pythonランタイム環境で関数インスタンスのライフサイクルフックを実装する方法について説明します。
背景情報
ファンクションインスタンスのライフサイクルフックを設定した後、インスタンスの関連ライフサイクルイベントが発生すると、function Computeがフックを呼び出します。 関数インスタンスに設定できるライフサイクルフックは、Initializer、PreFreeze、PreStopです。 詳細については、「関数インスタンスのライフサイクルフック」をご参照ください。
関数インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出し要求の課金ルールと同じです。 ただし、実行ログは、関数ログ、インスタンスログ、または高度なログでのみ照会できます。 ライフサイクルフックのログは通話要求リストに表示されません。 詳細については、「インスタンスライフサイクルフックのログを表示します。」をご参照ください。
Python 2.7以前のバージョンは、PreFreezeフックをサポートしていません。
初期化フック
初期化フックは、関数インスタンスが開始された後、ハンドラが実行される前に呼び出されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に呼び出されるようにします。 Initializerフックの実行に失敗した場合、関数の呼び出しに対してエラーが返されます。 次回関数を呼び出すと、システムは別の関数インスタンスを作成してInitializerフックを実行します。
Initializerフックはコンテキスト入力パラメーターで構成され、ハンドラーと同じ方法で呼び出すことができます。
次のサンプルコードは、単純なInitializerメソッドを定義する方法の例を示しています。
def initialize(context):
print("initialize invoked")
Initializer
は、Initializerフックのメソッド名です。 名前は、Function Computeコンソールで設定したInitializer Hookパラメーターの値と同じである必要があります。 たとえば、関数のInitializer Hookパラメーターの値がindex.initialize
の場合、Initializerフックの設定後、function Computeはindex.py
で定義されているinitialize
メソッドを読み込みます。
メソッド署名
入力パラメーター
context
は、Function Compute関数が呼び出されたときに提供されるランタイムコンテキストを指定します。値は返されません。
PreFreezeフック
関数インスタンスが凍結される前に、PreFreezeフックが実行されます。 PreFreezeフックのメソッド署名は、Initializerフックのメソッド署名と同じです。
次のサンプルコードは、単純なPreFreezeフックの例を示しています。
def preFreeze(context):
print("preFreeze invoked")
PreStopフック
関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックのメソッド署名は、Initializerフックのメソッド署名と同じです。
次のサンプルコードは、単純なPreStopフックの例を示しています。
def preStop(context):
print("preStop invoked")
ライフサイクルフックの設定
Function Computeコンソールの使用
[Initializer Hook] 、[PreFreeze Hook] 、および [PreStop Hook] パラメーターは、Function Computeコンソールの関数設定ページで設定できます。 詳細は、「Functionインスタンスのライフサイクル」をご参照ください。
フックの形式は [ファイル名. メソッド名]
です。 たとえば、Initializer Hookをindex.initialize
に設定した場合、index.py
ファイルのinitialize
メソッドが使用されます。
Serverless Devsを使用する
Serverless Devsを使用してライフサイクルフックを設定する場合は、InitializerフックとPreStopフックの設定をs.yaml
ファイルに追加する必要があります。
初期化フックの設定
initializerフィールドとinitializationTimeoutフィールドを関数設定に追加します。
PreStopフックの設定
handlerとtimeoutを含む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 location of the code.
handler: 'index.handler' # The handler of the function. The format varies based on the language.
memorySize: 128 # The memory size for the function.
runtime: python3 # 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.my_initializer # The Initializer method.
instanceLifecycleConfig: # The extension function.
preStop: # The PreStop hook.
handler: index.preStop # The function handler.
timeout: 60 # The timeout period.
Serverless DevsのYAML構文の詳細については、「Serverless Devsコマンド」をご参照ください。
インスタンスライフサイクルフックのログを表示します。
ライフサイクルフックのログは、[関数ログ] で表示できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
[関数] ページで、目的の関数の名前をクリックします。 表示される [関数の詳細] ページで、[関数のテスト] タブをクリックします。
[テスト関数] タブで、[テスト関数] をクリックします。 を選択します。
[関数ログ] タブでは、呼び出しログ、および関数の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接続を閉じるために使用されます。
詳細については、「python3-mysql」をご参照ください。