本文介紹自訂鏡像實現函數執行個體生命週期回調的方法。
背景資訊
當您實現並配置函數執行個體生命週期回調後,Function Compute將在相關執行個體生命週期事件發生時調用對應的回調程式。函數執行個體生命週期涉及Initializer和PreStop回調。更多資訊,請參見配置執行個體生命週期。
函數執行個體生命週期回調程式與正常調用請求計費規則一致,但其執行日誌只能在函數日誌、即時日誌或進階日誌中查詢,調用請求列表不會展示回調程式日誌。具體操作,請參見查看執行個體生命週期回呼函數日誌。
回調方法實現
Function Compute會在相關執行個體生命週期事件發生時調用對應的回調程式。函數執行個體生命週期涉及Initializer和PreStop回調。
Path | 輸入請求 | 期望的響應 |
(可選)POST | 請求體:無。 要求標頭:Common Request Headers。具體資訊,請參見Function Compute公用要求標頭。 | 響應體:函數 StatusCode
|
(可選)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回調方法,您需要在您的HTTP Server中實現Path為/initialize
和Method為POST
的對應邏輯。範例程式碼,請參見上表中關於initialize
的範例程式碼。
建立的函數不設定Initializer時,無需實現/initialize
。此時,即使HTTP Server實現了/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*******