作者 | 阿裡雲 Serverless 技術研發 落語
背景
阿裡雲函數計算産品能力,支援使用者使用 HTTP 協定進行函數調用。函數計算後端通過一個共享的 APIServer 元件對所有客戶提供響應 HTTP 觸發器調用的服務,需要依賴 URL 中的 Path 将客戶流量路由到客戶的函數容器内部。容器内收到的 HTTP 請求 Path 會帶有函數計算的路由辨別,如果客戶在函數計算部署 REST 風格的應用,那麼就會遇見 404 問題。

在一開始,函數計算并不是為客戶運作中小型規模應用而設計的。函數計算提供了原生的 REST 架構,将每個函數視為一個獨立的資源,通常一個函數隻負責一小塊功能,也就是一個 API。如果一個函數隻對應一個 API,那麼在函數代碼中也不必去實作一套路由邏輯去響應不同 URL Path 路徑的請求了。
函數計算在近兩年引入了Custom Runtime類型的函數,客戶可以直接在函數計算上運作自己存量的應用,而不必按照函數計算推薦的架構去拆分自己的應用。客戶以及社群内比較成熟的項目的開發習慣是采用MVC等架構,在一個程式中開發大量的REST API,在程序内按照封包中的HTTP Path進行路由,将不同路徑的請求“轉發”至不同的方法或函數進行處理。
在這樣的背景下,客戶可以在函數計算運作存量的 REST 應用,但應用無法正常對外提供服務。客戶花費大量的精力對存量的應用進行改造,而且這個改造僅僅在函數計算是必須的,是一種典型的平台攜裹使用者的産品設計。
使用 fcapp.run調用函數
為了解決上述的問題,并相容存量的函數以及客戶習慣,函數計算為每個新建立的 HTTP 觸發器配置設定了一個獨立的域名,例如
{random-string}.cn-shanghai.fcapp.run
。使用該域名通路函數計算,函數計算會按照域名進行路由,将流量轉發至函數容器内,避免對客戶代碼造成侵入性。
使用 fcapp-test.run 進行本地網頁測試
由于中國大陸政策的影響,函數計算主域名無法在網際網路為客戶提供網站類型的業務,所有的函數請求結果将被轉為下載下傳行為。對于純 API 類型的函數,我們認為将請求結果轉為下載下傳是沒有影響的。但對于網站屬性的函數,傳回的 HTML 文本以及 JavaScript 代碼強依賴浏覽器的解釋器才能正常展示。我們判斷讓開發者能夠實時看到函數傳回的頁面是一個強訴求。
在生産場景,我們推薦客戶為函數綁定已備案的域名來解決這個問題,而在測試環境有更加簡潔的方案。在測試階段可以臨時通過測試域名fcapp-test.run以及添加本地的host解析繞過這個問題,請求結果将不會被轉為下載下傳行為,可以正常進行網頁調試。
# 1. 從頁面擷取fcapp.run的域名
FC_DOMAIN='wordpress-xxxxx-serverlordpress-ydziwvakfn.cn-shenzhen.fcapp.run'
FC_TEST_DOMAIN=`echo ${FC_DOMAIN} | sed 's/fcapp.run/fcapp-test.run/g'`
echo "FC域名: ${FC_DOMAIN}"
echo "FC測試域名: ${FC_TEST_DOMAIN}"
# 2. 查詢域名解析的IP
FC_IP=`ping ${FC_DOMAIN} -c 1 | HEAD -1 | awk '{print $3}' | sed 's/[():]//g'`
echo "FC IP: ${FC_IP}"
# 3. 修改host檔案,将測試域名的本地解析指向fcapp.run的解析
# 如果沒有權限需要手動加
sudo -- sh -c "printf '\n${FC_IP} ${FC_TEST_DOMAIN}\n' >> /etc/hosts"
cat /etc/hosts
# 4. 使用測試域名在浏覽器通路函數
curl -v "${FC_TEST_DOMAIN}"
了解 TCP 協定以及HTTP協定的同學可以很容易地了解背後的技術細節。用戶端在發起HTTP請求時,首先會通過域名解析查詢到域名對應的IP位址,并發起TCP連接配接。接下來會通過建立的TCP連接配接,将HTTP Request封包發送至Server端。如果用戶端直接向函數計算的Server發起TCP連接配接,并将可以與函數關聯的域名發送至函數計算,那麼函數計算就可以傳回客戶期望的内容。
函數計算在後端進行了處理,相容了fcapp-test.run域名的通路,但并不提供權威DNS解析。客戶隻需要在本地進行Host配置或者使用自建的DNS伺服器,将fcapp-test.run的域名解析至函數計算Server,就能夠正常測試函數。該方案既滿足了中國大陸法律法規的要求,又以極低的成本滿足了客戶調試頁面的需求,極大地優化了客戶在函數計算的研發體驗。
使用函數計算運作 wordpress 官方鏡像
通過以上的方案,函數計算支援客戶在不修改任何業務代碼的前提下遷移自己的REST應用。下面使用wordpress官方鏡像進行說明。
前置條件
- 開通函數計算賬号。
- 将 wordpress 鏡像轉存到阿裡雲容器鏡像服務中。
- 建立或使用已有的 mysql 執行個體,并為wordpress服務初始化相應的賬号以及資料庫。如果使用阿裡雲RDS執行個體,請確定函數服務的VPC配置與RDS執行個體的VPC配置一緻,且白名單配置正确。
建立相應的函數以及服務
使用wordpress官方鏡像建立函數,并設定容器内監聽端口為80。
注入資料庫配置
修改函數配置,将mysql的資料庫配置以環境變量的方式注入函數容器内。
無需備案,測試wordpress函數功能
檢視建立的觸發器配置設定的域名,按照上述文檔配置,使用fcapp-test.run域名進行測試。