このトピックでは、Python でインスタンスライフサイクルフックメソッドを実装して使用する方法について説明します。
背景情報
インスタンスライフサイクルフックを実装および構成すると、対応するライフサイクルイベントが発生したときに、Function Compute がフックを呼び出します。インスタンスライフサイクルには、Initializer フックと PreStop フックが含まれます。詳細については、「インスタンスライフサイクルの構成」をご参照ください。
インスタンスライフサイクルフックの課金ルールは、標準の関数呼び出しと同じです。ただし、実行ログは [リアルタイムログ]、[関数ログ]、または [高度なログ] でのみ表示できます。ライフサイクルフックのログは、[呼び出しリクエストリスト] には表示されません。詳細については、「インスタンスライフサイクルフックのログを表示する」をご参照ください。
Initializer フック
Initializer フックは、関数インスタンスが開始された後、ハンドラが実行される前に実行されます。Function Compute は、Initializer フックがインスタンスライフサイクルごとに 1 回だけ正常に実行されることを保証します。最初の実行で Initializer フックが失敗した場合、関数呼び出しはエラーを返します。次回関数を呼び出すと、新しいインスタンスが作成され、Initializer フックが再度実行されます。
Initializer フックがタイムアウトまたは失敗した場合、サーバーは HTTP 200 ステータスコードを返します。初期化の失敗を確認するには、X-Fc-Error-Type:InitializationError 応答ヘッダーまたは応答本文の errorMessage フィールドを調べます。
Initializer フックには入力パラメーターが 1 つだけあり、context と呼ばれます。これは ハンドラ と同じ方法で使用されます。
次のコードは、単純な Initializer メソッドを示しています。
def initialize(context):
print("initialize invoked")initialize は Initializer フックメソッドの名前です。これは、Function Compute コンソールで構成する Initializer フックと一致する必要があります。たとえば、関数の Initializer フックを index.initialize に設定した場合、Function Compute は index.py ファイルの initialize メソッドをロードします。
メソッドシグネチャ
唯一の入力パラメーターは
contextです。このパラメーターは、FC 関数の呼び出しにランタイムコンテキストを提供します。値は返されません。
PreStop フック
PreStop フックは、関数インスタンスが破棄される前に実行されます。メソッドシグネチャは Initializer フックと同じです。
次のコードは、単純な PreStop メソッドを示しています。
def preStop(context):
print("preStop invoked")ライフサイクルフックの構成
コンソールでのフックの構成
Function Compute コンソールにログインして、関数の [Initializer フック] と [PreStop フック] を構成します。詳細については、「インスタンスライフサイクルの構成」をご参照ください。
フックのフォーマットは [ファイル名.メソッド名] です。たとえば、[Initializer フック] を index.initialize に設定すると、index.py ファイルの initialize メソッドが使用されます。
Serverless Devs を使用したフックの構成
Serverless Devs を使用する場合、Initializer および PreStop フックの構成を s.yaml ファイルに追加できます。
Initializer フックの構成
function 構成の下に、instanceLifecycleConfig.initializer フィールドを追加します。このフィールドには、handler および timeout フィールドが含まれます。
PreStop フックの構成
function 構成の下に、instanceLifecycleConfig.preStop フィールドを追加します。このフィールドには、handler および timeout フィールドが含まれます。
次のコードに例を示します。
edition: 3.0.0
name: fcDeployApp
access: "default"
vars: # グローバル変数
region: "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 構成仕様の詳細については、「一般的な Serverless Devs コマンド」をご参照ください。
インスタンスライフサイクルフックのログを表示する
ライフサイクルフックのログは [ログ] で表示できます。
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-193c8b213031
サンプルプログラム
Function Compute は、Initializer フックと PreStop フックを使用するサンプル MySQL プログラムを提供します。この例では、Initializer フックが環境変数から MySQL データベースの構成を取得し、MySQL 接続を作成して、接続性をテストします。PreStop フックは MySQL 接続を閉じます。
詳細については、「python3-mysql」をご参照ください。