すべてのプロダクト
Search
ドキュメントセンター

Function Compute:インスタンスライフサイクルフック

最終更新日:Apr 21, 2026

インスタンスライフサイクルフックを実装および設定すると、Function Compute は特定のインスタンスライフサイクルイベントに対応するフックを呼び出します。このトピックでは、カスタムイメージでこれらのフックを実装する方法について説明します。

背景情報

インスタンスライフサイクルには、Initializer フックと PreStop フックが含まれます。Initializer フックには、コードの呼び出し命令の実行の 2 種類があります。現在、命令の実行タイプをサポートしているのは GPU アクセラレーション関数のみです。詳細については、「インスタンスライフサイクルの設定」をご参照ください。

インスタンスライフサイクルフックは、通常の呼び出しリクエストと同じ課金ルールに従います。ただし、その実行ログは [リアルタイムログ]関数ログ、または 詳細ログ でのみ確認でき、[呼び出しリクエストリスト] には表示されません。詳細については、「インスタンスライフサイクルフックのログを表示する」をご参照ください。

説明

現在、命令の実行フックからのログは関数ログに書き込むことができません。

コールバックメソッドの実装

Function Compute は、特定のインスタンスライフサイクルイベントに対応するフックを呼び出します。インスタンスライフサイクルには、Initializer フックと PreStop フックが含まれます。Initializer フックは、コードの呼び出し命令の実行の 2 種類をサポートしています。両方のタイプを同時に設定することはできず、一度にアクティブにできるのは 1 つだけです。

コードの呼び出し

コードの呼び出しフックを設定すると、インスタンスの起動時または停止直前に、システムは `POST /initialize` や `GET /pre-stop` などの HTTP リクエストを関数に送信します。アプリケーションコードでこのリクエストを処理する必要があります。

パス

リクエスト

期待されるレスポンス

(オプション) POST /initialize

レスポンスボディ:関数の Initializer フックの戻り値。

ステータスコード

  • 2xx:成功。

  • 非 2xx:失敗。

説明

Initializer フックが失敗またはタイムアウトした場合、サーバーは常に HTTP 200 ステータスコードを返します。失敗を確認するには、X-Fc-Error-Type:InitializationError レスポンスヘッダーまたはレスポンスボディの `errorMessage` フィールドを確認する必要があります。

(オプション) GET /pre-stop

レスポンスボディ:関数の PreStop フックの戻り値。

カスタムイメージで Initializer フックを使用するには、HTTP サーバーに `/initialize` パスと POST メソッドのロジックを実装する必要があります。同様に、PreStop フックでは `/pre-stop` パスと GET メソッドのロジックが必要です。次のサンプルコードは、カスタム Python 3.10 ランタイムでの実装例です。

説明

Initializer フックを設定した場合にのみ、`/initialize` ロジックを実装する必要があります。フックが設定されていない場合、HTTP サーバー内の対応するコードは呼び出されません。PreStop フックと `/pre-stop` パスについても同様です。

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)

上記の例は、初期化が成功した場合のものです。次の例は、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, []

命令の実行

命令の実行フックは、インスタンスの起動後にコマンドを実行してインスタンスを初期化します。関数の実行環境でサポートされている任意のシェル (例:/bin/bash/bin/sh/bin/csh/bin/zsh) を使用できます。

Function Compute コンソールには、/bin/bash/bin/sh の 2 つのプリセットオプションが用意されています。このトピックでは、/bin/sh を例として使用します。

#!/bin/sh

URL="http://localhost:7860"
REQUEST_PATH="sdapi/v1/txt2img"
JSON_DATA='{
	"prompt": "",
	"steps": 1,
	"height": 8,
	"width": 8
}'
temp_file=$(mktemp)
trap 'rm -f "$temp_file"' EXIT

if ! http_code=$(curl -s -w "%{http_code}" \
	-H "Content-Type: application/json" \
	-d "$JSON_DATA" \
	-o "$temp_file" \
	-X POST "$URL"/"$REQUEST_PATH"); then
	echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
	| jq . >&2
	exit 1
fi

response=$(<"$temp_file")
echo "http code $http_code"

if [ "$http_code" -eq 200 ]; then
	echo "$response" | jq -r '.' || printf "%s\n" "$response"
	exit 0
else
	echo "$response_body" \
	| jq -c 'if type == "object" then . else {raw: .} end' 2>/dev/null \
	| jq -s '{status: "http_error", code: $code, response: .[0]}' \
		--arg code "$http_code" \
		>&2
	exit 1
fi

終了コード 0 は成功を示します。それ以外の終了コードは失敗を示します。トラブルシューティングを容易にするために、スクリプト内でエラー詳細を標準エラー (stderr) に書き込むことができます。例えば、次のスニペットは、curl リクエストが失敗した場合にエラー詳細を出力し、終了コードを 1 に設定する方法を示しています。

if ! http_code=$(curl -s -w "%{http_code}" \
	-H "Content-Type: application/json" \
	-d "$JSON_DATA" \
	-o "$temp_file" \
	-X POST "$URL"/"$REQUEST_PATH"); then
	echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
	| jq . >&2
	exit 1
fi

コールバックのエラーコード

コードの呼び出し

エラーコード

説明

400

  • Initializer フックが 400 または 404 エラーで失敗した場合、その特定のリクエストは再試行されません。ただし、システムは成功するまでインスタンスの初期化を再度試みます。

  • PreStop フックでの 400 または 404 エラーは、関数インスタンスのフリーズや停止には影響しません。

404

500

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

命令の実行

終了コードが 0 でない場合、命令は失敗し、再実行されません。その後、システムはエラーを返します。

インスタンスライフサイクルフックの設定

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

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

  3. 関数詳細ページで、設定 タブをクリックします。インスタンスの設定 セクションで、変更 をクリックします。

  4. インスタンスの設定 パネルで、Initializer フックと Initializer タイムアウトを設定します。

    • コードの呼び出し

      image

    • 命令の実行

      コンソールには、/bin/bash/bin/sh の 2 つのプリセットシェルが用意されています。

      image

  5. [インスタンス設定] パネルで、PreStop フックを設定し、そのタイムアウトを設定します。その後、デプロイ をクリックします。

    image

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

説明

現在、命令の実行フックからのログは関数ログに書き込むことができません。

フックのログは 関数ログ で表示できます。

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