このトピックでは、カスタムランタイムで関数インスタンスのライフサイクルフックを実装する方法について説明します。
背景情報
関数インスタンスのライフサイクルフックを実装して設定すると、関連するライフサイクルイベントが発生したときに、Function Compute が対応するフックを呼び出します。関数インスタンスのライフサイクルには、Initializer フックと PreStop フックが含まれます。詳細については、「インスタンスライフサイクルの設定」をご参照ください。
ライフサイクルフックは、通常の呼び出しリクエストと同じルールに基づいて課金されます。ただし、その実行ログは 関数ログ または 詳細ログ でのみ表示できます。ライフサイクルフックのログは、呼び出しリクエスト リストには表示されません。詳細については、「インスタンスライフサイクルフックのログの表示」をご参照ください。
ライフサイクルフックの実装
FC は、関連するインスタンスライフサイクルイベントが発生したときに、対応するコールバックを呼び出します。関数インスタンスのライフサイクルには、Initializer コールバックと PreStop コールバックが含まれます。
パス | リクエスト | 期待されるレスポンス |
(任意) POST | リクエストボディ:なし。 リクエストヘッダー:共通のリクエストヘッダーが含まれます。詳細については、「Function Compute の共通リクエストヘッダー」をご参照ください。 | レスポンスボディ: StatusCode
説明 Initializer フックがタイムアウトまたは失敗した場合、サーバーは常に HTTP 200 ステータスコードを返します。初期化の失敗を特定するには、 |
(任意) 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 フックを使用するには、POST リクエストを受け入れる /initialize パスのロジックを HTTP サーバーに実装する必要があります。コード例については、上記の表の 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*******FC は関数インスタンスを削除する前に一定期間キャッシュするため、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*******