このトピックでは、C# ランタイムでインスタンスのライフサイクルフックを実装する方法について説明します。
背景情報
インスタンスのライフサイクルフックを実装および構成すると、対応するインスタンスのライフサイクルイベントが発生したときに Function Compute がフックを呼び出します。C# ランタイムは Initializer フックと PreStop フックをサポートしています。詳細については、「インスタンスライフサイクルの構成」をご参照ください。
インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出しリクエストの課金ルールと同じです。ただし、実行ログは [リアルタイムログ]、[関数ログ]、または [高度なログ] でのみクエリできます。フックのログは [呼び出しリクエスト一覧] には表示されません。詳細については、「インスタンスライフサイクルフックのログの表示」をご参照ください。
フックメソッドのシグネチャ
Initializer フック
Initializer フックは、関数インスタンスが開始された後、ハンドラが実行される前に実行されます。Function Compute は、インスタンスのライフサイクルにおいて Initializer フックが一度だけ正常に実行されることを保証します。Initializer フックの実行に失敗した場合、関数呼び出しに対してエラーが返されます。次回関数を呼び出すと、システムは別の関数インスタンスを作成して Initializer フックを実行します。
説明Initializer フックがタイムアウトまたは失敗した場合、サーバーは常に HTTP 200 状態コードを返します。エラーが初期化の失敗によって引き起こされたかどうかを判断するには、
X-Fc-Error-Type:InitializationErrorレスポンスヘッダーまたはレスポンス本文の errorMessage フィールドを確認する必要があります。PreStop フック
PreStop フックは、関数インスタンスが破棄される前に実行されます。
C# の Initializer フックと PreStop フックのメソッドシグネチャは同じです。これらには Context 入力パラメーターのみが含まれ、レスポンスパラメーターは返されません。次のコードスニペットに例を示します。
public void FunctionName(IFcContext context);フックを静的メソッドとして定義することもできます。次のコードスニペットに例を示します。
public static void FunctionName(IFcContext context);例: ストリームイベントハンドラ
次のサンプルコードは、Initializer フックと PreStop フックを含む単純なプログラムを示しています。
using System;
using System.IO;
using System.Threading.Tasks;
using Aliyun.Serverless.Core;
using Microsoft.Extensions.Logging;
namespace Example
{
public class Hello
{
public void Initialize(IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("Initialize start");
logger.LogInformation("Handle initializer: {0}", context.RequestId);
logger.LogInformation("Initialize end");
}
public void PreStop(IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("PreStop start");
logger.LogInformation("Handle PreStop: {0}", context.RequestId);
logger.LogInformation("PreStop end");
}
public async Task<Stream> StreamHandler(Stream input, IFcContext context)
{
IFcLogger logger = context.Logger;
logger.LogInformation("Handle request: {0}", context.RequestId);
MemoryStream copy = new MemoryStream();
await input.CopyToAsync(copy);
copy.Seek(0, SeekOrigin.Begin);
return copy;
}
static void Main(string[] args){}
}
}ライフサイクルフックの構成
Function Compute コンソールの使用
Function Compute コンソールで、関数の詳細ページに移動し、 を選択してライフサイクルフックを設定します。詳細については、「インスタンスライフサイクルの構成」をご参照ください。フックのフォーマットはハンドラのフォーマットと同じで、アセンブリ名::名前空間.クラス名::メソッド名 です。詳細については、「ハンドラ」をご参照ください。
例:
Initializer フック:
HelloFcApp::Example.Hello::InitializePreStop フック:
HelloFcApp::Example.Hello::PreStop
Serverless Devs の使用
Serverless Devs を使用する場合、Initializer フックと PreStop フックを s.yaml 構成ファイルに追加します。
Initializer フックの構成
関数構成に、instanceLifecycleConfig.initializer フィールドを追加します。このフィールドには、ハンドラフィールドとタイムアウトフィールドが含まれます。
PreStop フックの構成
関数の構成において、instanceLifecycleConfig.preStop フィールドを追加します。このフィールドには、ハンドラ フィールドとタイムアウト フィールドが含まれます。
次のコードに例を示します。
# ------------------------------------
# 公式マニュアル: https://manual.serverless-devs.com/user-guide/aliyun/#fc3
# ヒント: https://manual.serverless-devs.com/user-guide/tips/
# ご不明な点がございましたら、DingTalk グループ 33947367 に参加して技術サポートを受けてください。
# ------------------------------------
edition: 3.0.0
name: hello-world-app
access: "default"
vars: # グローバル変数
region: "cn-hangzhou"
resources:
hello_world:
component: fc3
actions:
pre-${regex('deploy|local')}:
- run: dotnet publish -c Release -o ./target
path: ./HelloWorldApp
props:
region: ${vars.region}
functionName: "start-dotnetcore-p6jp"
description: 'hello world by serverless devs'
runtime: "dotnetcore3.1"
code: ./HelloWorldApp/target/
handler: HelloWorldApp::Example.Hello::StreamHandler
memorySize: 128
timeout: 10
instanceLifecycleConfig: # 拡張機能
initializer: # Initializer フック
handler: HelloFcApp::Example.Hello::Initialize
timeout: 60
preStop: # PreStop フック
handler: HelloFcApp::Example.Hello::PreStop # ハンドラ
timeout: 60 # タイムアウト期間
# triggers:
# - triggerName: httpTrigger # トリガー名
# triggerType: http # トリガータイプ
# description: 'xxxx'
# qualifier: LATEST # 関数バージョン
# triggerConfig:
# authType: anonymous # 認証タイプ。有効な値: anonymous および function。
# disableURLInternet: false # インターネット経由での URL へのアクセスを無効にするかどうかを指定します。
# methods: # HTTP トリガーでサポートされるアクセス メソッド。有効な値: GET、POST、PUT、DELETE、HEAD。
# - GET
# - POSTServerless 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