零基礎玩轉Serverless

上篇文章首先指出了Serverless=No Server這一常見誤區,而後明肯定義了函數這個Serverless中的核心概念,接着介紹了Serverless的4個關鍵特性:運行成本更低、自動擴縮容、事件驅動、無狀態性,最後分析了Serverless和微服務、DevOps之間的關聯關係。爲了幫助你們更直觀的理解Serverless,本文將介紹三種在AWS Lambda上建立函數的方式。html

1 Hello, AWS Lambda!

1.1 註冊AWS帳戶

首先,打開Amazon AWS官網,點擊右上角註冊按鈕開始註冊流程。git

註冊AWS除了郵箱、地址、手機號(用於接受語音驗證碼)等基本信息以外,還須要綁定一張信用卡(銀聯、MasterCard、VISA),綁卡過程當中會發生一筆1美圓的信用卡預受權扣費。github

註冊成功以後,便可獲贈AWS免費套餐大禮包,包括12個月免費的基礎IaaS & PaaS服務(好比EC2, S3, RDS等),以及永久免費的AWS Lambda免費套餐(包括每個月100萬個免費請求以及每個月400000GB-秒的計算時間,對於我的使用而言徹底是足夠了)。spring

1.2 建立函數

接下來,就來建立第一個AWS Lambda函數吧。編程

  1. 登陸AWS,點擊最上方的菜單欄服務->計算:Lambda,進入Lambda控制檯。
  2. 在頁面上找到並點擊建立函數按鈕。
  3. 做爲第一個函數,選擇從頭開始創做,輸入函數名稱hello-lambda,運行語言選擇Node.js 6.10,角色選擇系統默認建立的service-role/admin,點擊建立函數完成建立。

1.3 簡單測試

新函數建立好以後,就能夠開始測試了。在函數詳情頁的右上角找到並點擊測試按鈕,第一次會提示你先建立一個測試事件,輸入名稱,使用默認模板完成建立。回到詳情頁,再次點擊測試按鈕,就會觸發測試。測試完成以後,展開詳細信息,就能夠看到具體的響應結果,以及本次測試產生的計費時間。api

1.4 公網測試

函數詳情頁的測試按鈕是最簡單的一種測試Lambda函數的方式,但這種方式僅限於AWS內網,若是想在公網環境下進行測試,該如何操做呢?最天然的方式是綁定API Gateway,將函數轉化爲可公開調用的API。安全

1.4.1 綁定API Gateway

  1. 一樣是函數詳情頁,在左側找到添加觸發器,點擊API Gateway,保持默認設置完成添加。
  2. 修改函數代碼,返回符合API Gateway格式要求的響應結果,參考這裏
  3. 保存上述改動。
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);
};
複製代碼

示例函數代碼bash

點擊最上方的菜單欄服務->網絡和內容分發: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權限的用戶。框架

  1. 點擊最上方的菜單欄服務->安全、身份與合規:IAM,進入IAM控制檯。
  2. 點擊左側導航欄用戶,進入用戶面板。
  3. 點擊添加用戶按鈕,輸入用戶名,訪問類型選擇編程訪問,點擊下一步:權限
  4. 選擇直接附加現有策略,搜索並選中AmazonAPIGatewayInvokeFullAccess,完成建立。
  5. 返回用戶列表頁,點擊剛剛建立的用戶進入用戶詳情頁,點擊安全證書->建立訪問密鑰,記下訪問密鑰 ID私有訪問密鑰

1.4.3 使用Postman測試API

作完前兩步的準備工做,就可使用Postman進行測試了。

  1. 下載並啓動Postman
  2. 建立一個新的請求,Authorization選擇AWS Signature,輸入以前記下的URL、AccessKey(訪問密鑰 ID)和SecretKey(私有訪問密鑰),AWS Region填入URL中緊鄰amazonaws.com的一個子域名,Service Name填入execute-api
  3. 點擊Send,稍等一會,應該就能看到正常的響應結果。

進一步信息可參考這裏

2 加餐一:Spring Cloud Function

除了Node.js,AWS Lambda還支持Java 八、C#、Go、Python等多種運行語言。接下來,就以一個Spring Cloud Function(簡稱SCF)應用爲例,展現如何建立一個Java 8的函數。

SCF是Spring社區提供的一個以函數爲核心的開發框架。除了本地運行,SCF應用還能夠部署到AWS、Azure、OpenWhisk等多種Serverless平臺。最新的發佈版本是1.0.0.M3。

打包應用:

  1. git cloneSCF官方倉庫
  2. 進入spring-cloud-function-samples/function-sample-aws目錄,運行mvn clean package
  3. 運行成功後在target目錄下能夠找到名爲function-sample-aws-1.0.0.BUILD-SNAPSHOT-aws.jar的應用包。

建立函數:

  1. 和以前同樣,進入Lambda控制檯,點擊建立函數按鈕,運行語言選擇Java 8,完成建立。
  2. 進入函數詳情頁,點擊函數代碼->上傳按鈕,選擇以前打好的應用包,處理程序改成org.springframework.cloud.function.adapter.aws.SpringBootStreamHandler
  3. 保存修改。

測試函數:

  1. 進入函數詳情頁,點擊右上角的測試按鈕,填入{"value": "hello, lambda!"}建立新的測試事件。
  2. 再次點擊測試按鈕,觸發第一次測試。不出意外,第一次測試會提示失敗,錯誤消息相似於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秒。
  3. 修改基本設置->內存512MB基本設置->超時5分鐘,保存而後從新測試。這一次測試應該能夠成功,返回結果爲{"value": "HELLO, LAMBDA!"}

3 加餐二:serverless toolkit

除了直接在AWS後臺建立函數,還有一種更爲簡便的方式,使用serverless.com平臺提供的serverless toolkit。

操做很是簡單,這裏就不展開了,不過有兩點須要注意:

  • 在將應用部署到AWS以前,先要建立一個擁有AdministratorAccess權限的用戶,參考這裏
  • 默認建立的應用鑑權爲空,便可以在公網直接訪問。

4 小結

以上簡單介紹了三種在AWS Lambda上建立函數的方式,但願對你理解Serverless有所幫助。有關Serverless其餘特性的研究,之後有機會我再跟你分享。歡迎你到個人留言板留言交流,和你們一塊兒過過招。

5 參考

相關文章
相關標籤/搜索