返回文章列表

Lambda 讀取 DynamoDB 資料操作

本章節探討如何使用 AWS Lambda 從 DynamoDB 讀取資料,涵蓋 get-item、query 和 scan 等 API 操作,以及如何設定篩選條件和使用 AWS CLI 進行查詢。同時,文章也介紹了 DynamoDB 的批次讀取功能和切換 V2

伺服器開發 資料函式庫

DynamoDB 作為 NoSQL 資料函式庫服務,在無伺服器架構中扮演重要角色。本篇著重於透過 Lambda 函式讀取 DynamoDB 資料的實作細節,包含使用 get-item 精確擷取單筆資料、query 根據 partition key 進行範圍查詢,以及 scan 進行全表掃描。程式碼範例中清晰展示瞭如何建構請求、處理回應,以及如何設定篩選條件來精確控制資料讀取。同時,文章也說明瞭如何使用 AWS CLI 直接呼叫 Lambda 函式,並示範了不同查詢情境的引數設定,方便開發者快速測試和驗證。除了單次讀取,文章也提及 DynamoDB 的批次讀取功能 batch-get-item,及其在效能最佳化方面的應用。最後,文章也簡述瞭如何透過環境變數切換不同版本的服務實作,提供更靈活的佈署策略。

使用 Amazon DynamoDB 進行資料儲存 Chapter 3

從 Lambda 讀取資料

在這個章節中,我們將介紹如何從 Lambda 函式中讀取 DynamoDB 中的資料。我們將使用 get-itemqueryscan API 來讀取資料。

準備工作

在開始之前,您需要具備以下條件:

  1. 一個有效的 AWS 帳戶。
  2. 按照「Your first AWS Lambda」和「Your first Lambda with AWS CLI」章節中的步驟,設定 Java、Maven、父專案 serverless-cookbook-parent-aws-java 和 AWS CLI。
  3. 按照「Adding data items from Lambda」或「Working with data from the CLI」章節中的步驟,設定資料。

如何實作

以下是從 Lambda 讀取資料的步驟:

  1. 建立 Maven 專案:建立一個 Maven 專案,使用共同的父專案和 DynamoDB Java SDK 相依性。

  2. 定義 Request 和 Response 物件:定義 RequestResponse 物件。Request 物件用於接收請求引數,而 Response 物件則用於傳回回應結果。

    @Data
    public class Request {
        private String tableName;
        private String partitionKey;
        private String sortKey;
        private String partitionKeyValue;
        private String sortKeyValue; 
        private boolean waitForActive;
        private Map<String, String> filterData;
    }
    

    filterData map 用於儲存篩選條件的屬性和對應的值。

  3. 實作 Service:實作 get-itemqueryscan 操作。

    • 使用 get-item 讀取資料:

      Table table = dynamoDB.getTable(request.getTableName());
      Item item = table.getItem(new PrimaryKey()
          .addComponent(request.getPartitionKey(), request.getPartitionKeyValue())
          .addComponent(request.getSortKey(), Integer.parseInt(request.getSortKeyValue())));
      
    • 使用 query 讀取資料:

      Table table = dynamoDB.getTable(request.getTableName());
      final String keyConditionExpression = request.getPartitionKey() + "=:" + request.getPartitionKey();
      QuerySpec querySpec = new QuerySpec()
          .withKeyConditionExpression(keyConditionExpression);
      
      final Map<String, Object> valueMap = new HashMap<>();
      valueMap.put(":" + request.getPartitionKey(), request.getPartitionKeyValue());
      querySpec.withValueMap(valueMap);
      
      if (request.getFilterData() != null) {
          StringBuilder filterExpressionBuilder = new StringBuilder();
          processFilterData(request, filterExpressionBuilder, valueMap);
          querySpec.withFilterExpression(filterExpressionBuilder.toString());
      }
      
      ItemCollection<QueryOutcome> items = table.query(querySpec);
      
    • 使用 scan 讀取資料:

      final Table table = dynamoDB.getTable(request.getTableName());
      final String projectionExpression = request.getPartitionKey() + " , " + request.getSortKey();
      final ScanSpec scanSpec = new ScanSpec()
          .withProjectionExpression(projectionExpression);
      
      if (request.getFilterData() != null) {
          StringBuilder filterExpressionBuilder = new StringBuilder();
          Map<String, Object> valueMap = new HashMap<>();
          processFilterData(request, filterExpressionBuilder, valueMap);
          scanSpec.withFilterExpression(filterExpressionBuilder.toString());
          scanSpec.withValueMap(valueMap);
      }
      
      ItemCollection<ScanOutcome> scanItems = table.scan(scanSpec);
      

    內容解密:

    • 在上述程式碼中,我們使用 get-itemqueryscan 方法從 DynamoDB 中讀取資料。
    • get-item 方法根據主鍵讀取單一專案。
    • query 方法根據主鍵的 partition key 讀取多個專案,可以選擇性地使用篩選條件。
    • scan 方法掃描整個表格,可以選擇性地使用篩選條件。
    • processFilterData 方法用於建立篩選條件表示式和值對映。
  4. 定義 Lambda 處理程式:定義 Lambda 處理程式以呼叫 Service 方法並傳回回應結果。

  5. 封裝和佈署 Lambda:封裝和佈署 Lambda 函式。

  6. 定義 CloudFormation 範本:定義 CloudFormation 範本,並新增 Lambda 執行 get-itemqueryscan 操作的許可權。

    - Effect: Allow
      Action:
        - dynamodb:GetItem
        - dynamodb:Query
        - dynamodb:Scan
      Resource:
        - Fn::Sub: arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/*
    
  7. 佈署 CloudFormation 範本:佈署 CloudFormation 範本。

  8. 呼叫 Lambda 並測試:呼叫 Lambda 函式並測試。

    aws lambda invoke \
        --invocation-type RequestResponse \
        --function-name lambda-dynamodb-read-item \
        --log-type Tail \
        --payload '{
            "tableName":"my_table",
            ...
        }'
    

使用 Amazon DynamoDB 進行資料儲存:第 3 章重點整理與深入解析

深入理解 DynamoDB 的讀取操作

在前面的章節中,我們已經探討瞭如何使用 AWS Lambda 與 Amazon DynamoDB 進行互動。本章節將重點放在如何有效地從 DynamoDB 中讀取資料。

使用 AWS CLI 呼叫 Lambda 函式讀取資料

首先,我們需要了解如何透過 AWS CLI 呼叫 Lambda 函式來執行對 DynamoDB 的查詢。以下是一個基本的查詢範例:

aws lambda invoke \
--invocation-type RequestResponse \
--function-name lambda-dynamodb-read-item \
--log-type Tail \
--payload '{
  "tableName": "my_table",
  "partitionKey": "id",
  "sortKey": "dateandtime",
  "partitionKeyValue": "p1",
  "sortKeyValue": 1537963031,
  "waitForActive": false
}' \
--region us-east-1 \
--profile admin \
outputfile.txt

查詢操作與篩選條件的應用

在進行查詢時,可以選擇性地加入篩選條件,以過濾結果。以下範例展示瞭如何傳遞篩選條件:

aws lambda invoke \
--invocation-type RequestResponse \
--function-name lambda-dynamodb-read-item \
--log-type Tail \
--payload '{
  "tableName": "my_table",
  "partitionKey": "id",
  "sortKey": "dateandtime",
  "partitionKeyValue": "p1",
  "waitForActive": false,
  "filterData": {
    "s1": "v1",
    "s2": "v2"
  }
}' \
--region us-east-1 \
--profile admin \
outputfile.txt

全表掃描操作

除了查詢外,DynamoDB 也支援全表掃描。以下是一個執行全表掃描的範例:

aws lambda invoke \
--invocation-type RequestResponse \
--function-name lambda-dynamodb-read-item \
--log-type Tail \
--payload '{
  "tableName": "my_table",
  "partitionKey": "id",
  "sortKey": "dateandtime",
  "waitForActive": false,
  "filterData": {
    "s1": "v1",
    "s2": "v2"
  }
}' \
--region us-east-1 \
--profile admin \
outputfile.txt

#### 內容解密:

  • tableName 指定了要操作的 DynamoDB 表格名稱。
  • partitionKeysortKey 定義了表格的主鍵結構。
  • partitionKeyValuesortKeyValue 用於指定查詢的主鍵值。
  • filterData 用於提供篩選條件,以過濾查詢結果。

DynamoDB 的批次讀取功能

DynamoDB 支援批次讀取操作,透過 batch-get-item 可以一次請求中檢索多個專案。以下是批次讀取的一些關鍵特性:

  • 可以提供一個或多個鍵,每個鍵應包含所有鍵欄位(分割槽鍵或分割槽鍵和排序鍵)。
  • 可以從多個表格中檢索專案。
  • 傳回的檔案最大數量為 100,超出此限制將丟擲 ValidationException
  • 傳回記錄的最大大小為 16 MB,未處理的專案鍵將被傳回,以便重試。
  • 如果所有專案都未能成功檢索,將丟擲 ProvisionedThroughputExceededException;如果部分失敗,失敗專案的鍵將被傳回,以便重試。

#### 內容解密:

  • 使用 batch-get-item 可以提高資料檢索的效率。
  • 需要注意傳回記錄的大小限制和數量限制,以避免不必要的錯誤。
  • 可以透過篩選屬性來減少傳回的資料量,從而在 16 MB 的限制內傳回更多的專案。

切換到 V2 版本的服務實作

若要執行 V2 版本的服務實作,需要更新 Lambda 函式的環境變數 API_VERSIONV2

aws lambda update-function-configuration \
--function-name lambda-dynamodb-read-item \
--environment Variables={API_VERSION=V2} \
--region us-east-1 \
--profile admin

#### 內容解密:

  • 更新環境變數是切換不同版本服務實作的常見做法。
  • 需要確保 Lambda 函式的程式碼和組態與所切換的版本相容。

資源清理

在完成資料讀取操作後,不需要進行額外的資源清理。但建議根據之前的步驟設定資料,或者刪除該資料或整個表格。

相關資源與參考資料

下一步:使用 Amazon Cognito 提供應用層級的安全性

在下一章中,我們將探討如何使用 Amazon Cognito 為無伺服器應用程式提供應用層級的安全性和使用者管理功能,包括使用者註冊、登入和存取控制等。敬請期待!