HTTP觸發器通過發送HTTP請求觸發函數執行,主要適用于快速構建Web服務等場景。在使用HTTP觸發器前,您需要關注觸發器的限制及支持的HTTP/HTTPS、WebSocket和gRPC協議的限制,以防止超過限制而導致函數報錯。同時,本文介紹了HTTP觸發器調用的方式、認證鑒權方式和跨域請求的使用方式。
注意事項
如果您的HTTP觸發器為匿名觸發器,即觸發器配置中認證方式選擇為無需認證,則無需驗證身份,任何人都可以發送HTTP請求調用您的函數,存在URL泄露的風險。此時,您可以設置檢查請求消息頭部字段
Authorization
是否合法來進行鑒權驗證,避免URL泄露。更多信息,請參見簽名認證。根據國家網絡安全監管要求,阿里云安全團隊會對備案在阿里云上的網絡域名進行隨機抽檢訪問,這種情況下,您的匿名HTTP網絡域名可能會被請求,產生額外調用記錄。
根據國家網絡安全監管要求,自2024年06月10日起,新創建的HTTP觸發器將禁止通過公網訪問地址下載APK文件(MIMETYPE為application/vnd.android.package-archive),APK文件下載訪問將直接返回400錯誤碼。更多信息,請參見如何確保HTTP觸發器公網訪問地址正常返回.apk文件。
VIP(虛擬IP地址)輪換機制。
函數計算服務為了增加系統韌性和服務穩定性,一直以來均實施VIP(虛擬IP地址)輪換機制。這意味著,作為我們基礎設施健壯性的一部分,HTTP觸發器所提供的公網/內網訪問地址所對應的VIP地址將會不定期地進行輪換。
特別提醒您,直接硬編碼VIP地址可能會引發服務中斷,強烈建議通過自定義域名方式訪問,確保業務的健壯性。注意,因不當使用VIP引發的故障不在函數計算產品賠付范疇內,請您檢查并調整為正確使用方式。
您可以使用自定義域名配合CNAME來正確訪問函數計算。更多信息,請參見配置自定義域名。
使用限制
在配置和使用HTTP觸發器前,您需要了解HTTP觸發器的使用限制和支持的HTTP/HTTPS、WebSocket以及gRPC協議的使用限制。
觸發器限制
非Web Server模式的Custom Container函數不支持創建HTTP觸發器。
函數設置HTTP觸發器后不能再設置其他類型的觸發器。
HTTP觸發器默認提供的內置域名只用來提供測試服務,請不要用于對外的線上服務,避免因內置域名提供服務的穩定性影響您的線上服務。
說明對外提供網站類型服務只能通過已備案域名來實現。即通過配置自定義域名,將域名與函數進行綁定,使用自己的域名對外提供服務。更多信息,請參見配置自定義域名。
HTTP/HTTPS協議使用限制
支持GET、POST、PUT、DELETE、HEAD、PATCH和OPTIONS方式觸發函數,適用于簡單的請求-響應場景。更多信息,請參見配置HTTP觸發器并使用HTTP觸發。
HTTP Request限制
Request Headers不支持以x-fc-開頭的自定義字段和connection、keep-alive自定義字段。
如果Request超過以下限制,會返回
400
狀態碼和InvalidArgument
錯誤碼。Headers大小:Headers中的所有Key和Value的總大小不得超過8 KB。
Path大小:包括所有的Query Params,Path的總大小不得超過8 KB。
Body大小:同步調用請求的Body的總大小不得超過32 MB,異步調用請求的Body的總大小不得超過128 KB。
HTTP Response限制
Response Headers不支持以x-fc-開頭的自定義字段和connection、content-length、date、keep-alive、server、upgrade、content-disposition:attachment自定義字段。
如果Response超過以下限制,會返回
502
狀態碼和BadResponse
錯誤碼。Headers大小:Headers中的所有Key和Value的總大小不得超過8 KB。
說明從安全角度考慮,使用函數計算默認的aliyuncs.com域名,服務端會在Response Headers中強制添加content-disposition: attachment字段,此字段會使得返回結果在瀏覽器中以附件的方式下載。如果要解除該限制,需設置自定義域名。更多信息,請參見配置自定義域名。
WebSocket協議使用限制
支持GET方式觸發函數,適用長連接、實時消息等場景。更多信息,請參見配置HTTP觸發器并使用WebSocket觸發。
Runtime支持:僅Custom Runtime和Custom Container支持WebSocket協議。
超時時間限制:WebSocket請求受函數配置的超時時間限制。
WebSocket握手的Request限制:
Request Headers不支持以x-fc-開頭的自定義字段。
Headers大小:Headers中的所有Key和Value的總大小不得超過8 KB。
Path大小:包括所有的Query Params,Path的總大小不得超過8 KB。
Body:WebSocket握手請求中不支持發送Body,即使發送,也會被函數計算系統忽略。
WebSocket握手的Response限制:
Response Headers中所有Key和Value的總大小不得超過8 KB,否則會返回
502
狀態碼和BadResponse
錯誤碼。WebSocket數據傳輸限制:
WebSocket鏈接建立之后,一次發送或接收的數據包(message)最大體積為6 MB。
gRPC協議使用限制
支持gRPC協議觸發函數,適用于低延遲、高性能、使用ProtoBuf支持多語言通信的場景。更多信息,請參見配置HTTP觸發器并使用gRPC觸發。
Runtime支持:僅Custom Runtime和Custom Container支持gRPC協議。
使用時的限制:
使用gRPC觸發函數執行前,請確保HTTP觸發器的請求方法中包含POST。
請使用子域名
fcapp.run
或者自定義域名發起gRPC調用。
超時時間限制:gRPC請求受函數配置的超時時間限制,即流式gRPC的鏈接最長保持時間不得超過函數配置的執行超時時間。
gRPC數據傳輸限制:gRPC流式鏈接建立之后,一次發送或接收的數據包(message)最大體積為6 MB。
優勢
HTTP觸發器與API網關觸發器均可應用于Web應用的創建。使用方式如下:
HTTP觸發器:您可以通過綁定自定義域名,為HTTP函數映射不同的HTTP訪問路徑。詳細信息,請參見配置自定義域名。
API網關觸發器:您還可以使用API網關,后端服務類型選擇函數計算2.0,函數類型選擇HTTP函數,選擇后端服務地址,實現類似功能。詳細信息,請參見使用函數計算作為API后端服務。
相較于API網關觸發器,HTTP觸發器有以下優勢。
降低開發人員的學習成本和簡化開發人員的調試過程,幫助開發人員快速使用函數計算搭建Web應用和API。
減少請求處理環節,HTTP觸發器支持更高效的請求、響應格式,不需要編碼或解碼成JSON格式,性能更優。
支持選擇熟悉的HTTP測試工具驗證函數計算側的功能和性能。
方便對接其他支持Webhook回調的服務,例如CDN回源、MNS等。
支持WebSocket和gRPC協議。
調用方式
同步調用
同步調用指事件被函數處理后直接返回結果。HTTP觸發器默認的函數調用方式為同步調用。更多信息,請參見同步調用。
異步調用
異步調用指函數計算收到請求后,將請求持久化保存,然后立即返回響應,而不是等待請求執行完成后,再返回執行結果。
異步調用:觸發HTTP函數時,您可以通過增加請求頭
"X-Fc-Invocation-Type":"Async"
的方式實現請求級別的異步調用。異步任務:HTTP函數配置了異步任務后,可以通過增加請求頭
"X-Fc-Stateful-Async-Invocation-Id":"g6u*****iyvhd3jk8s6bhj0hh"
完成異步任務調用Invocation ID的配置。
關于請求頭的更多信息,請參見InvokeFunction - 調用函數。
異步調用成功后,函數計算會返回狀態碼202
,表示請求接收成功。同時會通過請求頭返回Request ID和Stateful Invocation ID,格式如"X-Fc-Request-Id": "80bf7****281713e1", "X-Fc-Stateful-Async-Invocation-Id": "7522ba40****1c22e"
。
如果函數計算返回的狀態碼是202
以外的狀態碼,則表示調用失敗。關于調用失敗后錯誤原因,請參見錯誤處理。
針對某些場景,您提交一次異步調用后,需要函數計算對其進行延遲觸發。此時,您可以在代碼中添加HTTP請求頭x-fc-async-delay
,其取值范圍為(0,3600),單位為秒。函數計算將從您觸發執行開始計算,延遲x-fc-async-delay
設置的時間后觸發函數調用。更多信息,請參見延遲調用。
認證鑒權
函數計算支持對HTTP觸發器配置認證鑒權。外部用戶通過HTTP觸發器訪問函數時,必須經過函數計算的認證鑒權之后,才能訪問到函數。HTTP觸發器目前支持簽名認證和JWT認證兩種鑒權方式。
使用簽名認證方式調用HTTP函數
客戶端在調用HTTP函數的時候,需要先根據事先分配好的AK和SK對請求內容進行計算簽名,在發起HTTP請求時,需要將AK和簽名信息傳輸給函數計算進行驗證。更多信息,請參見簽名認證。
此認證方式安全強度較高,但是需要您自己在客戶端實現簽名算法,實現成本較高。并且需要將AK和SK保存在客戶端,AK和SK存在泄露的風險,雖然可以通過阿里云臨時安全令牌(STS) 來避免這個問題,但是會引入一定的架構復雜性。
使用JWT(JSON Web Tokens)認證方式調用HTTP函數
JWT是一套流行的API授權訪問機制,安全強度高,適用于JavaScript或Web前端等安全性較低的客戶端場景。更多信息,請參見為HTTP觸發器配置JWT認證鑒權。
CORS請求處理
函數計算系統默認允許HTTP函數的調用請求跨域訪問,同時也支持用戶在函數代碼中自定義函數對跨域(即CORS)請求的處理行為。
簡單請求
簡單請求不會發送預檢請求,您可以直接在函數代碼中設置Access-Control-Allow-*
開頭的Header,完成簡單的訪問控制。對于簡單請求,函數計算支持自定義的Headers包括:Access-Control-Allow-Origin
、Access-Control-Allow-Headers
、Access-Control-Request-Method
和Access-Control-Max-Age
。
如果您沒有自定義Headers,函數計算的Response Headers會默認設置為Request請求中相應的字段:
Access-Control-Allow-Origin
:Request請求的Origin Header。Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers
:函數計算自定義的一些Headers。
非簡單請求
非簡單請求在發送正式請求前會發送預檢請求,即一次非簡單請求包含一次OPTIONS方法的函數調用請求和一次實際的函數調用請求。正式請求的規則與上文的簡單請求相同。如果您需要自定義預檢請求的返回,則需要:為HTTP觸發器添加OPTIONS方法,然后在函數代碼中處理OPTIONS請求,即設置Access-Control-Allow-*
開頭的Header以控制函數的跨域行為。
對于預檢請求,函數計算支持用戶自定義的Headers包括Access-Control-Allow-Origin
、Access-Control-Allow-Headers
、Access-Control-Request-Method
和Access-Control-Max-Age
。
以Node.js為例,函數代碼中處理預檢請求的示例如下所示:
exports.handler = (req, resp, context) => {
console.log('hello world');
if (req.method === 'OPTIONS') {
// Send response to OPTIONS requests
resp.setHeader('Access-Control-Allow-Origin', 'http://www.fc.com')
resp.setHeader('Access-Control-Allow-Methods', 'POST');
resp.setHeader('Access-Control-Allow-Headers', 'Content-Type');
resp.setHeader('Access-Control-Max-Age', '3600');
resp.setStatusCode(204)
resp.send('');
} else {
resp.send("hello world");
}
}
常見問題
在創建函數時,選擇使用自定義運行時創建或者使用容器鏡像創建,才需要設置監聽端口。
SSE是Server-Sent Events的簡稱,是流式響應。目前函數計算的使用自定義運行時創建和使用容器鏡像創建是支持流式響應的,但是使用內置運行時創建暫不支持流式響應。
在使用自定義運行時創建和使用容器鏡像創建方式部署函數時,函數計算會根據響應頭中是否帶有Transfer-Encoding:chunked
來判斷是否為流式響應。為了方便您的使用,在使用自定義運行時創建方式部署函數時,在運行時中可以選擇流式響應的示例代碼。
函數使用頻率較低,在首次發起調用時需要等待實例冷啟動。
具體原因可參見為什么使用頻率較低的函數調用時間比較長?。如果您希望消除冷啟動延時的影響,請參見如何讓實例一直存活不銷毀,消除冷啟動延時的影響?。
如果函數調用偶然出現超時現象,您可以調整執行超時時間及通過日志查找超時原因,具體解決方案可以參見函數執行超時,報錯Function time out after怎么辦?。
如果您的函數請求量很大,建議設置實例并發度減少執行時長,具體請參見設置實例并發度。
出現客戶端499錯誤后函數實例會重啟,您可以通過配置健康檢查避免實例重啟,具體原因及操作請參見為什么函數出現客戶端499錯誤后函數實例會重啟?。
如果客戶端調用出現超時情況,您可以將耗時的邏輯放在新的函數中,使用函數的異步調用功能調用新的函數,或者在客戶端調用時使用異步調用。
函數執行完成后才會更新函數配置。更新函數配置后,已經在執行中的請求仍然使用原來的配置運行直到執行結束。新發起的調用請求將使用新的函數配置。
刪除當前函數,創建新的函數重新配置。
相關文檔
設置HTTP觸發器的函數和事件函數的入口函數是有差異的,請確認您設置的函數入參是否正確。詳細信息可參考以下文檔。