すべてのプロダクト
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

  • Initializerフックが失敗した場合、400または404のエラーコードが返されます。 この場合、Function Computeはリクエストを再送信しませんが、Initializerフックが成功するまでInitializerフックを再試行します。

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

404

500

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

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

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

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

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

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

    image

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

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

logsでライフサイクルフックのログを表示できます。

  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*******