全部產品
Search
文件中心

Function Compute:函數執行個體生命週期回調

更新時間:Sep 29, 2025

當您實現並配置函數執行個體生命週期回調後,Function Compute將在相關執行個體生命週期事件發生時調用對應的回調程式。本文介紹自訂鏡像實現函數執行個體生命週期回調的方法。

背景資訊

函數執行個體生命週期涉及Initializer和PreStop回調。Initializer回調包含調用代碼執行指令兩種類型,目前僅GPU函數支援執行指令類型的Initializer回調。更多資訊,請參見配置執行個體生命週期

函數執行個體生命週期回調程式與正常調用請求計費規則一致,但其執行日誌只能在即時日誌函數日誌進階日誌中查詢,調用請求列表不會展示回調程式日誌。具體操作,請參見查看執行個體生命週期回呼函數日誌

說明

目前執行指令類型回調產生的日誌暫不支援寫入函數日誌。

回調方法實現

Function Compute會在相關執行個體生命週期事件發生時調用對應的回調程式。函數執行個體生命週期涉及Initializer和PreStop回調。Initializer回調程式包含調用代碼執行指令兩種類型,二者不允許同時配置,只能有一個生效。

調用代碼

配置調用代碼類型的回調程式後,函數執行個體啟動或停止時,系統會向您的函數發送HTTP請求POST /initialize或GET /pre-stop,您需要在業務代碼中響應該請求。

Path

輸入請求

期望的響應

(可選)POST /initialize

響應體:函數Initializer的傳回值。

StatusCode

  • 2xx:成功狀態。

  • 非2xx:失敗狀態。

說明

當Initializer回調程式執行逾時或失敗時,服務端始終返回HTTP 200狀態代碼,必須通過回應標頭X-Fc-Error-Type:InitializationError或響應體中的errorMessage欄位判斷是否因初始化失敗導致錯誤。

(可選)GET /pre-stop

響應體:函數PreStop的傳回值。

StatusCode

  • 2xx:成功狀態。

  • 非2xx:失敗狀態。

如果您想在自訂鏡像使用Initializer回調方法,您需要在您的HTTP Server中實現Path為/initialize和Method為POST的對應邏輯,使用PreStop回調方法同理。本文以自訂運行時Python 3.10為例,具體樣本程式如下所示。

說明

建立的函數不設定Initializer時,無需實現/initialize。此時,即使HTTP Server實現了/initialize,代碼中的/initialize邏輯也無法被調用執行,PreStop同理。

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, []

執行指令

如果您希望函數執行個體啟動後,向函數發送HTTP請求來做一些初始化操作,可以通過配置回調指令來實現。支援使用者自訂Shell實現方式,例如/bin/bash/bin/sh/bin/csh/bin/zsh等,需要確保函數運行時環境支援對應的Shell實現方式。

Function Compute控制台目前預置了/bin/bash/bin/sh兩種方式,本文以/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

回調錯誤碼

調用代碼

錯誤碼ID

解釋說明

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兩種Shell實現方式。

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