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

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

最終更新日:Sep 02, 2024

このトピックでは、C# ランタイム環境で関数インスタンスのライフサイクルフックを実装する方法について説明します。

背景情報

ファンクションインスタンスのライフサイクルフックを設定した後、インスタンスの関連ライフサイクルイベントが発生すると、function Computeがフックを呼び出します。 関数インスタンスに設定できるライフサイクルフックは、Initializer、PreFreeze、PreStopです。 詳細は、「Functionインスタンスのライフサイクル」をご参照ください。

関数インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出し要求の課金ルールと同じです。 ただし、実行ログは、関数ログインスタンスログ、または高度なログでのみ照会できます。 ライフサイクルフックのログは通話要求リストに表示されません。 詳細については、「」をご参照ください。インスタンスライフサイクルフックのログを表示します。.

メソッド署名

  • 初期化フック

    Initializerフックは、関数インスタンスが開始された後、ハンドラーが実行される前に実行されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に実行されるようにします。 Initializerフックの実行に失敗した場合、関数の呼び出しに対してエラーが返されます。 次回関数を呼び出すと、システムは別の関数インスタンスを作成してInitializerフックを実行します。

  • PreFreezeフック

    関数インスタンスが凍結される前に、PreFreezeフックが実行されます。

  • PreStopフック

    関数インスタンスが破棄される前に、PreStopフックが実行されます。

Initializer、PreFreeze、およびPreStopフックのメソッドシグネチャは、C# ランタイム環境で同じです。 シグネチャは、コンテキスト入力パラメータのみを含み、応答パラメータは含まない。 サンプルコード:

public void FunctionName(IFcContext context);

フックメソッドを静的メソッドに設定することもできます。 サンプルコード:

public static void FunctionName(IFcContext context);

例: StreamRequestHandler

次のサンプルコードは、Initializer、PreFreeze、および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 void PreFreeze(IFcContext context)
        {
            IFcLogger logger = context.Logger;
            logger.LogInformation("PreFreeze start");
            logger.LogInformation("Handle PreFreeze: {0}", context.RequestId);
            logger.LogInformation("PreFreeze 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コンソールの [関数の詳細] ページでライフサイクルフックを設定できます。 詳細は、「Functionインスタンスのライフサイクル」をご参照ください。 フックメソッドの形式は、リクエストハンドラーの形式と同じです。 形式はアセンブリ名::Namespace. クラス名:: メソッド名です。 詳細については、「Handler」をご参照ください。

次の例は、さまざまな種類のフックの形式を示しています。

  • 初期化フック: HelloFcApp:: 例。Hello::Initialize

  • PreFreezeフック: HelloFcApp:: 例こんにちは::PreFreeze

  • PreStopフック: HelloFcApp:: 例こんにちは::PreStop

Serverless Devsを使用する

Serverless Devsを使用してライフサイクルフックを設定する場合は、Initializer、PreFreeze、およびPreStopフックをs.yamlファイルに追加する必要があります。

  • 初期化フックの設定

    initializerフィールドとinitializationTimeoutフィールドをfunctionパラメーターに追加します。

  • PreFreezeフックの設定

    handlertimeoutを含むinstanceLifecycleConfig.preFreezeフィールドをfunctionパラメーターに追加します。

  • PreStopフックの設定

    handlertimeoutを含むinstanceLifecycleConfig.preStopフィールドをfunctionパラメーターに追加します。

サンプルコード:

edition: 1.0.0
name: hello-world  #  The name of the project.
access: default    #  The alias of the key.

vars: # The global variable.
  region: cn-shanghai # The ID of the region.
  service:
    name: fc-example
    description: 'fc example by serverless devs'

services:
  helloworld: # The name of the service or module.
    component: fc
    actions: # The custom execution logic.
      pre-deploy: # The operation before the deployment.
        - run: mvn package # The command to run.
          path: ./ # The path in which the command runs.
    props: # The property value of the component.
      region: ${vars.region}
      service: ${vars.service}
      function:
        name: dotnet-lifecycle-hook-demo
        description: 'fc example by serverless devs'
        runtime: dotnetcore3.1
        codeUri: ./target
        handler: example.App::handleRequest
        memorySize: 128
        timeout: 60
        initializer: HelloFcApp::Example.Hello::Initialize
        initializationTimeout: 30
        instanceLifecycleConfig:
          preStop:
            Handler: HelloFcApp::Example.Hello::PreStop
            Timeout: 30
          preFreeze:
            Handler: HelloFcApp::Example.Hello::PreFreeze
            Timeout: 30

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

インスタンスライフサイクルフックのログを表示します。

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

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。

  3. [関数] ページで、目的の関数の名前をクリックします。 表示される [関数の詳細] ページで、[関数のテスト] タブをクリックします。

  4. [テスト関数] タブで、[テスト関数] をクリックします。 [ログ] > [関数ログ] を選択します。

    [関数ログ] タブでは、呼び出しログ、および関数のInitializerフックとPreFreezeフックのログを表示できます。 例:

    2022-10-09 19:26:17 FunctionCompute dotnetcore3.1ランタイムinited。
    2022-10-09 19:26:17 FC Initialize Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e ******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e ****** [情報] 開始の初期化
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e ****** [情報] ハンドル初期化子: 793ad2f1-9826-4d9a-90d9-5bf39e ******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e ****** [情報] Initialize end
    2022-10-09 19:26:17 FC Initialize End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e ******
    2022-10-09 19:26:17 FC Invoke Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e ******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e ****** [情報] リクエストの処理: 793ad2f1-9826-4d9a-90d9-5bf39e ******
    2022-10-09 19:26:17 FC Invoke End RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e ******
    2022-10-09 19:26:17 FC PreFreeze Start RequestId: 793ad2f1-9826-4d9a-90d9-5bf39e ******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e ****** [情報] プレフリーズ開始
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e ****** [情報] ハンドルプレフリーズ: 793ad2f1-9826-4d9a-90d9-5bf39e ******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e ****** [情報] プレフリーズ終了
    2022-10-09 19:26:17 FC PreFreezeエンドRequestId: 793ad2f1-9826-4d9a-90d9-5bf39e ****** 

    各関数インスタンスは一定期間キャッシュされ、すぐには破棄されません。PreStopフックのログをすぐに表示することはできません。 PreStopフックをすばやくトリガーするには、関数設定または関数コードを更新します。 更新が完了すると、関数ログでPreStopフックのログを表示できます。 例:

    2022-10-09 19:32:17 FC PreStop Start RequestId: 03be685c-378b-4736-8b08-a67c1d*****
    2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop start
    2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] Handle PreStop: 03be685c-378b-4736-8b08-a67c1d*****
    2022-10-09 19:32:17 2022-10-09 19:32:17 03be685c-378b-4736-8b08-a67c1d***** [INFO] PreStop end
    2022-10-09 19:32:17 FC PreStop End RequestId: 03be685c-378b-4736-8b08-a67c1d*****