通過 HTTP 要求觸發函數執行,適用於快速搭建 Web 服務等情境。使用前需瞭解:觸發器與 HTTP/HTTPS的使用限制;同步/非同步呼叫方式;認證鑒權與跨域(CORS)的配置方式。本文介紹上述內容及常見問題。
注意事項
-
匿名觸發器的安全風險:若 HTTP 觸發器在配置中將认证方式選為无需认证,則不會驗證身份,任何人均可通過 HTTP 要求調用函數,存在 URL 泄露風險。可在業務中校正要求標頭
Authorization是否合法以自行鑒權。詳見為HTTP觸發器配置簽名認證。 -
APK 下載限制:根據國家網路安全監管要求,自 2024 年 6 月 10 日起,新建立的 HTTP 觸發器禁止通過公網地址下載 APK 檔案(MIME 類型為
application/vnd.android.package-archive),訪問將返回 400。詳見 如何確保HTTP觸發器公網訪問地址正常返回.apk檔案。 -
VIP 輪換:Function Compute為提升系統韌性與服務穩定性實施 VIP(虛擬 IP)輪換,HTTP 觸發器提供的公網/內網訪問地址對應的 VIP 會不定期輪換。直接寫入程式碼 VIP 可能導致服務中斷,建議通過自訂網域名訪問以保證業務穩定。因不當使用 VIP 導致的故障不在Function Compute賠付範圍內。
可通過自訂網域名搭配 CNAME 訪問,詳見配置自訂網域名。
使用限制
觸發器限制
HTTP/HTTPS協議使用限制
支援GET、POST、PUT、DELETE、HEAD、PATCH和OPTIONS方式觸發函數,適用於簡單的要求-回應情境。更多資訊,請參見配置HTTP觸發器。
-
HTTP Request限制
-
Request Headers不支援以x-fc-開頭的自訂欄位和以下自訂欄位。
-
connection
-
keep-alive
-
-
如果Request超過以下限制,會返回
400狀態代碼和InvalidArgument錯誤碼。-
Headers大小:Headers中的所有Key和Value的總大小不得超過8 KB。
-
Path大小:包括所有的Query Params,Path的總大小不得超過4 KB。
-
Body大小:同步調用請求的Body的總大小不得超過32 MB,關於非同步呼叫請求的Body的大小,請以函數運行資源限制為準。
-
-
-
HTTP Response限制
-
Response Headers不支援以x-fc-開頭的自訂欄位和以下自訂欄位。
-
connection
-
content-length
-
date
-
keep-alive
-
server
-
upgrade
-
content-disposition:attachment
說明從安全形度考慮,使用Function Compute預設的aliyuncs.com網域名稱,服務端會在Response Headers中強制添加content-disposition: attachment欄位,此欄位會使得返回結果在瀏覽器中以附件的方式下載。如果要解除該限制,需設定自訂網域名。更多資訊,請參見配置自訂網域名。
-
-
如果Response超過以下限制,會返回
502狀態代碼和BadResponse錯誤碼。-
Headers大小:Headers中的所有Key和Value的總大小不得超過8 KB。
-
-
與API Gateway的對比與優勢
HTTP觸發器與API Gateway觸發器均可應用於Web應用的建立。使用方式如下:
-
HTTP觸發器:您可以通過綁定自訂網域名,為HTTP函數映射不同的HTTP訪問路徑。詳細資料,請參見配置自訂網域名。
-
API Gateway觸發器:您還可以使用API Gateway,後端服務類型選擇Function Compute,實作類別似功能。詳細資料,請參見使用Function Compute作為API後端服務。
相較於API Gateway觸發器,HTTP觸發器有以下優勢。
-
降低開發人員的學習成本和簡化開發人員的調試過程,協助開發人員快速使用Function Compute搭建Web應用和API。
-
減少請求處理環節,HTTP觸發器支援更高效的請求、響應格式,不需要編碼或解碼成JSON格式,效能更優。
-
支援選擇熟悉的HTTP測試載入器驗證Function Compute側的功能和效能。
-
方便對接其他支援Webhook回調的服務,例如CDN回源、Simple Message Queue (formerly MNS)等。
調用方式
同步調用
同步調用指事件被函數處理後直接返回結果。HTTP觸發器預設的函數調用方式為同步調用。更多資訊,請參見同步調用。
非同步呼叫
非同步呼叫指Function Compute收到請求後,將請求持久化儲存,然後立即返迴響應,而不是等待請求執行完成後,再返回執行結果。
-
非同步呼叫:使用HTTP觸發器調用函數時,您可以通過增加要求標頭
"X-Fc-Invocation-Type":"Async"的方式實現請求層級的非同步呼叫。 -
非同步任務:HTTP函數配置了非同步任務後,您可以通過增加要求標頭
"X-Fc-Async-Task-Id":"g6u*****iyvhd3jk8s6bhj0hh"完成非同步任務調用Invocation ID的配置。
關於要求標頭的更多資訊,請參見調用函數。
非同步呼叫成功後,Function Compute會返回狀態代碼202,表示請求接收成功。同時會通過要求標頭返回Request ID,格式如"X-Fc-Request-Id": "80bf7****281713e1"。
如果Function Compute返回的狀態代碼是202以外的狀態代碼,則表示調用失敗。關於調用失敗後錯誤原因,請參見重試機制。
認證鑒權
Function Compute支援對HTTP觸發器配置認證鑒權。外部使用者通過HTTP觸發器訪問函數時,必須經過Function Compute的認證鑒權之後,才能訪問到函數。HTTP觸發器支援的鑒權方式如下:
CORS請求處理
Function Compute系統預設允許函數的調用請求跨域訪問,同時也支援使用者在函數代碼中自訂函數對跨域(即CORS)請求的處理行為。
簡單請求
簡單請求不會發送預檢請求,您可以直接在函數代碼中設定Access-Control-Allow-*開頭的Header,完成簡單的存取控制。對於簡單請求,Function Compute支援自訂的Headers包括:Access-Control-Allow-Origin、Access-Control-Allow-Headers、和Access-Control-Max-Age。
如果您沒有自訂Headers,Function Compute的Response Headers會預設設定為Request請求中相應的欄位:
-
Access-Control-Allow-Origin:Request請求的Origin Header。 -
Access-Control-Allow-Credentials:預設取值為true。 -
Access-Control-Expose-Headers:Function Compute自訂的一些Header。
非簡單請求
非簡單請求在發送正式請求前會發送預檢請求,即一次非簡單請求包含一次OPTIONS方法的函數調用請求和一次實際的函數調用請求。正式請求的規則與上文的簡單請求相同。如果您需要自訂預檢請求的返回,則需要為HTTP觸發器添加OPTIONS方法,然後在函數代碼中處理OPTIONS請求,即設定Access-Control-Allow-*開頭的Header以控制函數的跨域行為。
對於預檢請求,Function Compute支援使用者自訂的Headers包括Access-Control-Allow-Origin、Access-Control-Allow-Headers、Access-Control-Allow-Methods和Access-Control-Max-Age。
以Node.js內建運行時為例,函數代碼中處理預檢請求的樣本如下所示:
exports.handler = (event, context,callback) => {
console.log('hello world');
const method = JSON.parse(event).requestContext.http.method;
if (method === 'OPTIONS') {
// 設定回應標頭以處理預檢請求
const fcResponse = {
'statusCode': 204,
'headers': {
'Access-Control-Allow-Origin': 'http://www.fc.com',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Max-Age':'3600'
},
'body': 'hello world'
};
callback(null, fcResponse);
} else {
callback(null, {
'statusCode': 500,
'body': 'hello world'
});
}
};
API Configured CORS
API Configured CORS 當前為邀測功能。如需開通,請聯絡我們並提供阿里雲帳號 ID(UID)。
功能說明
API Configured CORS 是Function Compute(FC)在網關層提供的能力。可在 HTTP 觸發器或自訂網域名上直接配置 CORS 策略,無需在函數代碼中編寫跨域邏輯。
核心優勢
-
代碼更簡單:跨域邏輯與業務解耦,只需關注業務實現。
-
成本更低:OPTIONS 預檢由網關直接響應,不觸發函數執行個體,節省執行時間長度費用。
-
統一管理:在觸發器或網域名稱維度配置策略,便於多服務治理。
-
響應更快:預檢結果由網關直接返回,時延更低。
適用範圍
-
API 版本:僅適用於 FC 3.0 函數(API 版本:2023-03-30)。
-
訪問方式:HTTP 觸發器(含內建測試網域名稱)或已綁定的自訂網域名。
配置方式
CORS 配置參數
|
參數名稱 |
類型 |
說明 |
預設值 |
限制/約束 |
|
allowOrigins |
Array |
允許訪問資源的來源列表(Origin)。 |
- |
最多 100 個,單個長度不超過 256 字元。支援 |
|
allowMethods |
Array |
允許的 HTTP 方法列表。 |
觸發器 methods |
不支援手動設定 |
|
allowHeaders |
Array |
允許瀏覽器發送的自訂要求標頭。 |
- |
最多 50 個。支援使用 |
|
exposeHeaders |
Array |
允許瀏覽器擷取的回應標頭欄位。 |
系統預設值 |
最多 50 個。 |
|
allowCredentials |
Boolean |
是否允許跨域請求攜帶憑證(如 Cookie)。 |
false |
為 |
|
maxAge |
Integer |
預檢請求(OPTIONS)結果的緩衝時間長度(秒)。 |
3600 |
取值範圍:0 ~ 86400。 |
allowOrigins取值:
-
萬用字元
*:允許所有來源(僅當allowCredentials為false時)。 -
萬用字元
https://*:允許所有以https://開頭的來源。 -
特定網域名稱:如
https://example.com。 -
多個網域名稱:數組形式,如
["https://example.com", "https://app.example.com"]。 -
不支援子網域名稱萬用字元(如
https://*.example.com)。
allowMethods取值:
-
標準 HTTP 方法:
GET、POST、PUT、DELETE、PATCH、HEAD。 -
萬用字元
*:表示允許所有 HTTP 方法。 -
不支援
OPTIONS:OPTIONS 方法由系統自動處理,用於預檢請求。
請求處理邏輯
配置 API Configured CORS 後,網關按請求類型處理:
1. 預檢請求(OPTIONS)
瀏覽器發起非簡單請求的預檢時,網關校正 Origin、Access-Control-Request-Method、Access-Control-Request-Headers:
-
校正通過:返回
204 No Content並注入配置的 CORS 回應標頭,不觸發函數。 -
校正失敗:
-
Origin 匹配但其他頭不匹配:網關設定基礎 CORS Header。
-
Origin 不匹配:不設定 CORS Header。
-
請求會繼續轉寄到函數執行個體。
-
2. 簡單請求(GET/POST/HEAD 等)
網關僅校正 Origin:
-
校正通過:在響應中注入
Access-Control-Allow-Origin等 Header,請求轉寄到函數執行。 -
校正失敗:不注入 CORS Header,請求仍轉寄到函數執行。
相容性與優先順序
同一路徑可能同時存在多種 CORS 處理方式,優先順序從高到低:
-
API Configured CORS:一旦配置,網關優先按此邏輯處理。
-
預設 CORS:未開啟 API Configured 時,使用內建預設跨域回顯。
-
函數內 CORS:函數返回的 Header 會與上述結果合并(追加),保證相容。
方案對比
|
特性 |
API Configured CORS(推薦) |
預設 CORS |
使用者自訂 CORS(代碼) |
|
預檢請求是否計費 |
不計費(網關攔截) |
可能計費 |
計費(觸發函數) |
|
代碼入侵性 |
無 |
無 |
高 |
|
適用 API 版本 |
僅 FC 3.0 |
所有版本 |
所有版本 |
|
配置複雜度 |
低(一次性配置) |
無需配置 |
高(需處理 OPTIONS 方法) |
常見問題 (FAQ)
Q1:為什麼我配置了 allowMethods 包含 OPTIONS,但 API 呼叫報錯?
A:根據設計,OPTIONS 方法由Function Compute網關自動管理。您無需在 corsConfig 的 allowMethods 中手動添加 OPTIONS,系統會自動處理所有預檢請求。
Q2:配置成功後,為什麼我的 OPTIONS 請求依然返回 200 而不是 240?
A:請確認您的帳號是否已由值班同學開啟“邀測許可權”。若未完全啟用攔截外掛程式,網關會降級到“預設 CORS”邏輯(返回 200 並透傳至函數)。
Q3:allowOrigins 可以配置萬用字元子網域名稱(如 *.example.com)嗎?
A:目前不支援子網域名稱模糊比對。建議在 allowOrigins 數組中枚舉所有次層網域,或使用 https://* 進行大範圍匹配。
Q4:如果我的函數代碼裡也寫了 CORS Header,會發生衝突嗎?
A:不會衝突。網關產生的 Header 與函數返回的 Header 會合并輸出。如果存在重複,瀏覽器通常會以第一個或符合規範的值為準,但這有助於確保舊有業務在平滑遷移時不中斷。