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

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

最終更新日:Sep 02, 2024

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

背景情報

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

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

初期化フック

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

Initializerフックには入力パラメーター $contextが1つだけあり、ハンドラーと同じ方法で使用できます。

次のサンプルコードは、単純なInitializerフックの例を示しています。

<?php
function my_initializer($context) {
    $logger = $GLOBALS['fcLogger'];
    $logger->info("hello world");
}
?>            

my_initializerは、Initializerフックのメソッド名です。 名前は、Function Computeコンソールで設定したInitializer Hookパラメーターの値と同じである必要があります。 たとえば、関数のInitializer Hookパラメーターの値がmain.my_initializerの場合、function Computeは、initializerフックの設定後にmain.phpで定義されているmy_Initializerメソッドを読み込みます。

メソッド署名

  • 初期化関数には、入力パラメーターコンテキストが1つだけあります。 このパラメーターの情報は、ハンドラーに指定されたコンテキストパラメーターの情報と同じです。

  • contextパラメーターのinitializerフィールドとinitializationTimeoutフィールドは、Initializerフックに使用されます。 Initializerフックを使用する場合は、関数のInitializer hookパラメーターとInitializer Timeoutパラメーターに設定した値に2つのフィールドを設定します。 それ以外の場合、値は空で有効になりません。

  • 値は返されません。

PreStopフック

関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックのメソッド署名は、Initializerフックのメソッド署名と同じです。

次のサンプルコードは、PreStopフックの例を示しています:

<?php

$counter = 0;
function preStop($context) {
    $GLOBALS['fcLogger']->info("preStop ok");
}

function handler($event, $context) {
    global $counter;
    $counter += 2;
    return $counter;
}
?>

関数に対してアクティブ化したLogstoreのPreStopフックのログを照会できます。 たとえば、次の形式のステートメントを使用して、関数のすべてのログを照会できます。 詳細については、「フックに関するクエリログ」をご参照ください。

<funcName> AND <ServiceName> AND qualifier: <VERSION>

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

Function Computeコンソールの使用

Function Computeコンソールの関数設定で、[Initializer Hook][PreStop Hook] を設定できます。 詳細は、「Functionインスタンスのライフサイクル」をご参照ください。 フックの形式は [ファイル名. メソッド名] です。 例:

  • Initializer Hookindex.initializeに設定した場合、index.phpファイルのinitializeメソッドが使用されます。

  • PreStop Hookindex.preStopに設定した場合、index.phpファイルのpreStopメソッドが使用されます。

db-php-lifecycle

Serverless Devsの使用

Serverless Devsを使用してライフサイクルフックを設定できます。 この場合、Initializer HookPreStop Hooks.yamlファイルに追加する必要があります。

  • 初期化フックの設定

    initializerフィールドとinitializationTimeoutフィールドを関数設定に追加します。

  • PreStopフックの設定

    handlertimeoutを含むinstanceLifecycleConfig.preStopフィールドを関数設定に追加します。

サンプルコード:

edition: 1.0.0          #  The version of the YAML syntax. The version complies with the semantic versioning specification.
name: hello-world-app  #  The name of the project.
access: default         #  The alias of the key.

vars:
  region: cn-hangzhou
  service:
    name: php72-mysql    # The name of the service.
    description: 'hello world by serverless devs' # A brief description of the service.

services:
  helloworld: # The name of the service or module.
    component: fc
    props:
      region: ${vars.region}
      service: ${vars.service}
      function:
        name: php72-mysql                              # The name of the function.
        description: 'hello world by serverless devs' # A brief description of the function.
        runtime: php7.2                                # Runtime.
        codeUri: ./code                                # The location of the code.
        handler: index.handler                         # The handler of the function. The format of the value varies based on the programming language that you use.
        memorySize: 128                                # The memory size for the function.
        timeout: 60                                    # The timeout period for the execution of the function.
        initializationTimeout: 20                      # The timeout period for the execution of the Initializer method.
        initializer: index.initialize                  # The Initializer method.
        instanceLifecycleConfig:                       # The extension function.
          preStop:                                     # The PreStop hook.
            handler: index.pre_stop                    # The handler of the function.
            timeout: 20                                # The timeout period.

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フックを使用するMySQLデータベースのサンプルプログラムを提供します。 この例では、Initializerフックを使用して、環境変数からMySQLデータベース構成を取得し、MySQLデータベース接続を作成し、データベース接続をテストします。 PreStopフックは、MySQL接続を閉じるために使用されます。

詳細については、「php72-mysql」をご参照ください。