このトピックでは、カスタムランタイムのインスタンスライフサイクルフックを実装する方法について説明します。
背景情報
インスタンスのライフサイクルフックを実装および構成すると、Function Compute は、特定のインスタンスライフサイクルイベントが発生したときに、対応するフックを呼び出します。インスタンスのライフサイクルには、Initializer フックと PreStop フックが含まれます。詳細については、「インスタンスのライフサイクルフックを設定する」をご参照ください。
インスタンスのライフサイクルフックと通常の呼び出しリクエストは、同じ課金ルールに従います。ただし、実行ログは [リアルタイムログ]、[関数ログ]、または [高度なログ] でのみ確認でき、[呼び出しリクエスト一覧] には表示されません。詳細については、「インスタンスのライフサイクルフックのログを表示する」をご参照ください。
コールバックメソッドの実装
特定のインスタンスライフサイクルイベントが発生すると、Function Compute は対応するフックを呼び出します。インスタンスのライフサイクルには、Initializer フックと PreStop フックが含まれます。
パス | 入力リクエスト | 期待される応答 |
(オプション) POST | リクエスト本文: なし。 リクエストヘッダー: 共通リクエストヘッダー。詳細については、「Function Compute の共通リクエストヘッダー」をご参照ください。 | 応答本文: 関数の 状態コード
説明 Initializer フックがタイムアウトまたは失敗した場合、サーバーは常に HTTP 200 ステータスコードを返します。初期化の失敗がエラーの原因であるかどうかを判断するには、 |
(オプション) GET |
| 応答本文: 関数の PreStop フックの戻り値。 状態コード
|
次の例は、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)
# 独自の処理を実装
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)
# 独自の処理を実装
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)
# 独自の処理を実装
print("FC PreStop End RequestId: " + rid)
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
次の /initialize パスのコード例は、Python で関数の実行エラーを引き起こします。
@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 コールバックメソッドと同様の方法で使用されます。
コールバックのエラーコード
エラーコード ID | 説明 |
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*******