簡介: 本文將詳細介紹如何開發和部署 Serverless 應用,並通過阿里雲函數計算控制檯與開發者工具 Serverless Devs 進行應用的初始化、部署;最後分享應用的調試,通過科學發佈、可觀測性等介紹應用的部署和運維總結,進而實現從應用初始化到調試、發佈、運維基礎流程、核心步驟的探索。
本文將詳細介紹如何開發和部署 Serverless 應用,並通過阿里雲函數計算控制檯與開發者工具 Serverless Devs 進行應用的初始化、部署;最後分享應用的調試,通過科學發佈、可觀測性等介紹應用的部署和運維總結,進而實現從應用初始化到調試、發佈、運維基礎流程、核心步驟的探索。
一、如何開發、部署Serverless應用
1.通過控制檯進行函數創建
下面我們將基於Serverless架構,在 FaaS 平臺上實現 Hello world 的輸出,基本步驟可分爲:
1)註冊賬號,並登錄;
2)找到對應的FaaS產品:阿里雲的函數計算;
3)單擊“創建函數”按鈕,進行函數的創建;
4)配置函數,包括函數名稱、運行時(可以認爲是要使用的編程語言,或者要使用的編程環境等);
5)完成創建,並測試。
以阿里雲函數計算爲例,當註冊並登錄阿里雲賬號之後,需要找到函數計算產品,並單擊進入產品首頁,如圖所示:
阿里雲函數計算產品首頁
選擇左側的“服務及函數”,並進行服務的創建,如圖所示。
阿里雲函數計算創建服務頁面
然後進行函數的創建,如圖所示。
阿里雲函數計算創建函數頁面
相對於其他的雲平臺,在阿里雲函數計算平臺,我們不僅要爲即將創建的函數設置函數名稱、選擇運行時等,還需要設置該函數所在的服務。在阿里雲函數計算的體系中,引入服務的概念會帶來一定的好處:
- 相關聯的函數可以放在一個服務下進行分類,這種分類實際上比標籤分類更直觀明瞭。
- 相關聯的函數在同一個服務下共享一定的配置,例如 VPC 配置、NAS 配置,甚至某些日誌倉庫的配置等。
- 通過服務,我們可以很好地做函數環境的劃分,例如對於一個相冊項目,該項目可能存在線上環境、測試環境、開發環境,那麼可以在服務層面做區分,即可以設定album-release、album-test、album-dev三個服務,進而做環境的隔離。
- 通過服務,我們可以很好地收納函數。如果項目比較大,可能會產生很多函數,統一放在同一層級會顯得非常混亂,這時就可以通過服務進行有效的收納。
完成函數的創建之後,我們可以進行代碼的編輯。阿里雲函數計算支持從對象存儲上傳代碼,支持直接上傳代碼包,以及在線編輯。除此之外,阿里雲函數計算還支持直接上傳文件夾,如圖所示。
保存代碼之後,可以單擊“執行”按鈕進行函數的觸發、測試。
可以看到,系統已經輸出相關日誌:Hello world。至此,一個非常簡單的函數就創建成功了。
2.通過工具進行函數創建與部署
通過Serverless開發者工具入門Serverless應用開發、部署、運維是非常方便的,我們以Serverless Devs爲例介紹阿里雲函數計算應用的部署,並對工具側的函數創建、部署以及其他相關功能進行探索。
Serverless Devs 是一個開源的Serverless開發者平臺,致力於爲開發者提供強大的工具鏈。通過該平臺,開發者可以一鍵體驗多雲 Serverless 產品,極速部署 Serverless 項目。按照官方目前的描述,Serverless Devs已經支持包括AWS Lanbda、阿里雲函數計算、百度智能雲函數計算、騰訊云云函數、華爲雲函數工作流等在內的多個雲廠商的Serverless相關產品。
下面通過Serverless Devs開發者工具,以阿里雲函數計算爲例進行實踐,探索如何創建、部署Serverless應用。
1)安裝Serverless Devs開發者工具(執行npm install -g @Serverless-devs/s命令)。
2)設置阿里雲憑證信息(執行s config add --AccessKeyID AccessKeyID --AccessKeySecret AccessKeySecret --AccountID AccountID命令)。
3)建立模板項目(執行s init node.js12-http -d fc-hello-world-demo命令),初始化過程如圖所示。
通過Serverless Devs創建項目圖
4)進入項目目錄(執行cd fc-hello-world-demo命令),並部署(執行s deploy命令),部署後的結果如圖所示。
通過Serverless Devs部署項目
項目部署成功之後,可以進行更多操作,具體如下,觸發函數(執行s invoke命令),結果如圖所示。
通過Serverless Devs觸發函數
查看線上函數詳情(執行s info命令),結果如圖所示。
通過Serverless Devs查看函數詳情
Serverless Devs 還擁有比較完善的桌面客戶端。開發者可以通過桌面客戶端進行應用的創建、管理以及相關配套功能的使用,示例如下,查看應用列表,並快速創建應用,如圖所示。
通過Serverless Devs桌面客戶端查看應用列表
創建應用之後,可以進行應用的管理。下圖是Serverless Devs桌面客戶端管理應用界面。
通過Serverless Devs桌面客戶端管理應用
其他配套功能的使用如下。如圖所示爲一鍵壓測函數性能。
通過Serverless Devs桌面客戶端一鍵壓測函數性能
一鍵對函數資源進行調試,如圖所示。
通過Serverless Devs桌面客戶端一鍵對函數資源進行調試
一鍵查看函數多維度指標信息,如圖所示。
通過Serverless Devs桌面客戶端一鍵查看函數多維度指標信息
除此之外,Serverless Devs還擁有較爲方便的Yaml可視化配置功能,如下圖所示。
通過Serverless Devs桌面客戶端進行Yaml可視化配置
二、如何對Serverless應用進行調試
在應用開發過程中,或者應用開發完成後,當執行結果不符合預期時,通常要進行一定的調試。但是在Serverless架構下,調試往往會受到極大的考驗,尤其在受環境因素限制時,通常會出現這樣的情況:所開發的應用在本地可以健康、符合預期地運行,但是在FaaS平臺上則有一些不可預測的問題;或者在一些特殊環境下,本地沒有辦法模擬線上環境,難以進行應用的調試。Serverless應用的調試一直備受詬病,但是各個雲廠商並沒有因此放棄在調試方向上的深入探索,下面我們介紹幾種方式。
1.在線調試
(1)簡單調試
所謂的簡單調試,就是在控制檯進行調試。以阿里雲函數計算爲例,可以在控制檯通過“代碼執行”按鈕進行基本的調試,如下圖所示。
必要的時候也可以通過設置Event來模擬一些事件。
在線調試的好處是可以使用一些線上環境進行代碼的測試。當線上環境擁有VPC等資源時,在本地環境是很難進行調試的。
(2)斷點調試
除了簡單的在線調試之外,部分雲廠商還支持斷點調試,例如阿里雲函數計算的遠程調試。我們以阿里雲函數計算遠程調試爲例,可以實現通過控制檯進行函數的在線調試。當創建好函數之後,可以選擇遠程調試,並單擊“開啓調試”按鈕,如圖所示。
函數計算遠程調試頁面
開啓調試之後,稍等片刻,系統將會進入遠程調試界面,如圖所示。
函數計算遠程調試開始頁面當出現圖
當出現下圖所示界面,我們可以進行斷點調試。
函數計算遠程調試斷點調試頁面
2.端雲聯調
在本地進行Serverless應用開發時,往往會涉及一些線上資源,例如通過對象存儲觸發器觸發函數執行,通過VPC訪問數據庫等,此時線上和線下環境不一致會讓線下開發、調試面臨極大的挑戰。Serverless Devs開發者工具通過搭建Proxy輔助函數的方法將線上和線下資源打通,可以快速幫助開發者在本地進行應用的開發與調試,這種調試方式稱爲端雲聯調。
如下圖所示, Serverless Devs開發者工具會根據Yaml配置文件,創建輔助服務和輔助函數,並通過輔助服務和輔助函數實現線上和線下資源打通,以及完整的端雲聯調。
Serverless Devs端雲聯調原理示意圖
Serverless Devs 開發者工具會根據Yaml配置文件的內容,創建輔助服務和輔助函數(輔助服務和Yaml中所聲明的業務服務配置是一致的)。
通過觸發器(包括通過SDK、API、s proxied invoke命令,或者其他觸發器)觸發輔助函數(函數計算C),請求流量回到本地調試實例(本地環境A),這時本地調試實例(本地函數執行環境容器)收到的event和context是真實來自線上的。
本地調試實例(本地環境 A)可以直接訪問以下內容:
- VPC 內網資源,比如RDS、Kafka內網地址等;
- 一些雲服務的內網地址;
- 硬盤掛載服務(直接訪問 NAS)。
端雲聯調流程如下:
1)執行s proxied setup命令準備端雲聯調所需的輔助資源以及本地環境;
2)對於無觸發器的普通事件函數或者HTTP觸發器,準備工作完成後,啓動另一個新的終端,切換到該項目路徑下,執行s proxied invoke命令調用本地函數;
3)完成調試任務後,執行s proxied cleanup命令清理端雲聯調所需的輔助資源以及本地環境。
除了通過命令使用端雲聯調功能外,我們也可以在VSCode開發者工具中使用端雲聯調功能,如圖所示。
在VSCode中使用端雲聯調功能
3.遠程調試
端雲聯調在本地除了有一個通道服務容器外,還有一個函數計算容器,用來執行本地函數;遠程輔助函數只是單純將遠程流量發送到本地。在實際調試過程中,需要登錄到實例進行項目調試,此時可以選擇使用遠程調試。
相比於端雲聯調,遠程調試在本地只有一個通道服務容器,執行過程全部依賴線上;遠程函數將執行結果返回。遠程調試整體架構簡圖如圖所示。
除了通過上面遠程調試架構簡圖所示的通道服務登錄線上環境進行代碼調試或問題定位之外,部分雲廠商還提供了直接登錄實例進行代碼調試的功能。以Serverless Devs爲例,當使用阿里雲函數計算時,我們就可以直接通過instance命令進行線上實例登錄。
儘管實例登錄命令已經提供了便捷的登錄體驗,能幫助用戶解決複雜場景下的應用異常定位等問題,但是登錄實例後,用戶無法直接通過函數日誌、監控指標來具體定位問題,還需要藉助例如 coredump、tcpdump、jmap 等工具進行問題的深入排查。
例如,某用戶發現自己的線上程序最近出現一些函數錯誤提示,報錯內容都是連接遠程某服務時超時。該用戶懷疑是函數實例與遠端服務的網絡連接不穩定,因此想進入實例內部,分析實例與遠端服務的網絡情況。此時,我們可以按照以下步驟進行問題的排查。
1)如圖所示,登錄實例內部後,需要執行 apt-get update 和 apt-get install tcpdump 兩條命令,進行tcpdump 工具的安裝。
2)安裝完畢後,執行tcpdump 命令,對遠端服務 IP 的請求進行抓包,並將抓包結果保存在 tcpdump.cap 文件中。
3)抓包完畢後,藉助 OSS 命令行工具 ossutil64,將 tcpdump.cap 文件上傳到自己的 OSS,然後下載到本地藉助分析工具Wireshark進行分析。
4.本地調試
(1)命令行工具
大部分FaaS平臺會爲用戶提供相對完備的命令行工具,如阿里雲的Funcraft,同時也有一些開源項目如Serverless Framework、Serverless Devs等支持多雲廠商的FaaS平臺。通過命令行工具進行代碼調試的方法很簡單。以Serverless Devs爲例,本地調試阿里雲函數計算方法爲:首先確保本地擁有一個函數計算的項目,然後在項目下執行調試指令,例如在Docker中進行調試,如下面所示。
通過命令行進行本地調試
(2)編輯器插件
以VSCode插件爲例,下載好阿里雲函數計算的VSCode插件,並且配置好賬號信息之後,在本地新建函數,並且在打點之後進行斷點調試,如圖所示。
編輯器插件中進行調試
5.其他調試方案
(1)Web框架的本地調試
以Python語言Bottle框架爲例,若在阿里雲FaaS平臺開發傳統Web框架,可以增加如下代碼:
app = bottle.default_app()
並且對run()方法進行條件限制(if __name__ == '__main__'):
if __name__ == '__main__':
bottle.run(host='localhost', port=8080, debug=True)
例如:
# index.py
import bottle
@bottle.route('/hello/<name>')
def index(name):
return "Hello world"
app = bottle.default_app()
if __name__ == '__main__':
bottle.run(host='localhost', port=8080, debug=True)
和傳統開發思路一樣,我們可以在本地開發並在本地進行調試。當部署到線上時,只需要在入口方法處設置index.app,即可實現平滑的部署。
(2)本地模擬事件調試
針對非Web框架,可以在本地構建一個方法,例如要調試對象存儲觸發器,代碼如下:
import jsondef handler(event, context): print(event)def test(): event = { "events": [ { "eventName": "ObjectCreated:PutObject", "eventSource": "acs:oss", "eventTime": "2017-04-21T12:46:37.000Z", "eventVersion": "1.0", "oss": { "bucket": { "arn": "acs:oss:cn-shanghai:123456789:bucketname", "name": "testbucket",
"ownerIdentity": "123456789", "virtualBucket": "" }, "object": { "deltaSize": 122539, "eTag": "688A7BF4F233DC9C88A80BF985AB7329", "key": "image/a.jpg", "size": 122539 }, "ossSchemaVersion": "1.0", "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****" }, "region": "cn-shanghai", "requestParameters": { "sourceIPAddress": "140.205.***.***" }, "responseElements": { "requestId": "58F9FF2D3DF792092E12044C" }, "userIdentity": { "principalId": "123456789" } } ] } handler(json.dumps(event), None)if __name__ == "__main__": print(test())
這樣通過構造一個event對象,即可實現模擬事件觸發。
三、通過開發者工具進行依賴安裝和項目構建
Serverless架構下的應用開發和傳統架構下的應用開發有一個比較大的區別是二者所關注的內容維度是不同的,例如理想狀態下的前者並不需要人們關注服務器等底層資源。
但是在當今的Serverless發展階段,Serverless架構下的應用開發真的不需要人們對服務器等額外關注嗎?其實不是的,雖然Serverless架構強調的是Noserver心智,但是在實際生產中,有很多依賴等是無法跨平臺使用的,例如Python語言中的某些依賴需要進行二進制編譯,和操作系統、軟件環境等有比較大的關係,所以項目中如果引入這類依賴,需要在和函數計算平臺線上環境一致的環境中進行依賴的安裝、代碼的打包或項目的部署。
阿里雲函數計算對自身的線上函數環境有比較細緻的描述,提供了相應地文檔,例如使用C、C++ 、Go編譯的可執行文件,需要與函數計算的運行環境兼容。
函數計算的Python運行環境如下。
●Linux內核版本:Linux 4.4.24-2.al7.x86_64。
●Docker基礎鏡像:docker pull python:2.7 ; docker pull python:3.6。
但是,在實際應用開發過程中,依賴的打包依舊是讓一衆開發者頭疼的事情。他們在很多Serverless應用開發過程中都會面臨類似的挑戰:項目在本地可以正常運行,一發布到線上就找不到某個依賴,但是實際上依賴是存在的,此時問題定位就成了非常困難的事情。
目前來看,爲Serverless應用安裝依賴或者項目構建的方法通常有3種:
1)在本地創建項目之後,自行根據雲廠商提供的環境數據進行線上環境搭建,進而進行依賴的安裝。這種方法相對來說自主可控,但是難度非常大,操作較爲煩瑣。
2)用已有的開發者工具進行依賴的安裝,如圖所示:
以Serverless Devs開發者工具以及阿里雲函數計算產品爲例,開發者只需要按照語言習慣準備對應語言的相關依賴安裝文件即可,例如Python語言的requirements.txt,Node.js語言的package.json等。然後在當前項目下,執行s build --use-docker命令即可完成與阿里雲函數計算平臺線上環境一致的環境中的依賴的安裝。以Python項目爲例,開發者只需要在項目目錄下完成如下操作:
1開發源代碼;
2執行s build –use-docker命令之後,自動根據requirements.txt文件下載對應的依賴到本地,並且和源碼一起組成交付物;
3執行s deploy命令將整個交付物打包,創建函數,同時設置好依賴包的環境變量,讓函數可以直接輸入對應的代碼依賴包。
3)目前,部分雲廠商的FaaS平臺控制檯支持WebIDE,阿里雲的WebIDE擁有實現命令行程序的能力,所以也可以在控制檯的WebIDE中直接進行依賴的安裝。在線安裝依賴示意圖如圖所示:
在線安裝依賴示意圖
更多內容關注阿里雲 Serverless 微信公衆號(ID:serverlessdevs),彙集 Serverless 技術最全內容,定期舉辦 Serverless 活動、直播,用戶最佳實踐。