當您實現並配置函數執行個體生命週期回調後,Function Compute將在相關執行個體生命週期事件發生時調用對應的回調程式。本文介紹自訂鏡像實現函數執行個體生命週期回調的方法。
背景資訊
函數執行個體生命週期涉及Initializer和PreStop回調。Initializer回調包含調用代碼和執行指令兩種類型,目前僅GPU函數支援執行指令類型的Initializer回調。更多資訊,請參見配置執行個體生命週期。
函數執行個體生命週期回調程式與正常調用請求計費規則一致,但其執行日誌只能在即時日誌、函數日誌或進階日誌中查詢,調用請求列表不會展示回調程式日誌。具體操作,請參見查看執行個體生命週期回呼函數日誌。
目前執行指令類型回調產生的日誌暫不支援寫入函數日誌。
回調方法實現
Function Compute會在相關執行個體生命週期事件發生時調用對應的回調程式。函數執行個體生命週期涉及Initializer和PreStop回調。Initializer回調程式包含調用代碼和執行指令兩種類型,二者不允許同時配置,只能有一個生效。
調用代碼
配置調用代碼類型的回調程式後,函數執行個體啟動或停止時,系統會向您的函數發送HTTP請求POST /initialize或GET /pre-stop,您需要在業務代碼中響應該請求。
Path | 輸入請求 | 期望的響應 |
(可選)POST |
| 響應體:函數Initializer的傳回值。 StatusCode
說明 當Initializer回調程式執行逾時或失敗時,服務端始終返回HTTP 200狀態代碼,必須通過回應標頭 |
(可選)GET |
| 響應體:函數PreStop的傳回值。 StatusCode
|
如果您想在自訂鏡像使用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 |
|
404 | |
500 | Function Compute重啟執行個體。 |
執行指令
若指令退出碼為非0,不會重新執行,系統會返回相關錯誤。
配置生命週期回呼函數
登入Function Compute控制台,在左側導覽列,選擇。
在頂部功能表列,選擇地區,然後在函數列表頁面,單擊目標函數。
在函數詳情頁,選擇配置頁簽,然後在執行個體配置地區,單擊編輯。
在執行個體配置面板,設定Initializer回調程式和Initializer回調逾時時間。
調用代碼

執行指令
控制台執行指令前置了
/bin/bash和/bin/sh兩種Shell實現方式。
在執行個體配置面板,繼續設定PreStop回調程式和回調逾時時間,然後單擊部署。

查看執行個體生命週期回呼函數日誌
目前執行指令類型回調產生的日誌暫不支援寫入函數日誌。
您可以通過函數日誌功能查看回呼函數日誌。
登入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*******