このトピックでは、カスタムランタイムで関数インスタンスのライフサイクルフックを実装する方法について説明します。
背景
関数インスタンスのライフサイクルフックを設定した後、対応するインスタンスのライフサイクルイベントが発生すると、Function Computeがフックを呼び出します。 関数インスタンスのInitializerフックとPreStopフックを設定できます。 詳細は、「インスタンスライフサイクルの設定」をご参照ください。
関数インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出し要求の課金ルールと同じです。 ただし、実行ログは、関数ログ、リアルタイムログ、および高度なログでのみ照会できます。 ライフサイクルフックのログは、呼び出し要求リストに表示されません。 詳細については、「インスタンスライフサイクルフックのログの表示」をご参照ください。
フックメソッドを実装する
Function Computeは、対応するインスタンスのライフサイクルイベントが発生すると、対応するライフサイクルフックを呼び出します。 関数のInitializerフックとPreStopフックを設定できます。
パス | 入力リクエスト | 期待される応答 |
(オプション) POST | リクエスト本文: なし。 リクエストヘッダー: 共通リクエストヘッダー。 詳細については、「Function Computeの一般的なリクエストヘッダー」をご参照ください。 | レスポンス本文: StatusCode
|
(オプション) GET |
| レスポンス本文: PreStopフックの戻り値。 StatusCode
|
このトピックでは、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 |
|
404 | |
500 | Function Computeは関数インスタンスを再起動します。 |
ライフサイクルフックの設定
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[ライフサイクル] をクリックします。 次に、[変更] をクリックします。
ライフサイクルパネルで、フックとタイムアウト期間を設定し、[デプロイ] をクリックします。
ライフサイクルフックを設定した後、対応するフックをコード実行に実装する必要があります。 クリックデプロイをクリックし、コードエディターの上部にテスト機能.
インスタンスライフサイクルフックのログを表示する
logsでライフサイクルフックのログを表示できます。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、テストタブをクリックします。テスト機能を選択し、 を選択します。
[ログ] タブでは、関数呼び出しログと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*******