上篇文章首先指出了Serverless=No Server這一常見誤區,然後明確定義了函式這個Serverless中的核心概念,接著介紹了Serverless的4個關鍵特性:執行成本更低、自動擴縮容、事件驅動、無狀態性,最後分析了Serverless和微服務、DevOps之間的關聯關係。為了幫助大家更直觀的理解Serverless,本文將介紹三種在AWS Lambda上建立函式的方式。
1 Hello, AWS Lambda!
1.1 註冊AWS賬戶
首先,開啟Amazon AWS官網,點選右上角註冊按鈕開始註冊流程。
註冊AWS除了郵箱、地址、手機號(用於接受語音驗證碼)等基本資訊之外,還需要繫結一張信用卡(銀聯、MasterCard、VISA),綁卡過程中會發生一筆1美元的信用卡預授權扣費。
註冊成功之後,即可獲贈AWS免費套餐大禮包,包括12個月免費的基礎IaaS & PaaS服務(比如EC2, S3, RDS等),以及永久免費的AWS Lambda免費套餐(包括每月100萬個免費請求以及每月400000GB-秒的計算時間,對於個人使用而言完全是足夠了)。
1.2 建立函式
接下來,就來建立第一個AWS Lambda函式吧。
- 登入AWS,點選最上方的選單欄服務->計算:Lambda,進入Lambda控制檯。
- 在頁面上找到並點選建立函式按鈕。
- 作為第一個函式,選擇從頭開始創作,輸入函式名稱
hello-lambda
,執行語言選擇Node.js 6.10
,角色選擇系統預設建立的service-role/admin
,點選建立函式完成建立。
1.3 簡單測試
新函式建立好之後,就可以開始測試了。在函式詳情頁的右上角找到並點選測試按鈕,第一次會提示你先建立一個測試事件,輸入名稱,使用預設模板完成建立。回到詳情頁,再次點選測試按鈕,就會觸發測試。測試完成之後,展開詳細資訊,就可以看到具體的響應結果,以及本次測試產生的計費時間。
1.4 公網測試
函式詳情頁的測試按鈕是最簡單的一種測試Lambda函式的方式,但這種方式僅限於AWS內網,如果想在公網環境下進行測試,該如何操作呢?最自然的方式是繫結API Gateway,將函式轉化為可公開呼叫的API。
1.4.1 繫結API Gateway
- 同樣是函式詳情頁,在左側找到新增觸發器,點選API Gateway,保持預設設定完成新增。
- 修改函式程式碼,返回符合API Gateway格式要求的響應結果,參考這裡。
- 儲存上述改動。
exports.handler = (event, context, callback) => {
var responseBody = {
"key3": "value3",
"key2": "value2",
"key1": "value1"
};
var response = {
"statusCode": 200,
"headers": {
"my_header": "my_value"
},
"body": JSON.stringify(responseBody),
"isBase64Encoded": false
};
callback(null, response);
};
複製程式碼
示例函式程式碼
點選最上方的選單欄服務->網路和內容分發:API Gateway,進入API Gateway控制檯,在左側導航欄應該能夠看到API->LambdaMicroservice,說明函式已經成功繫結。依次點選API->LambdaMicroservice->階段->prod->/->hello-lambda->GET,記下呼叫URL。
1.4.2 建立使用者
API Gateway預設使用的鑑權方式是AWS_IAM,即呼叫方必須擁有特定的IAM Permssions才能呼叫API,參考這裡。具體來說,需要一個擁有execute-api:Invoke
許可權的使用者。
- 點選最上方的選單欄服務->安全、身份與合規:IAM,進入IAM控制檯。
- 點選左側導航欄使用者,進入使用者皮膚。
- 點選新增使用者按鈕,輸入使用者名稱,訪問型別選擇程式設計訪問,點選下一步:許可權。
- 選擇直接附加現有策略,搜尋並選中
AmazonAPIGatewayInvokeFullAccess
,完成建立。 - 返回使用者列表頁,點選剛剛建立的使用者進入使用者詳情頁,點選安全證照->建立訪問金鑰,記下訪問金鑰 ID和私有訪問金鑰。
1.4.3 使用Postman測試API
做完前兩步的準備工作,就可以使用Postman進行測試了。
- 下載並啟動Postman。
- 建立一個新的請求,Authorization選擇
AWS Signature
,輸入之前記下的URL、AccessKey(訪問金鑰 ID)和SecretKey(私有訪問金鑰),AWS Region填入URL中緊鄰amazonaws.com的一個子域名,Service Name填入execute-api
。 - 點選Send,稍等一會,應該就能看到正常的響應結果。
進一步資訊可參考這裡。
2 加餐一:Spring Cloud Function
除了Node.js,AWS Lambda還支援Java 8、C#、Go、Python等多種執行語言。接下來,就以一個Spring Cloud Function(簡稱SCF)應用為例,展示如何建立一個Java 8的函式。
SCF是Spring社群提供的一個以函式為核心的開發框架。除了本地執行,SCF應用還可以部署到AWS、Azure、OpenWhisk等多種Serverless平臺。最新的釋出版本是1.0.0.M3。
打包應用:
git clone
SCF官方倉庫。- 進入spring-cloud-function-samples/function-sample-aws目錄,執行
mvn clean package
。 - 執行成功後在target目錄下可以找到名為function-sample-aws-1.0.0.BUILD-SNAPSHOT-aws.jar的應用包。
建立函式:
- 和之前一樣,進入Lambda控制檯,點選建立函式按鈕,執行語言選擇
Java 8
,完成建立。 - 進入函式詳情頁,點選函式程式碼->上傳按鈕,選擇之前打好的應用包,處理程式改為
org.springframework.cloud.function.adapter.aws.SpringBootStreamHandler
。 - 儲存修改。
測試函式:
- 進入函式詳情頁,點選右上角的測試按鈕,填入
{"value": "hello, lambda!"}
建立新的測試事件。 - 再次點選測試按鈕,觸發第一次測試。不出意外,第一次測試會提示失敗,錯誤訊息類似於
errorMessage": "2018-02-04T13:09:59.745Z b1c9b0a1-09ac-11e8-9fdf-858e20f0ff70 Task timed out after 3.00 seconds"
。出錯的直接原因是函式設定的超時時間太短(預設3秒),根本原因是函式的無狀態性,每次函式呼叫都要經歷一次冷啟動,這對於Node應用沒有太大問題,但對於Java 8應用,即便是一個最簡單的Hello World應用,完成一次冷啟動至少需要5到10秒。 - 修改基本設定->記憶體為
512MB
,基本設定->超時為5分鐘
,儲存然後重新測試。這一次測試應該可以成功,返回結果為{"value": "HELLO, LAMBDA!"}
。
3 加餐二:serverless toolkit
除了直接在AWS後臺建立函式,還有一種更為簡便的方式,使用serverless.com平臺提供的serverless toolkit。
操作非常簡單,這裡就不展開了,不過有兩點需要注意:
- 在將應用部署到AWS之前,先要建立一個擁有
AdministratorAccess
許可權的使用者,參考這裡。 - 預設建立的應用鑑權為空,即可以在公網直接訪問。
4 小結
以上簡單介紹了三種在AWS Lambda上建立函式的方式,希望對你理解Serverless有所幫助。有關Serverless其他特性的研究,以後有機會我再跟你分享。歡迎你到我的留言板留言交流,和大家一起過過招。