このトピックでは、Goランタイムで関数インスタンスのライフサイクルフックを実装する方法について説明します。
背景
関数インスタンスのライフサイクルフックを設定すると、対応するライフサイクルイベントが発生するとFunction Computeがフックを呼び出します。 初期化フックとPreStopフックは、Go関数のライフサイクルに含まれます。 詳細は、「インスタンスライフサイクルの設定」をご参照ください。
関数インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出し要求の課金ルールと同じです。 ただし、実行ログは、関数ログ、リアルタイムログ、および高度なログでのみ照会できます。 ライフサイクルフックのログは、呼び出し要求リストに表示されません。 詳細については、「インスタンスライフサイクルフックのログの表示」をご参照ください。
PreStopフックを使用するには、fc-runtime-go-sdkのバージョンをV0.1.0以降に更新します。
メソッド署名
初期化フックは、関数インスタンスが開始された後、ハンドラが実行される前に呼び出されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に呼び出されるようにします。 Initializerフックの呼び出しに失敗した場合、ハンドラーが実行される前にInitializerフックが正常に呼び出されるまで、システムはInitializerフックを再試行します。 Initializerフックを繰り返し再試行できるようにするには、Initializerフックを適切に設定します。
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
パラメーターは、フックが呼び出されるときに使用されるコンテキスト情報を指定します。 詳細は、「コンテキスト」をご参照ください。func preStop(ctx context.Context)
: PreStopフック。ctx context.Context
パラメーターは、フックが呼び出されるときに使用されるコンテキスト情報を指定します。 詳細は、「コンテキスト」をご参照ください。func main(): FCで実行中の関数コードのエントリポイント。 Goプログラムには
main
メソッドが含まれている必要があります。fc.Start(HandleRequest)
をコードに追加してハンドラーの実行に使用するメソッドを指定し、fc.RegisterInitializerFunction(initialize)
を追加してInitializerフックを登録します。 次に、PreStopフックを同様の方法で登録します。重要ライフサイクルフックは、
fc.Start(HandleRequest)
またはfc.StartHttp(HandleRequest)
を実行する前に登録する必要があります。 それ以外の場合、登録は失敗します。
ライフサイクルフックの設定
Function Computeコンソールの使用
function Computeコンソールで関数のInitializerフックとPreStopフックを設定できます。 例:
詳細は、「インスタンスライフサイクルの設定」をご参照ください。
Serverless Devsの使用
Serverless Devsを使用してライフサイクルフックを設定する場合は、InitializerフックとPreStopフックの設定をs.yaml
ファイルに追加する必要があります。
初期化フックの設定
initializerフィールドとinitializationTimeoutフィールドを関数設定に追加します。
PreStopフックの設定
handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.preStopをfunctionに追加します。
handlerフィールドは、空でない文字列として構成する必要があります。 s.yaml
ファイルでデフォルト値 "true"
を使用する場合は、二重引用符で囲む必要があります。
サンプルコード:
edition: 3.0.0
name: hello-world # The name of the project.
access: default # The alias of the key.
vars: # The global variables.
region: cn-hangzhou # The region.
resources:
helloworld: # The name of the service or module.
component: fc3 # The name of the component.
props: # The properties of the component.
region: ${vars.region} # The region.
functionName: "golang-lifecycle-hook-demo"
description: 'this is golang lifecycle'
runtime: "go1"
code: ./
handler: main
memorySize: 128
timeout: 60
instanceLifecycleConfig: # The extension function.
preStop: # The PreStop hook.
handler: preStop # The function handler.
timeout: 60 # The timeout period.
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-193c8b21303 1
サンプルプログラム
Function Computeは、Initializerフックを呼び出すためのサンプルプログラムを提供します。 サンプルプログラムでは、GoランタイムでInitializerフックを使用してMySQL接続プールを初期化する方法の例を示します。 サンプルプログラムでは、関数の環境変数を使用してMySQLデータベースを構成します。 詳細については、s.yamlファイルをご参照ください。 Initializerフックは、環境変数からMySQLデータベースの構成を取得し、MySQL接続プールを作成してから接続をテストするために使用されます。
詳細については、go-initializer-mysqlをご参照ください。