iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
0
Software Development

從Java進入AWS部署RESTful API的心路歷程系列 第 5

Day05-概觀(一)Lambda、API Gateway以及Lambda Proxy integration

  • 分享至 

  • xImage
  •  

Lambda

我們現在看過了簡單的Lambda,而實際上AWS的Lambda可以處理各種AWS服務的事件,包含S3(儲存服務)的event、DynamoDB event等等。所以先來試一下在AWS主控台上實際建立Lambda的樣子

AWS的Lambda服務中,在Lambda>Functions當中執行Create Function
並命名及選擇runtime為Java8
https://ithelp.ithome.com.tw/upload/images/20190915/20120911qL3VkupU6E.png

建立完成後就會看到Designer顯示basic設定創建出來的lambda的樣子,只有Lambda名稱以及右下角的Amazon CloudWatch Logs的服務使用權限
https://ithelp.ithome.com.tw/upload/images/20190915/20120911pv4Cp1sIEr.png

下面Function code的區域可以上傳昨天的HelloLambda的demo-1.0.0.jar並設定Handler為com.amazonaws.lambda.demo.LambdaFunctionHandler::handleRequest
然後按下右上角的儲存按鈕即完成上傳
https://ithelp.ithome.com.tw/upload/images/20190915/20120911ctxYiKegrI.png

這時候可以在線上進行Lambda的測試,在Test按鈕左測的下拉選項點選Configure test event,並且任意取個測試名稱,內容的Json只要格式正確即可,因為我們目前沒有處理其內容
https://ithelp.ithome.com.tw/upload/images/20190915/20120911E7poKJLj8l.png

建立好event後選擇並進行測試,即可看到Lambda成功執行的結果
https://ithelp.ithome.com.tw/upload/images/20190915/20120911gCUe1ZJE9M.png

API Gateway

因為我們的目標是要建立RESTful API,就需要建立新的API Gateway做為Lambda的trigger,為了方便測試,使用最簡單的API認證方式API key
https://ithelp.ithome.com.tw/upload/images/20190915/20120911CkzD1oQkeY.png

點選Designer中建立好的API Gateway,下方會出現API Gateway詳細資訊,請記住API endpoint以及API key等等會用到
https://ithelp.ithome.com.tw/upload/images/20190915/20120911Jj0T3DNAd1.png

這時候,我們試著用Postman對API endpoint發送request
header要有x-api-key,其內容放入API key
body一樣隨便寫的json內容
我們用POST發出request
https://ithelp.ithome.com.tw/upload/images/20190915/20120911smP5g13Lg8.png

結果居然得到錯誤的結果?!

{
    "message": "Forbidden"
}

這是因為我們在主控台從Lambda function那邊新增API Gateway的時候,都使用預設值,預設值是使用Lambda Proxy integration,而我們的Lambda回傳的內容並不符合Lambda Proxy要求的格式!

在API Gateway服務中,選擇HelloLambda-API中的Resources,找到/HelloLambda的ANY方法,你可以看到目前設置的這個資源的request/response處理流程
https://ithelp.ithome.com.tw/upload/images/20190915/20120911pQMmEPEQEe.png

左半邊是API Gateway處理request/response的method,一般會定義驗證方式、回傳模組等,右半Integration部分就是整合Lambda的設定。再還沒寫好我們的handler程式之前,只好先關閉Lambda Proxy整合,點選Integration Request 會出現以下介面,請把Use Lambda Proxy integration 勾選取消
https://ithelp.ithome.com.tw/upload/images/20190915/20120911I5alC8vZRx.png

然後請注意API Gateway的所有設定都要手動Deploy API才會生效(而且大概要等幾秒鐘的樣子)
https://ithelp.ithome.com.tw/upload/images/20190915/20120911iVFfR9EHM4.png

這時候再重新以Postman發出request,終於得到正確的結果
https://ithelp.ithome.com.tw/upload/images/20190915/20120911IVMqGqARNl.png

Lambda Proxy integration

那麼這個害我們得到錯誤結果的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整合的程式!


上一篇
Day04-環境準備(三)Hello Lambda編譯與測試
下一篇
Day06-概觀(二)Run as API Gateway
系列文
從Java進入AWS部署RESTful API的心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言