利用 API Gateway + Lambda Function 從 DynamoDB 讀資料

利用 API Gateway + Lambda Function 從 DynamoDB 讀資料

如何利用 API Gateway 與 Lambda Function 從 DynamoDB 讀資料呢?本文主要分三個部份:(1) 利用 DynamoDB 建立資料表;(2) 利用 Lambda Function 執行 Scan Operation;(3) 透過 API Gateway 觸發 Lambda Function。

利用 DynamoDB 建立資料表

首先,要有個資料表來存放資料,步驟如下。

snack_list_table_overview.png

snack_list_table_overview_details.png

snack_list_table_overview_items.png

「老法的酒窩」和「愛玉之夢遊仙草」這兩家都是我很愛吃的甜點店,歡迎大家留言推薦自己的必吃清單!

利用 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 的方法可參考這裡

api-gateway-snacks-get.png

按下 Test 按鈕,測試看看是否能如預期般運作,並且查看結果。

api-gateway-snacks-get-result.png

這樣就能串成這樣 API Gateway → Lambda Function → DynamoBD 的流程 (ゝ∀・)b

參考資料


Lambda API Gateway DynamoDB Serverless AWS Amazon Web Services RESTful API