函数计算的开发与配置
作者 | 夏莞 阿里云函數(shù)計算開發(fā)工程師
導讀: 在本篇文章中“基本概念”部分主要對函數(shù)計算最核心的概念進行詳細介紹,包括服務、函數(shù)、觸發(fā)器、版本、別名以及相關(guān)的配置;“開發(fā)流程”部分介紹了基于函數(shù)計算開發(fā)的完整開發(fā)部署流程。
基本概念
1. 服務
服務是函數(shù)計算資源管理的單位,同一個服務下有很多函數(shù),這些函數(shù)共享服務的網(wǎng)絡配置、權(quán)限配置、存儲配置、日志配置。
服務可以對應成一個“應用”,這個應用由很多函數(shù)共同組成,這些函數(shù)具有相同的訪問權(quán)限、網(wǎng)絡配置,日志也記錄到相同的 logstore。這些函數(shù)本身的配置可以各不相同,比如同一服務下有的函數(shù)內(nèi)存是3G,有的函數(shù)內(nèi)存是 512M,有些函數(shù)用 Python 寫,有些函數(shù)用 Node.js 寫。
當然,如果應用比較復雜,同一個應用也可以對應多個服務,這里沒有強綁定關(guān)系。
1)服務配置
接下來我們介紹服務的幾個核心配置:
日志配置: 開發(fā)者的代碼在函數(shù)計算平臺運行,如何查看函數(shù)運行產(chǎn)生的日志呢?在Server 化的開發(fā)方式中,日志都打到統(tǒng)一的文件中,通過 Logstash/Fluentd 這種日志收集工具收集到 ElasticSearch 中,并通過 Kibana 這種可視化工具查看日志及指標。但是在函數(shù)計算中,運行代碼的機器由函數(shù)計算動態(tài)分配,開發(fā)者無法自己收集日志,函數(shù)計算需要幫助開發(fā)者投遞日志。日志配置就是起到這個作用,配置 LogConfig 設置日志服務的 Project 和 Logstore,函數(shù)計算會將函數(shù)運行中產(chǎn)生的日志投遞到開發(fā)者的 Logstore 里。
但是為了成功投遞日志,單單配置 Logtore 還不夠,函數(shù)計算是沒有權(quán)限向開發(fā)者的 Logstore 投遞日志的,需要用戶授予函數(shù)計算向指定的 Logstore 寫數(shù)據(jù)的權(quán)限,有了這個授權(quán)后,函數(shù)計算就可以名正言順地向開發(fā)者的 Logstore 投遞日志了。
文件存儲配置: 函數(shù)計算中每個函數(shù)都是獨立的,在不同的執(zhí)行環(huán)境中執(zhí)行,如果用戶有一些公共文件希望多個函數(shù)共享怎么辦呢?在傳統(tǒng) Server 化的開發(fā)方式中,好辦,將公共文件放到磁盤就好了,各個都去磁盤的同一位置讀取,函數(shù)計算中的機器是函數(shù)計算動態(tài)分配的,開發(fā)者無法事先將文件存入磁盤,那怎么辦呢?可以掛載 NAS,在服務中掛載 NAS 后,函數(shù)就可以像訪問本地文件系統(tǒng)一樣訪問 NAS 上的文件了。
網(wǎng)絡配置: 網(wǎng)絡配置顧名思義就是設置函數(shù)的網(wǎng)絡訪問能力,主要有兩種,一個是函數(shù)中是否可以訪問公網(wǎng),這是個布爾型的開關(guān),默認是開啟的,如果不需要訪問公網(wǎng)可以關(guān)閉開關(guān)。另一個是函數(shù)是否可以訪問指定 VPC,VPC 是專有網(wǎng)絡,專有網(wǎng)絡內(nèi)的數(shù)據(jù)比較機密,是不能通過公共互聯(lián)網(wǎng)訪問的。如果需要函數(shù)訪問 VPC 內(nèi)的資源,比如函數(shù)需要訪問 VPC 內(nèi)的 RDS,那就需要授予函數(shù)計算訪問指定 VPC 的能力,原理是用戶授權(quán)賦予彈性網(wǎng)卡 ENI 訪問 VPC ,并將此 ENI 插入到 FC 中執(zhí)行用戶函數(shù)的機器上,從而使函數(shù)可以訪問 VPC 內(nèi)資源。
權(quán)限: 函數(shù)計算是云原生的架構(gòu),與云上許多服務產(chǎn)生交互,阿里云有非常嚴格的權(quán)限限制,函數(shù)計算是沒有能力訪問開發(fā)者的其他云資源的,當開發(fā)者需要函數(shù)計算訪問其他云服務的時候就需要顯示授予函數(shù)計算權(quán)限。
權(quán)限主要有兩個應用場景:一個是授予函數(shù)計算訪問其他服務的權(quán)限,比如剛才提到的授權(quán)函數(shù)計算訪問開發(fā)者的日志服務、授權(quán)函數(shù)計算創(chuàng)建 ENI。另一個是授權(quán)函數(shù)可以訪問開發(fā)者的云資源,這個是什么呢?舉個例子,函數(shù)中需要訪問 OSS 獲取對象,但是又不想暴露 AK,那怎么辦呢?開發(fā)者可以配置服務中的 Role 有訪問 OSS 的權(quán)限,函數(shù)執(zhí)行過程中,函數(shù)計算會 assumeRole 生成一個臨時 AK ,并將這個 AK 存儲到函數(shù)的上下文 context.credentials 里,開發(fā)者在代碼中使用context.credentials.access_key_id``/``context.credentials.access_key_secret``/``context.credentials``.``security_token`` 去創(chuàng)建 OSS Client 就可以了。
2. 函數(shù)
“函數(shù)計算”中函數(shù)可謂是核心概念,函數(shù)是管理、運行的基本單元,一個函數(shù)通常由一系列配置與可運行代碼包組成。
1)函數(shù)配置
函數(shù)的配置如上圖所示:
- Runtime 是函數(shù)運行時的環(huán)境類型: 函數(shù)計算目前支持 Node.js/Python/Java/C#/PHP 等開發(fā)環(huán)境,同時也支持 Custom Runtime 自定義運行時;
- Code 是函數(shù)代碼包: 函數(shù)計算的后端是只認代碼包的,各個開發(fā)工具會自動幫您打包。比如您可以直接在控制臺上編寫代碼,控制臺會自動為您打包創(chuàng)建/更新函數(shù),您可以在本地編寫/調(diào)試函數(shù),通過命令行工具 Funcraft 部署到函數(shù)計算,Funcraft 也會幫您打包;
- Handler 是入口函數(shù): 您在代碼包中寫了好多函數(shù),那函數(shù)計算到底從哪里開始執(zhí)行呢,就從您指定的入口函數(shù)開始執(zhí)行;
- Timeout 是函數(shù)超時時間: 如果函數(shù)執(zhí)行超過這個時間,函數(shù)會被強制停止執(zhí)行;
- MemorySize 是為函數(shù)分配的執(zhí)行環(huán)境內(nèi)存: 目前取值范圍是 128M~3G,如果函數(shù)耗用內(nèi)存超過分配的內(nèi)存,會 OOM;
- Initializer 是初始化函數(shù): 有什么用呢?之前我們介紹函數(shù)計算執(zhí)行環(huán)境的時候講到,函數(shù)計算會為函數(shù)分配執(zhí)行環(huán)境,第一次分配的時候會有冷啟動,當前請求執(zhí)行完成后,函數(shù)計算也不會立即釋放,如果在一段時間內(nèi)有新的請求到達會復用這個執(zhí)行環(huán)境。Initializer 中的邏輯會在分配執(zhí)行環(huán)境后執(zhí)行,且保證同一個執(zhí)行環(huán)境執(zhí)行且只執(zhí)行一次,那就可以將一些建立連接、加載依賴等耗時的操作放到 Initializer 函數(shù)中執(zhí)行;
- InitializerTimeout 就是 Initializer 函數(shù)的最大運行時間。
3. 觸發(fā)器
往期課程中介紹了函數(shù)計算支持的豐富的事件源類型,在事件驅(qū)動的計算模型中,事件源是事件的生產(chǎn)者,函數(shù)是事件的處理者,觸發(fā)器提供了一種集中、統(tǒng)一的方式來管理不同的事件源。當事件發(fā)生時,如果滿足觸發(fā)器定義的規(guī)則,事件源會自動調(diào)用觸發(fā)器所對應的函數(shù)。
典型的使用場景包括對上傳至 OSS 中的對象進行處理,比如圖像處理、音視頻轉(zhuǎn)碼、OSS zip 包解壓,以及對 SLS 中的日志進行清洗、處理、轉(zhuǎn)存,在指定時間觸發(fā)函數(shù)執(zhí)行等等。
4. 版本&別名
上文介紹了服務、函數(shù)、觸發(fā)器,開發(fā)者就可以基于函數(shù)計算將應用搭建起來了,但又有一個新問題:開發(fā)者有了新需求需要更新代碼,如何保證線上應用不受影響,平滑迭代上線呢? 為了解決這個問題,函數(shù)計算引入了版本和別名。
版本相當于服務的快照,包括服務的配置、服務內(nèi)的函數(shù)代碼及函數(shù)配置。當您開發(fā)和測試完成后,就發(fā)布一個版本,版本單調(diào)遞增,版本發(fā)布后,已發(fā)布的版本不能更改,您可以繼續(xù)在 Latest 版本上開發(fā)測試,不會影響已發(fā)布的版本。調(diào)用函數(shù)時,只需要指定版本就可以調(diào)用指定版本的函數(shù)。
那新問題又來了,版本名稱是函數(shù)計算指定的單調(diào)遞增的,每次發(fā)布版本,都會有一個新的版本,那每次發(fā)完版本后,客戶端還要改代碼執(zhí)行最新的版本嗎? 為了解決這個問題呢,我們引入了別名,別名就是指向特定服務版本的指針,發(fā)布后,只需要將別名指向發(fā)布的版本,再次發(fā)布后,再切換別名指向最新的版本,客戶端只需要指定別名就可以保證調(diào)用線上最新的代碼。同時別名支持灰度發(fā)布的功能,即有 10% 的流量指向最新版本,90% 理論指向老版本。回滾也非常簡單,只需要將別名指向之前的版本即可快速完成回滾。
開發(fā)流程
如上圖所示,開發(fā)者首先創(chuàng)建服務,設置日志、權(quán)限等配置,然后創(chuàng)建函數(shù),在當前版本(Latest 版本)下編寫代碼開發(fā)函數(shù),測試通過后發(fā)布版本,第一次發(fā)布的版本為版本 1,創(chuàng)建別名 prod 指向版本 1,就可以對外提供服務了。
客戶端調(diào)用函數(shù)的日志會記錄在開發(fā)者配置的 Logstore 里,函數(shù)計算提供完備的監(jiān)控圖表,應用上線后,開發(fā)者可以通過監(jiān)控圖表和日志查看應用的健康狀況。
當開發(fā)者有新需求時,繼續(xù)在 Latest 版本更改代碼開發(fā)函數(shù),測試通過后發(fā)布版本,這次發(fā)布的版本為版本 2,切換別名流量 10% 到版本 2,即可實現(xiàn)應用的灰度發(fā)布,觀察一段時間沒有問題,就可以切換 100% 的流量到版本 2 了。
總結(jié)
以上是生活随笔為你收集整理的函数计算的开发与配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Serverless 技术选型
- 下一篇: 函数粘合云服务提供端到端解决方案