我們現在看過了簡單的Lambda,而實際上AWS的Lambda可以處理各種AWS服務的事件,包含S3(儲存服務)的event、DynamoDB event等等。所以先來試一下在AWS主控台上實際建立Lambda的樣子
AWS的Lambda服務中,在Lambda>Functions當中執行Create Function
並命名及選擇runtime為Java8
建立完成後就會看到Designer顯示basic設定創建出來的lambda的樣子,只有Lambda名稱以及右下角的Amazon CloudWatch Logs的服務使用權限
下面Function code的區域可以上傳昨天的HelloLambda的demo-1.0.0.jar並設定Handler為com.amazonaws.lambda.demo.LambdaFunctionHandler::handleRequest
然後按下右上角的儲存按鈕即完成上傳
這時候可以在線上進行Lambda的測試,在Test按鈕左測的下拉選項點選Configure test event,並且任意取個測試名稱,內容的Json只要格式正確即可,因為我們目前沒有處理其內容
建立好event後選擇並進行測試,即可看到Lambda成功執行的結果
因為我們的目標是要建立RESTful API,就需要建立新的API Gateway做為Lambda的trigger,為了方便測試,使用最簡單的API認證方式API key
點選Designer中建立好的API Gateway,下方會出現API Gateway詳細資訊,請記住API endpoint以及API key等等會用到
這時候,我們試著用Postman對API endpoint發送request
header要有x-api-key,其內容放入API key
body一樣隨便寫的json內容
我們用POST發出request
結果居然得到錯誤的結果?!
{
"message": "Forbidden"
}
這是因為我們在主控台從Lambda function那邊新增API Gateway的時候,都使用預設值,預設值是使用Lambda Proxy integration,而我們的Lambda回傳的內容並不符合Lambda Proxy要求的格式!
在API Gateway服務中,選擇HelloLambda-API中的Resources,找到/HelloLambda的ANY方法,你可以看到目前設置的這個資源的request/response處理流程
左半邊是API Gateway處理request/response的method,一般會定義驗證方式、回傳模組等,右半Integration部分就是整合Lambda的設定。再還沒寫好我們的handler程式之前,只好先關閉Lambda Proxy整合,點選Integration Request 會出現以下介面,請把Use Lambda Proxy integration 勾選取消
然後請注意API Gateway的所有設定都要手動Deploy API才會生效(而且大概要等幾秒鐘的樣子)
這時候再重新以Postman發出request,終於得到正確的結果
那麼這個害我們得到錯誤結果的Lambda Proxy整合功能到底是甚麼呢?
如果原本只需要取得request body以及response body內容,確實是不需要這個整合功能,但是一般API通常都還需要取得如path parameters、Query String Parameters、HTTP Headers等不同的內容,如果還需要response時能決定HTTP status code或增加不同的HTTP Headers,就只能再API Gateway剛剛看到的Resources介面上一個個設定。
但是Lambda Proxy integration則提供了一個更簡便的方法,就是它會自動將request包裝成一個固定的json payload再傳遞給Lambda,而Lambda只要回傳符合的json payload,就能達成直接在Lambda中直接取得request的所有所需資料,定義response所需的各種狀態結果。
在目前我們的handler中我們有一行將request寫入log
context.getLogger().log("Input: " + input);
去看看吧,在CloudWatch中查詢HelloLambda,就會看到之前雖然執行錯誤,但仍把經過proxy包裝後的request記錄了下來。而後來將proxy關閉後的紀錄,則只有我們request body的內容。
下一篇開始,將會開始撰寫符合Lambda Proxy整合的程式!