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

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

最終更新日:Aug 28, 2024

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

背景

関数インスタンスのライフサイクルフックを設定すると、対応するライフサイクルイベントが発生するとFunction Computeがフックを呼び出します。 PHPランタイムでは、InitializerフックとPreStopフックを設定できます。 詳細は、「インスタンスライフサイクルの設定」をご参照ください。

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

フックメソッドの署名

初期化フック署名

関数インスタンスが開始された後、ハンドラーが実行される前に、Initializerフックが実行されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけ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;
}

例: 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.PreStopHandler;

public class App implements StreamRequestHandler, FunctionInitializer, 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 preStop(Context context) throws IOException {
        context.getLogger().info("preStop start ...");
    }
}

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

Function Computeコンソールの使用

function Computeコンソールの関数詳細ページでライフサイクルフックを設定できます。 フックの形式は [パッケージ名].[クラス名]::[メソッド名] です。FC次の図に例を示します。db_java_lifecycle

  • 上記の例では、Initializer Hookexample.App::initializeに設定されています。これは、exampleパッケージのApp.javaファイル内のinitializeメソッドが実装されていることを示します。

  • PreStop Hookexample.App::preStopに設定されます。これは、exampleパッケージのApp.javaファイル内のpreStopメソッドが実装されていることを示します。

Serverless Devsの使用

Serverless Devsを使用する場合は、Initializer hookPreFreeze hook、およびPreStop hookの設定を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: mvn package -DskipTests
          path: ./
    props:
      region: ${vars.region}              
      functionName: "start-java-1xqf"
      description: 'hello world by serverless devs'
      runtime: "java8"
      code: ./target/HelloFCJava-1.0-SNAPSHOT-jar-with-dependencies.jar
      handler: example.App::handleRequest
      memorySize: 128
      timeout: 10
      instanceLifecycleConfig:      # The extension function
        initializer:                # The Initializer hook
          handler: example.App::initialize
          timeout: 60     
        preStop:                    # The PreStop hook
          handler: example.App::preStop  # The function handler
          timeout: 60               # The timeout period.
 

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

サンプルプログラム

  • java11-mysql: Function Computeが提供するサンプルプログラム。 このプログラムでは、InitializerおよびPreStopフックの設定例を示します。

    このプログラムでは、JavaランタイムのInitializerフックを使用して、環境変数からデータベース構成を取得し、MySQL接続を確立します。 PreStopフックは、MySQL接続を終了するために使用されます。