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

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

最終更新日:Aug 28, 2024

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

背景

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

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

フックの実装方法

Function Computeは、対応するライフサイクルイベントが発生すると、対応するフックを呼び出します。 関数インスタンスのInitializerフックとPreStopフックを設定できます。

パス

入力リクエスト

期待される応答

(オプション) POST /initialize

リクエスト本文: なし。

リクエストヘッダー: 共通リクエストヘッダー。 詳細については、「Function Computeの一般的なリクエストヘッダー」をご参照ください。

レスポンス本文: Initializerの戻り値。

StatusCode

  • 2xx: 成功

  • その他のコード: failed

(オプション) GET /pre-stop

レスポンス本文: PreStopフックの戻り値。

StatusCode

  • 2xx: 成功

  • その他のコード: failed

次のコードスニペットは、Python 3.10カスタムランタイムにインスタンスライフサイクルフックを実装する例を示しています。

import os
from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/initialize', methods=['POST'])
def init_invoke():
    rid = request.headers.get('x-fc-request-id')
    print("FC Initialize Start RequestId: " + rid)
    # do your things
    print("FC Initialize End RequestId: " + rid)
    return "OK"

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
    rid = request.headers.get('x-fc-request-id')
    print("FC invoke Start RequestId: " + rid)
    # do your things
    print("FC invoke End RequestId: " + rid)
    return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]


@app.route('/pre-stop', methods=['GET'])
def prestop_invoke():
    rid = request.headers.get('x-fc-request-id')
    print("FC PreStop Start RequestId: " + rid)
    # do your things
    print("FC PreStop End RequestId: " + rid)
    return "OK"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9000)

前述の通常のコードに加えて、関数の例外がPythonで報告される場合があります。 /initializeの例を次に示します。

@app.route('/initialize', methods=['POST'])
def init():
    raise Exception("hahaha")
    return "OK", 200, []
@app.route('/initialize', methods=['POST'])
def init():
    return "OK", 404, []

カスタムコンテナーランタイムにInitializerフックを実装する場合は、HTTPサーバーに /initializeパスとPOSTメソッドのロジックを実装する必要があります。 上記の表のinitializeのサンプルコードを参照として使用できます。

重要

関数の作成時にInitializerフックを設定しない場合は、/initializeを実装する必要はありません。 この場合、HTTPサーバーが /initializeを実装していても、コード内の /initializeロジックを呼び出して実行することはできません。

PreStopフックは、Initializerフックと同じ方法で使用されます。

エラーコード

エラーコード

説明

400

  • イニシャライザーフックが失敗した場合、400または404のエラーコードが返されます。 この場合、リクエストは繰り返し送信されません。 ただし、システムは呼び出しが成功するまで再試行を続けます。

  • PreStopフックが失敗した場合、400または404のエラーコードが返されます。 この場合、関数インスタンスは期待どおりにフリーズまたは停止できます。

404

500

Function Computeは関数インスタンスを再起動します。

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

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

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[ライフサイクル] をクリックします。 次に、[変更] をクリックします。

  4. ライフサイクルパネルで、ライフサイクルフックとタイムアウト期間を設定し、[デプロイ] をクリックします。

    image

  5. ライフサイクルフックを設定した後、コードにフックを実装する必要があります。 クリックデプロイコードエディターの上で、テスト機能.

インスタンスライフサイクルフックのログの表示

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

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

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、テストタブをクリックします。テスト機能を選択し、ログ > 関数ログ.

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

    2024-06-26 10:59:23FC Initialize Start RequestId: 529eab23-9b3a-4ffc-88c8-9a686*******
    2024-06-26 10:59:23FC Initialize End RequestId: 529eab23-9b3a-4ffc-88c8-9a686*******
    2024-06-26 10:59:25FC Invoke Start RequestId: 1-667b840c-15c49df0-b7dc1*******
    2024-06-26 10:59:25FC Invoke End RequestId: 1-667b840c-15c49df0-b7dc1*******

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

    2024-06-26 11:04:33FC PreStop Start RequestId: c4385899-f071-490e-a8b7-e33c5*******
    2024-06-26 11:04:33FC PreStop End RequestId: c4385899-f071-490e-a8b7-e33c5*******