このトピックでは、カスタムコンテナランタイムで関数インスタンスのライフサイクルフックを実装する方法について説明します。
背景
ファンクションインスタンスのライフサイクルフックを設定した後、対応するインスタンスのライフサイクルイベントが発生すると、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コンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[ライフサイクル] をクリックします。 次に、[変更] をクリックします。
ライフサイクルパネルで、ライフサイクルフックとタイムアウト期間を設定し、[デプロイ] をクリックします。
ライフサイクルフックを設定した後、コードにフックを実装する必要があります。 クリックデプロイコードエディターの上で、テスト機能.
インスタンスライフサイクルフックのログの表示
ライフサイクルフックのログは [ログ] で表示できます。
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*******