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

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

最終更新日:Aug 28, 2024

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

背景

関数インスタンスのライフサイクルフックを実装および設定した後、対応するインスタンスのライフサイクルイベントが発生すると、Function Computeがフックを呼び出します。 C# ランタイムは、InitializerフックとPreStopフックをサポートします。 詳細は、「インスタンスライフサイクルの設定」をご参照ください。

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

フックメソッドの署名

  • 初期化フック

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

  • PreStopフック

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

C# ランタイムのInitializerフックとPreStopフックのメソッドシグネチャは同じです。 コンテキスト入力パラメーターのみが含まれ、応答パラメーターは返されません。 次のコードスニペットに例を示します。

public void FunctionName(IFcContext context);

フックメソッドを静的メソッドに設定することもできます。 次のコードスニペットに例を示します。

public static void FunctionName(IFcContext context);

例: StreamRequestHandler

次のサンプルコードは、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コンソールでライフサイクルフックを設定できます。 詳細は、「インスタンスライフサイクルの設定」をご参照ください。 フックの形式はハンドラーの形式と同じで、アセンブリ名::Namespace.Class name::Method name形式に従います。 詳細は、「ハンドラ」をご参照ください。

例:

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

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

Serverless Devsを使用する

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

  • 初期化フック

    handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.initializerfunctionに追加します。

  • PreStopフック

    handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.preStopfunctionに追加します。

サンプルコード:

# ------------------------------------
# Official manual: https://manual.serverless-devs.com/user-guide/aliyun/#fc3
# Tips: https://manual.serverless-devs.com/user-guide/tips/
# If you have any questions, join the DingTalk group 33947367 for technical support.
# ------------------------------------
edition: 3.0.0
name: hello-world-app
access: "default"

vars: # The global variables
  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:      # The extension function
        initializer:                # The Initializer hook
          handler: HelloFcApp::Example.Hello::Initialize
          timeout: 60     
        preStop:                    # The PreStop hook
          handler: HelloFcApp::Example.Hello::PreStop  # The handler
          timeout: 60               # The timeout period    
      # triggers:
      #   - triggerName: httpTrigger # The trigger name
      #     triggerType: http # The trigger type
      #     description: 'xxxx'
      #     qualifier: LATEST # The function version
      #     triggerConfig:
      #       authType: anonymous # The authentication type. Valid values: anonymous and function.
      #       disableURLInternet: false # Specifies whether to disable access to the URL over the Internet.
      #       methods: # The access methods supported by the HTTP trigger. Valid values: GET, POST, PUT, DELETE, and 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