すべてのプロダクト
Search
ドキュメントセンター

Function Compute:関数インスタンスのライフサイクルフックメソッド

最終更新日:Nov 09, 2025

このトピックでは、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::Initialize

  • PreStop フック: 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
      #         - POST

Serverless Devs の YAML 構文の詳細については、「Serverless Devs の共通コマンド」をご参照ください。

インスタンスライフサイクルフックのログの表示

ライフサイクルフックのログは [ログ] で表示できます。

  1. Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[関数管理] > [関数] を選択します。

  2. 上部のナビゲーションバーでリージョンを選択します。[関数] ページで、ターゲット関数をクリックします。

  3. 関数の詳細ページで、[関数のテスト] タブをクリックし、[関数のテスト] をクリックしてから、[ログ] > [関数ログ] を選択します。

    [ログ] タブで、関数の呼び出しログと 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