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

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

最終更新日:Sep 02, 2024

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

背景情報

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

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

メソッド署名

初期化フック署名

Initializerフックは、関数インスタンスが開始された後、ハンドラーが実行される前に実行されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に呼び出されるようにします。 Initializerフックの実行に失敗した場合、システムはInitializerフックが正常に実行されるまでInitializerフックを再試行し、ハンドラーを実行します。 Initializerフックが繰り返し呼び出されるときに正しく設定されていることを確認してください。

Initializerフックはコンテキスト入力パラメーターで構成され、イベントハンドラーと同じ方法で呼び出すことができます。

Initializerフックを使用するには、FunctionInitializer操作を継承し、操作内のinitializeメソッドを実装する必要があります。 次のサンプルコードは、FunctionInitializer操作を定義する方法の例を示します。

package com.aliyun.fc.runtime;

import java.io.IOException;

/**
 * This is the interface for the initialization operation
 */
public interface FunctionInitializer {

    /**
     * The interface to handle a function compute initialize request
     *
     * @param context The function compute initialize environment context object.
     * @throws IOException IOException during I/O handling
     */
    void initialize(Context context) throws IOException;
}

PreStopフック署名

関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックを使用するには、PreStopHandler操作を継承し、操作のpreStopメソッドを実装する必要があります。 次のサンプルコードは、PreStopHandler操作を定義する方法の例を示します。

package com.aliyun.fc.runtime;

import java.io.IOException;

/**
 * This is the interface for the preStop operation
 */
public interface PreStopHandler {

    /**
     * The interface to handle a function compute preStop request
     *
     * @param context The function compute preStop environment context object.
     * @throws IOException IOException during I/O handling
     */
    void preStop(Context context) throws IOException;
}

PreFreezeフック署名

関数インスタンスが凍結される前に、PreFreezeフックが実行されます。 PreFreezeフックを使用するには、PreFreezeHandler操作を継承し、操作のpreFreezeメソッドを実装する必要があります。 次のサンプルコードは、PreFreezeHandler操作を定義する方法の例を示します。

package com.aliyun.fc.runtime;

import java.io.IOException;

/**
 * This is the interface for the preFreeze operation
 */
public interface PreFreezeHandler {

    /**
     * The interface to handle a function compute preFreeze request
     *
     * @param context The function compute preFreeze environment context object.
     * @throws IOException IOException during I/O handling
     */
    void preFreeze(Context context) throws IOException;
}

例: StreamRequestHandler

package example;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;
import com.aliyun.fc.runtime.FunctionInitializer;
import com.aliyun.fc.runtime.PreFreezeHandler;
import com.aliyun.fc.runtime.PreStopHandler;

public class App implements StreamRequestHandler, FunctionInitializer, PreFreezeHandler, PreStopHandler {
    @Override
    public void initialize(Context context) throws IOException {
        context.getLogger().info("initialize start ...");
    }

    @Override
    public void handleRequest(
            InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        context.getLogger().info("handlerRequest ...");
        outputStream.write(new String("hello world\n").getBytes());
    }

    @Override
    public void preFreeze(Context context) throws IOException {
        context.getLogger().info("preFreeze start ...");
    }

    @Override
    public void preStop(Context context) throws IOException {
        context.getLogger().info("preStop start ...");
    }
}

ライフサイクルフックの設定

Function Computeコンソールの使用

ライフサイクルフックは、Function Computeコンソールの [Function Details] ページで設定できます。 フックの形式は [パッケージ名].[クラス名]::[メソッド名] です。 例: db_java_lifecycle

  • Initializer Hookexample.App::initializeに設定した場合、exampleのApp.javaファイルのinitializeメソッドが実装されます。

  • PreFreeze Hookexample.App::preFreezeに設定した場合、exampleパッケージのApp.javaファイルのpreFreezeメソッドが実装されます。

  • PreStop Hookexample.App::preStopに設定した場合、exampleパッケージのApp.javaファイルの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: java8-lifecycle-hook-demo
        description: 'fc example by serverless devs'
        runtime: java8
        codeUri: ./target
        handler: example.App::handleRequest
        memorySize: 128
        timeout: 60
        initializationTimeout: 60
        initializer: example.App::initialize
        instanceLifecycleConfig:
          preFreeze:
            handler: example.App::preFreeze
            timeout: 30
          preStop:
            handler: example.App::preStop
            timeout: 30

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

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

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

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

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

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

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

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

    2022-10-09 19:26:17 FunctionCompute dotnetcore3.1 runtime 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****** [INFO] Initialize start
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle initializer: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] 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****** [INFO] Handle request: 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****** [INFO] PreFreeze start
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] Handle PreFreeze: 793ad2f1-9826-4d9a-90d9-5bf39e******
    2022-10-09 19:26:17 2022-10-09 19:26:17 793ad2f1-9826-4d9a-90d9-5bf39e****** [INFO] PreFreeze end
    2022-10-09 19:26:17 FC PreFreeze End 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*****

サンプルプログラム

  • Function Computeが提供するInitializerおよびPreStopフックのサンプルプログラムについては、「java11-mysql」をご参照ください。

    この例では、Initializerフックを使用して環境変数からデータベース構成を取得し、MySQL接続を作成する方法と、PreStopフックを使用してJavaランタイム環境でMySQL接続を閉じる方法を示します。