爲什麼是無服務器計算?第一手AWS lambda測試報告!

摘要:第一手的一步一步的,帶你體驗亞馬遜“函數即服務(function as aservice)”平臺。

爲什麼是無服務器計算?第一手AWS lambda測試報告!

爲什麼一名開發者應該使用AWS Lambda?簡單一句話的說,AWS Lambda-是另外一種事件驅動方式,“function-as-a-service”就像Microsoft Azure 的函數計算、谷歌雲的函數計算、IBM 的OpenWhisk-simolify,實現了開發工作的任何事情從代碼和底層的堆棧的分離。開發者寫一個功能來響應特定的事件(例如一項表單提交、創建一個網絡鏈接、給數據庫添加一行),上傳這些代碼,只有代碼運行的時候才付費。

在“無服務器計算如何改變應用發展”一文中,我指出function-as-a-service(FaaS)如何運行及如何啓用無服務器軟件架構的具體要點。今天我們進一步親自動手在AWS Lambda上創建一個簡單的函數,然後討論一些常見的讓這項技術更強大的設計模式。

在2014年的AWSre:Invent大會上第一次宣佈了最早的FaaS運行態,即AWSLambda。重新修改圖片大小然後上傳到亞馬遜S3,是最常見用於解釋事件驅動的示例,計算即服務平臺的仍然保留了這個例子,如下圖:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

一個圖片被上傳到一個S3桶中,觸發一個執行Lambda函數的事件。在事件被觸發之前,函數以文件的形式保存到硬盤上,在工作任務下達之前沒有CPU資源的使用(或者預留)。一旦觸發,函數進入Lambda運行時並且傳遞有關事件的信息。在這個例子中,函數從S3中讀取圖片文件到內存中並且創建各種尺寸的縮略圖,然後寫入到第二個S3桶。

讓我們走進一點看看,我們不必麻煩到具體實現修改圖片尺寸的代碼,但是,我們將創建實現這個示例所需的Lambda代碼的框架,以實現這個示例,創建觸發器,然後測試代碼。我們還將深入瞭解CloudWatch日誌,以調試我遇到的一個小權限問題。

創建一個AWS lambda 函數和觸發器

創建一個AWS lambda 函數有許多方式,包括使用像Eclipse這樣的IDE工具,或者像無服務器框架這樣的工具,但是最容易的起步方式是使用AWS提供的藍圖(譯者注:英文原文爲blueprint,本意爲藍圖,亞馬遜這裏應該類似產品的代號,在這裏還是翻譯爲藍圖)。如果我們到AWS Lambda的控制檯,然後點擊創建新函數,我們將得如下圖的界面:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

我們將使用Node.js創建一個響應S3事件的函數,我們從運行菜單選擇Node.js 6.10,並且進入過濾器對話框:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

在藍圖上單擊s3 -get-object,然後我們進入到配置觸發器頁面:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

在這裏,我們設置將用於生成事件的桶t(infoworld.d .walkthrough),並設置事件類型,以在該桶中創建新對象時觸發。我們可以進一步過濾事件,只有當對象名稱中的某些前綴或後綴出現時纔會觸發,但是我們會跳過它,然後點擊複選框,在按下Next按鈕之前啓動觸發器。

下一步將創建基於藍圖的函數的框架:

我們給我們的函數命名爲infoworldWalkthrough。儘管我們稍後會更仔細地查看代碼,但你可以看到它自動檢索引起觸發器的對象的信息。

在同樣的配置頁面下,我們需要做一些權限設置:

每個函數都必須有一個IAM角色,這樣我們就可以控制它對AWS資源的使用。在這裏,我們要求系統創建一個名爲infoworldRole的新角色,並將這個角色設置爲S3的只讀權限。如果我們要實現完整的規範示例並生成縮略圖,我們還需要添加S3寫權限。但是,因爲我們只會讀取觸發的S3對象的信息,所以只讀權限應該是足夠的。

最後,我們需要注意一些高級設置:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

最重要的項目是在頂部的部分,我們設置了內存的數量和執行超時。請記住,Lambda運行時使用的是容器,這些容器預裝了不同的語言運行時。當事件觸發時,它將把我們的代碼加載到其中一個容器中並執行我們的函數。內存和超時設置決定了容器的大小,以及我們的函數必須執行多少時間。就我們的目的而言,128MB和3秒的默認值將會很好。對於其他用例,這些設置通常被更改。按下Next我們到一屏,我們可以回顧我們已經輸入的所有設置:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

按下Create Function按鈕,將保存我們的輸入並在AWS Lambda中創建我們的函數。

檢查我們的AWS Lambda代碼

下面是藍圖爲我們創建的默認代碼:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

在第14行和第15行,Lambda函數提取了bucket的名稱和引發觸發器的對象名稱(也稱爲鍵)。然後它使用S3 API獲取關於該對象的更多信息,並(如果順利的話)輸出其內容類型。我們還沒有這樣做,但是我們可以很容易地包含代碼,然後在對象中讀取,並相應地生成縮略圖。

測試我們的AWS Lambda代碼

現在讓我們到S3控制檯中,觀察下桶的問題,在這個例子中,開始完全是空的:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

然後上傳一張PNG的圖片到這個桶:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

然後……到底是什麼?

從S3控制檯上,不清楚我們的函數是否執行了,如果你進入Lambda控制檯,你將會發現類似的信息缺乏。然而,每個Lambda函數都通過CloudWatch記錄信息,因此如果我們檢查CloudWatch,我們就會看到我們現在有了一個新的日誌組:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

檢查這個日誌顯示對S3 bucket的訪問被拒絕:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

出於某種神祕的原因,當我們的代碼試圖讀取關於S3對象的信息時,它被拒絕訪問該數據。但是爲什麼呢?我們是否設置了IAM角色,以便我們的函數在S3存儲桶上具有隻讀權限?讓我們在IAM控制檯進行雙重檢查:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

是的,事實上這個角色有一個策略。讓我們來看看這個策略:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

奇怪的是,我們有在CloudWatch中創建日誌的權限,但是在任何地方都沒有提到S3。不知何故,我們的S3只讀permissons策略沒有接受。讓我們解決這個問題。

如果我們按下附加策略按鈕,我們將看到下面這個屏幕:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

通過選擇AmazonS3FullAccess選項並按下附加策略按鈕,我們應該提供所需的所有權限。

這次我們將使用內置的測試鉤子,而不是像以前那樣手動地將PNG文件添加到S3 bucket中來測試函數。回到主頁,我們的函數:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

現在,如果我們按下測試按鈕,我們將會得到一個對話框,讓我們從許多例事件中進行選擇。我們想測試S3 put。我們需要在S3 key和bucketname字段中編輯值,以對應我們的圖像文件和bucket的名稱:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

在這裏可以設置的事件中有各種其他字段,但是因爲我們知道代碼只查看鍵和桶名,所以我們可以忽略其餘部分。按下保存和測試按鈕將觸發事件並導致我們的函數執行。不像上次,當我們通過S3控制檯觸發事件時,這次我們看到了實時反饋。我們還得到了CloudWatch日誌的相關部分,在Lambda UI中:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

您可以看到我們的代碼執行並確定了內容類型。

使用IDE集成工具和命令行工具Serverless框架可以大幅加速這個過程,但是這個例子已經展示了創建具有正確權限的函數所涉及的基本步驟,搭建事件,通過監測和調試代碼,以及兩種不同的方式觸發事件的函數進行測試。

讓我們總結一下一些常見的Lambda設計模式。

AWS Lambda設計模式

已經出現了許多用於服務器應用架構的設計模式。在12月的AWS re:Invent大會上,一個名爲“無服務器架構模式和最佳實踐”的會議強調了四個這樣的模式。在這裏,我將介紹我的兩個最喜歡的內容,因爲它們代表任何想要開始使用無服務器架構的組織的甜蜜果實。

首先,很容易構建web應用程序,使用S3和CloudFront用於構建靜態內容,並使用Lambda和DynamoDB支持的API網關以滿足動態需求:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

這種基本模式可以與多個級別的安全緊密聯繫在一起:

爲什麼是無服務器計算?第一手AWS lambda測試報告!

對於所有的用戶來說,web應用程序的大部分內容都是隻讀的,並且這種模型可以從S3和CloudWatch中得到很便宜的服務。被授權的數據可以利用IAM鉤子進入API網關,以及IAM角色,以單獨的Lambda函數與一個DynamoDB交互。

我的第二個最喜歡的用例,一個由CapitalOne實現的雲託管項目,即使用Lambda建立自動化掛鉤。在CapitalOne的實現中,CloudWatch日誌事件觸發Lambda函數對特定於Capital One的遵從性和策略規則進行檢查。當發現潛在問題時,該函數會通過Amazon SNS生成通知,可以將其配置爲發送SMS消息、電子郵件和其他一些機制,以提醒正確的人注意那些需要注意的違反政策的行爲。

爲什麼是無服務器計算?第一手AWS lambda測試報告!

我喜歡這種自動化模式,因爲它爲現有過程增加了巨大的價值,而不會以任何方式干擾這個過程。系統的遵從性是自動化的,不涉及被監視的系統。和之前的模式一樣,它爲組織提供了一種簡單的方法,讓企業能夠輕鬆使用無服務器計算。

服務之外的思考

正如我們所看到的,即使沒有IDE或命令行工具,搭建Lambda函數、配置事件、應用安全策略以及測試出結果是小菜一碟,微軟、谷歌和IBM的FaaS運行態也同樣輕鬆。此外,更好的設計模式正在出現,這無疑將爲工具的多次使用更好的鋪平道路。

無服務器架構代表了一種非常不同的心態。代碼塊更小,降低成本,只有在觸發時才執行它們,它們通過鬆散耦合的事件而不是靜態定義的api來綁定在一起。服無務器提供了比以前更快速的開發週期,並且通過簡單的自動化和web應用程序設計模式來繪製,很容易以低風險開始。

本文翻譯源:

https://www.infoworld.com/article/3204669/application-development/get-started-with-aws-lambda.html

譯者補充:

  • 原文標題直譯爲:“爲什麼是無服務器計算?遇見AWS lambda”。無服務器計算是目前雲計算的熱點,由亞馬遜首先提出,目前主流的公有云都支持。本文用一個示例,通過一步一步的配置,讓讀者對無服務器計算有了瞭解。通過本文可以感受到,通過無服務器計算,業務層的開發者不需要掌握底層的知識,也不需要關心底層的資源如何調度,很好的提高了開發效率,降低了開發門檻。

  • 無服務器計算背後的技術應該使用的是容器,隔離性,安全性如何有待時間的驗證。

  • 目前沒有聽說那個業務全部使用無服務器計算,或者有那個公司有大規模使用無服務器計算的例子,公有云的無服務器計算在大壓力情況下表現如何,還需要驗證,應該也有一個過程。

  • Lambda的背景知識,Lambda(大寫Λ,小寫λ)讀音:lan b(m) da(蘭木達)['lmd]是第十一個希臘字母。大寫Λ用於:粒子物理學上,小寫λ用於:物理上的波長符號。計算機編程語言中的Lambda 表達式是一個匿名函數,可以包含表達式和語句,並且可用於創建委託或表達式目錄樹類型(以上引用自自百度百科)。可見亞馬遜使用Lambda代表自己的無服務器計算產品,也有一定的深意。


    原文鏈接:infoworld

      歡迎加我微信(ID:xiaolikvm)一起交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章