第237期 / July 5, 2017

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

淺談Serverless architecture 與 AWS LAMBDA

作者/陳峰漳

[發表日期:2017/7/5]

前言

隨著AWS的各線服務都開始支持lambda,serverless architecture便漸漸成為一個火熱的話題。lambda是amzon推出的一個受控的運行環境,起初僅僅支持nodejs(之後添加了java/python的支持)。你可以寫一段nodejs的代碼,為其創建一個lambda資源,這樣,當指定的事件來臨的時候,aws的運行時會創建你的運行環境,執行你的代碼,執行完畢(或者timeout)後,回收一切資源。這看起來並不稀罕,整個運行環境還受到很多限制,比如目前aws為lambda提供了哪些事件支持,你就能用哪些事件,同時你的代碼無法超過timeout指定的時間執行(目前最大是5min),內存使用最多也就是1.5G。那麼問題來了,這樣一個看起來似乎有那麼點雞肋的服務,為什麼還受到如此熱捧?原因就在於無比低廉的價格(每百萬次請求0.2美元 + 每百萬GB秒運行時間16.67美元),毋須操心infrastructure,以及近乎無限擴容的能力。


《圖一》


Serverless Architecture 歷史演進

這場去伺服器的革命濫觴於2001年伺服器虛擬化,在VMware的虛擬化技術問世之後,幫助企業整併了許多x86伺服器,於是資料中心的軟體伺服器-虛擬機器,開始大幅增多,而實體伺服器則逐漸減少。

虛擬化興起的5年後,開始吹起雲端運算的風潮。全球最大的電商Amazon成立雲端服務公司AWS(Amazon Web Services),開始提供IaaS(Infrastructure as a Service)公眾雲端運算服務,從賣書進一步賣運算,讓企業可以在雲端運行虛擬機器。於是企業開始嘗試把虛擬機器搬上雲端,而且有些企業甚至再也不想為實體伺服器花費任何心思,如Dropbox這樣的網路儲存服務公司,在草創期就打著沒有任何一臺硬體伺服器的口號,其IT架構完全藉助AWS的雲端服務。

接著Docker容器(Container)技術於2013年誕生,由於容器技術是作業系統層級的虛擬化技術,每個容器不須附帶作業系統,因此比虛擬機器來得精簡,容器的啟動速度也由虛擬機器的分鐘等級一下子提升至秒級,立刻獲得許多人的青睞。

在容器技術問世後,公眾雲服務廠商也立刻跟進推出容器雲端服務(Container as a Service)。然而不論是虛擬機器或是容器的雲端服務,對使用者而言只是去除了實體伺服器的包袱,事實上還存在著軟體伺服器的部署與維運,使用者仍然必須管理虛擬機器或容器的部署、調度、管理與資安。

對開發者而言,能夠完全不必理會任何伺服器絕對是最完美的。然而,有可能完全不必部署伺服器、不必管理系統、不必在意作業系統版本,甚至不須處理作業系統的更新等資安問題嗎?一個直接稱為無伺服器(Serverless)的運算架構,正在掀起一場新革命。

Serverless 新革命 AWS Lambda

AWS在2014年推出的Lambda無伺服器運算服務,率先吹響無伺服運算革命的號角。這個新型態雲端運算服務訴求使用者不須部署與管理伺服器,只要將程式碼上傳至AWS Lambda服務即可,AWS會馬上調派AWS EC2運算服務,建立Lambda程式的執行環境,程式碼立即可以運作。


《圖二》


AWS Lambda的執行程式稱為Lambda Function(Lambda函數),開發者可以使用Java、Node.JS、Python等程式語言撰寫各種功能的Lambda函數,只是因為AWS Lambda的背後其實是一個微服務(Microservices)架構的運算環境,Lambda執行程式必須是無組態(Stateless)的事件驅動型程式。

當開發者將Lambda函數上傳後,AWS會自動建立執行環境,並負責所有系統維運工作,例如負載平衡、系統備援及高可用性等等,包括在負載量變大時自動擴張系統,負載量減少時縮小系統規模。因此,無伺服器運算架構最大的好處之一,就是開發者可以完全不管系統維運,只要將全部的心力放在撰寫業務邏輯的程式碼。

AWS Lambda的另一個好處在於提供事件驅動型服務架構。Lambda函數是基於事件觸發條件而啟動,可由HTTP、API呼叫、AWS或第三方服務來啟動。開發者只要在Lambda函數設定好事件驅動條件、程式執行政策,就能整合串接多種微服務,快速打造一套應用程式。


《圖三》


支援的服務

目前AWS旗下的諸多服務皆支援Lambda,如資料儲存服務S3、資料庫服務DynamoDB、資料串流服務Kinesis、身分驗證服務Cognito、電子郵件服務Amazon SES、推送通知服務Amazon SNS、API管理平臺Amazon API Gateway、物聯網平臺AWS IoT、監控服務CloudWatch、日誌服務CloudTrail等等,這些服務皆可透過事件觸發而串接起來。若無現成的服務可用,開發者亦可自己撰寫Lambda函數,與其他微服務整合起來。

由Lambda程式架構可知,無伺服器運算架構適合執行事件驅動型應用,而其微服務架構亦有助於系統彈性擴充。同時,無伺服器並非不需要伺服器,而是從使用者的觀點來看,開發者只要撰寫程式碼即可,無需理會伺服器的部署與維運,可以完全感覺不到伺服器的存在。雲端運算架構發展至此,可說是距離運算資源如水電的願景非常近了。

無伺服器運算服務亦稱為Function as a Service,其架構的特性也帶來全新的計價方式,不論是計價的時間,或是價格的算法,都與一般雲端虛擬機器運算服務的計費截然不同。

計價方式

無伺服器運算服務的計價方式比起其他任何雲端服務更為精準,其價格是依照程式實際執行的時間來計算,一旦程式啟動就開始計價,程式停止運作則不計價。例如上述的圖片轉檔需求,使用無伺服器運算服務的費用,就依照Lambda函數的運算時間與被請求的次數來計價。當網站的使用者上傳了圖片,S3發現檔案新增事件,則會啟動圖片轉檔函數,也就開始計費,待轉檔完成又停止計價。所以,使用者上傳圖片數量多,就要付出較高的價格,一旦使用量減少,費用也相對降低。相較於一般採用雲端虛擬機器的情況,你必須租用一臺EC2主機,才能執行圖片轉檔程式,而且即使圖片轉檔需求量很低,仍然得支付一臺虛擬機器的租用費。

因為架構上的不同,Lambda服務的產品方案與EC2有很大的差異。EC2虛擬機器的產品方案是依照處理器、記憶體的規格畫分不同等級服務,Lambda則是依照分配給函數的記憶體容量大小來畫分服務等級,從最小的128MB至最大1536MB,記憶體容量大小會決定Lambda函數執行的速度,以及執行完成所需要的時間。

Lambda的價格是以每100毫秒為單位計算,例如128MB等級的定價是每100毫秒收費0.000000208美元,而整體費用則包含每月的總運算量(運算次數乘上執行時間)與請求量(運算次數乘上0.2美元)來計算。若Lambda函數有整合AWS其他服務,其使用量依照該服務的標準計價。

由於Lambda的計費模式是呈指數型,價格非常容易預測。當程式使用量很低的時候,價格相對低廉。然而採用EC2,則有運算量閒置浪費的問題,即便程式使用量很低,仍要支付最低等級服務的費用,相較起來就貴了不少。

此外,AWS還提供Lambda免費方案,每個月有1百萬個請求及每月400,000 GB-秒的免費運算時間,再加上無須維運管理、高度彈性與快速部署上線的特色,對開發人員充滿吸引力。

以Serverless 開發企業應用

最近一年,開始有些網路公司直接在Lambda環境開發整套應用程式,像是開發電商平臺的Shopify公司,基於自身使用電子郵件行銷的需求大增,想要自行開發郵件行銷服務,最後選擇採用無伺服器運算架構,在Lambda上開發整個後端系統,以超過70個Lambda函數打造出MoonMail電子郵件行銷服務。


《圖四》


有些企業則開始局部嘗試無伺服器運算架構。可口可樂北美集團利用開發飲料自動販賣機的會員忠誠行銷計畫的機會,導入無伺服器運算架構。他們的目標是提供消費者在自動販賣機使用會員卡、信用卡或行動支付購買飲料,並且結合會員活動以促進銷售,在消費者購買後,將消費資訊、會員卡餘額等資訊傳送給消費者。

其應用流程是消費者以會員卡或信用卡購買飲料後,交易資料會從自動販賣機傳到支付閘道,支付閘道接著透過REST API呼叫Amazon API閘道,API閘道接著將訊息傳送到AWS Lambda去執行,處理所有的交易業務邏輯,接著再將消費資訊更新到Apple Pay或是Android Pay,消費者就能獲得購物資訊。整個流程所需要的時間不到1秒鐘,而AWS目前的收費只要千分之一美分,單就一次交易而言非常便宜。


《圖五》


其他如金融業的Capital One公司,以無伺服器架構開發AWS雲端服務使用管理平臺,並且將程式碼開源;而美國百貨公司Nordstrom,則將網路商店的搜尋功能全部以無伺服器運算架構開發。

然而,無伺服器運算架構並非萬能,如前所述,此一運算架構屬於微服務架構的類型,因此應用程式必須符合微服務架構,也就是無組態,才能快速擴張。不過,即便目前仍有這個限制,無伺服器運算架構仍然適合許多類型的應用程式,例如網站、行動App、Chatbot、ETL、資訊處理、基礎架構管理、IT自動化維運等等應用。而關於無組態的限制,亦是目前許多研發人員正在克服的問題。

Serverless 未來展望

在AWS Lambda問世之後,經過了一年多的醞釀, Serverless逐漸獲得開發者的青睞,而其他雲端運算廠商也逐漸意識到,無伺服器運算架構可能成為未來運算架構的潮流,諸如Google、微軟、IBM等知名雲端服務廠商,陸續加入Serverless的行列。

微軟在2016年2月宣布推出Azure Function,Google則推出Cloud Function測試版,而IBM則不僅在BlueMix雲端服務平臺推出OpenWhisk無伺服器運算服務,還將OpenWhisk開源,讓企業可以自建無伺服器運算架構。目前OpenWhisk已被Apache軟體基金會納入育成專案。

一時之間,Serverless這種強調使用者不須管理伺服器的新型態雲端運算服務,成為兵家必爭之地,雲端廠商競相角逐的新市場。而領先眾人將近兩年的AWS,近來更將Serverless推向大家都想像不到的境界。

參考資料

1.AWS Lambda大躍進的真義:Part 1

2.AWS Lambda大躍進的真義:Part 2 Serverless已成雲端服務兵家必爭之地

3.談談AWS Lambda和serverless architecture

4.研究Amazon AWS Lambda: (一)Overview