このトピックでは、Go でインスタンスライフサイクルフックを実装する方法について説明します。
背景情報
インスタンスライフサイクルフックを実装および設定すると、Function Compute は、ライフサイクルイベントが発生したときに、対応するフックを呼び出します。インスタンスライフサイクルには、Initializer フックと PreStop フックが含まれます。詳細については、「インスタンスライフサイクルの設定」をご参照ください。
インスタンスライフサイクルフックの課金ルールは、通常の関数呼び出しの課金ルールと同じです。ただし、実行ログは [リアルタイムログ]、[関数ログ]、または [高度なログ] でのみ表示できます。フックログは [呼び出しリクエストリスト] には表示されません。詳細については、「インスタンスライフサイクルフックのログを表示する」をご参照ください。
PreStop フックを使用するには、fc-runtime-go-sdk を v0.1.0 以降にアップグレードする必要があります。
コールバックメソッドのシグネチャ
Initializer フックは、関数インスタンスの起動後、ハンドラの実行前に実行されます。Function Compute は、インスタンスのライフサイクル内で Initializer フックが 1 回だけ正常に実行されることを保証します。初回実行時に Initializer フックが失敗した場合、関数の呼び出しは直ちに失敗します。次回に関数が呼び出されると、新しい関数インスタンスが作成され、Initializer フックが実行されます。
説明Initializer フックがタイムアウトまたは失敗した場合、サーバーは HTTP 200 ステータスコードを返します。失敗が初期化エラーによるものかどうかを判断するには、
X-Fc-Error-Type:InitializationErrorレスポンスヘッダーまたはレスポンス本文の errorMessage フィールドを確認します。PreStop フックは、関数インスタンスが破棄される前に実行されます。
Initializer フックと PreStop フックは、同じメソッドシグネチャを共有します。どちらも Context 入力パラメーターを受け入れ、戻り値はありません。定義は次のとおりです。
function(ctx context.Context)コールバックメソッドの実装
コードにライフサイクルコールバックメソッドを実装し、対応する関数を使用して登録できます。登録メソッドは次のとおりです。
// Initializer フックを登録します。
fc.RegisterInitializerFunction(initialize)
// PreStop フックを登録します。
fc.RegisterPreStopFunction(preStop)次のコードに例を示します。
package main
import (
"context"
"log"
"github.com/aliyun/fc-runtime-go-sdk/fc"
"github.com/aliyun/fc-runtime-go-sdk/fccontext"
)
func HandleRequest(ctx context.Context) (string, error) {
return "hello world!", nil
}
func preStop(ctx context.Context) {
log.Print("this is preStop handler")
fctx, _ := fccontext.FromContext(ctx)
fctx.GetLogger().Infof("context: %#v\n", fctx)
}
func initialize(ctx context.Context) {
log.Print("this is initialize handler")
fctx, _ := fccontext.FromContext(ctx)
fctx.GetLogger().Infof("context: %#v\n", fctx)
}
func main() {
fc.RegisterInitializerFunction(initialize)
fc.RegisterPreStopFunction(preStop)
fc.Start(HandleRequest)
} 次のリストでサンプルコードについて説明します。
func initialize(ctx context.Context): Initializer フックです。ctx context.Contextパラメーターは、関数実行のコンテキスト情報を提供します。詳細については、「Context」をご参照ください。func preStop(ctx context.Context): PreStop フックです。ctx context.Contextパラメーターは、関数実行のコンテキスト情報を提供します。詳細については、「Context」をご参照ください。func main(): FC 関数コードを実行するためのエントリポイントです。Go プログラムには
main関数を含める必要があります。ハンドラの実行メソッドを設定するには、fc.Start(HandleRequest)コードを追加します。Initializer フックを登録するには、fc.RegisterInitializerFunction(initialize)コードを追加します。同様の方法で PreStop フックを登録できます。重要fc.Start(HandleRequest)またはfc.StartHttp(HandleRequest)を実行する前に、ライフサイクルコールバックメソッドを登録する必要があります。そうしないと、登録は失敗します。
ライフサイクルフックの設定
[コンソールでの設定]
Function Compute コンソールで、FC 関数の詳細ページに移動します。 セクションで、[Initializer フック] と [PreStop フック] を有効にします。詳細については、「インスタンスライフサイクルの設定」をご参照ください。
[Serverless Devs を使用した設定]
Serverless Devs を使用する場合は、[Initializer フック] と [PreStop フック] の設定を s.yaml ファイルに追加します。
Initializer フックの設定
関数設定に function、initializer、および initializationTimeout フィールドを追加します。
PreStop フックの設定
関数設定に function および instanceLifecycleConfig.preStop フィールドを追加します。preStop フィールドには、handler および timeout フィールドが含まれます。
handler フィールドには空でない文字列値を指定する必要があります。たとえば、s.yaml ファイルで値を true に設定する場合は、二重引用符で囲む必要があります: `"true"`。
次のコードに設定例を示します。
edition: 3.0.0
name: hello-world # プロジェクト名
access: default # キーエイリアス
vars: # グローバル変数
region: cn-hangzhou # リージョン
resources:
hello_world: # サービス/モジュール名
component: fc3 # コンポーネント名
props: # コンポーネントのプロパティ
region: ${vars.region} # リージョン
functionName: "golang-lifecycle-hook-demo"
description: 'this is golang lifecycle'
runtime: "go1"
code: ./
handler: main
memorySize: 128
timeout: 60
instanceLifecycleConfig: # 拡張機能
preStop: # PreStop 関数
handler: preStop # 関数ハンドラ
timeout: 60 # タイムアウト
initializer:
handler: 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 フックのサンプルプログラムを提供します。このサンプルは、Go ランタイムで Initializer フックを使用して MySQL 接続プールを初期化する方法を示しています。このサンプルでは、s.yaml ファイルで定義されているように、MySQL データベースの設定が関数の環境変数に保存されます。Initializer フックは、環境変数からデータベース設定を取得し、MySQL 接続プールを作成して、接続性をテストします。
詳細については、「go-initializer-mysql」をご参照ください。