利用 API Gateway + Lambda Function 從 DynamoDB 讀資料
29 Oct 2022如何利用 API Gateway 與 Lambda Function 從 DynamoDB 讀資料呢?本文主要分三個部份:(1) 利用 DynamoDB 建立資料表;(2) 利用 Lambda Function 執行 Scan Operation;(3) 透過 API Gateway 觸發 Lambda Function。
利用 DynamoDB 建立資料表
首先,要有個資料表來存放資料,步驟如下。
- Step 1:在 DynamoDB 的主頁點右側「Create table」按鈕。
- Step 2:填入 table name 為 snack_list,這是一份想吃的甜點清單,partition key (亦即 primary key) 為 id,其餘維持預設狀態,最後點最下方「Create table」按鈕,建立資料表,如下面兩張圖,上方是資料表的清單,下圖是點進去看細節。
- Step 3:從「Actions > Create item」手動建立資料。如下圖,建立兩筆資料,id 可以是 timestamp 或 UUID,name 是店家名稱,photoURL 圖片連結。
「老法的酒窩」和「愛玉之夢遊仙草」這兩家都是我很愛吃的甜點店,歡迎大家留言推薦自己的必吃清單!
利用 Lambda Function 執行 Scan Operation
資料表建立好了,接下來就要有誰把資料讀出來,我們把這個重責大任交給 Lambda 吧。
實作一個 Lambda function 來做 scan 的動作,scan 是指讀取 DB table 中每一筆資料,並回傳每筆資料的每個欄位。建立 Lambda function 的方法可參考這裡,在這裡建立 getSnackList 來讀取 snack_list。如下程式碼所示,使用 AWS 所提供的 SDK 來讀取指定的 table,接著回傳結果。
const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
const ddb = new AWS.DynamoDB({ apiVersion: '2022-10-28' });
exports.handler = async (event) => {
const params = { TableName: 'snack_list' };
const body = await getDataFromDB(params);
return {
statusCode: 200,
body,
};
};
const getDataFromDB = async (params) => {
return new Promise((resolve, reject) => {
ddb.scan(params, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
};
按下 Test 按鈕,測試看看是否能如預期般運作,並且查看結果。
Test Event Name
testGetSnackList
Response
{
"statusCode": 200,
"body": {
"Items": [
{
"id": {
"S": "1664509105434"
},
"name": {
"S": "愛玉之夢遊仙草"
},
"photoURL": {
"S": "https://res.cloudinary.com/dfgridmvn/image/upload/c_scale,q_auto:best,w_354/v1535197444/dotch-food-v2/iceinwonderland1995-1.webp"
}
},
{
"id": {
"S": "1666341492264"
},
"name": {
"S": "老法的酒窩"
},
"photoURL": {
"S": ""
}
}
],
"Count": 2,
"ScannedCount": 2
}
}
Function Logs
START RequestId: a87259ab-d2f4-4979-b1ce-8ea29b8d7a28 Version: $LATEST
END RequestId: a87259ab-d2f4-4979-b1ce-8ea29b8d7a28
REPORT RequestId: a87259ab-d2f4-4979-b1ce-8ea29b8d7a28 Duration: 444.38 ms Billed Duration: 445 ms Memory Size: 128 MB Max Memory Used: 83 MB
Request ID
a87259ab-d2f4-4979-b1ce-8ea29b8d7a28
稍等會設定這個 getSnackList 透過 API Gateway 來 trigger Lambda。
透過 API Gateway 觸發 Lambda Function
最後,由於會從 UI 呼叫某個 API 來觸發 Lambda 幫我們取出資料,來呈現在畫面上,因此最後要來做個 API。
利用 API Gateway 建立 snack API 的 Get 方法,使用 API Gateway 的方法可參考這裡。
按下 Test 按鈕,測試看看是否能如預期般運作,並且查看結果。
這樣就能串成這樣 API Gateway → Lambda Function → DynamoBD 的流程 (ゝ∀・)b