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-item、query 和 scan API 來讀取資料。
準備工作
在開始之前,您需要具備以下條件:
- 一個有效的 AWS 帳戶。
- 按照「Your first AWS Lambda」和「Your first Lambda with AWS CLI」章節中的步驟,設定 Java、Maven、父專案
serverless-cookbook-parent-aws-java和 AWS CLI。 - 按照「Adding data items from Lambda」或「Working with data from the CLI」章節中的步驟,設定資料。
如何實作
以下是從 Lambda 讀取資料的步驟:
建立 Maven 專案:建立一個 Maven 專案,使用共同的父專案和 DynamoDB Java SDK 相依性。
定義 Request 和 Response 物件:定義
Request和Response物件。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; }filterDatamap 用於儲存篩選條件的屬性和對應的值。實作 Service:實作
get-item、query和scan操作。使用
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-item、query和scan方法從 DynamoDB 中讀取資料。 get-item方法根據主鍵讀取單一專案。query方法根據主鍵的 partition key 讀取多個專案,可以選擇性地使用篩選條件。scan方法掃描整個表格,可以選擇性地使用篩選條件。processFilterData方法用於建立篩選條件表示式和值對映。
定義 Lambda 處理程式:定義 Lambda 處理程式以呼叫 Service 方法並傳回回應結果。
封裝和佈署 Lambda:封裝和佈署 Lambda 函式。
定義 CloudFormation 範本:定義 CloudFormation 範本,並新增 Lambda 執行
get-item、query和scan操作的許可權。- Effect: Allow Action: - dynamodb:GetItem - dynamodb:Query - dynamodb:Scan Resource: - Fn::Sub: arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/*佈署 CloudFormation 範本:佈署 CloudFormation 範本。
呼叫 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 表格名稱。partitionKey和sortKey定義了表格的主鍵結構。partitionKeyValue和sortKeyValue用於指定查詢的主鍵值。filterData用於提供篩選條件,以過濾查詢結果。
DynamoDB 的批次讀取功能
DynamoDB 支援批次讀取操作,透過 batch-get-item 可以一次請求中檢索多個專案。以下是批次讀取的一些關鍵特性:
- 可以提供一個或多個鍵,每個鍵應包含所有鍵欄位(分割槽鍵或分割槽鍵和排序鍵)。
- 可以從多個表格中檢索專案。
- 傳回的檔案最大數量為 100,超出此限制將丟擲
ValidationException。 - 傳回記錄的最大大小為 16 MB,未處理的專案鍵將被傳回,以便重試。
- 如果所有專案都未能成功檢索,將丟擲
ProvisionedThroughputExceededException;如果部分失敗,失敗專案的鍵將被傳回,以便重試。
#### 內容解密:
- 使用
batch-get-item可以提高資料檢索的效率。 - 需要注意傳回記錄的大小限制和數量限制,以避免不必要的錯誤。
- 可以透過篩選屬性來減少傳回的資料量,從而在 16 MB 的限制內傳回更多的專案。
切換到 V2 版本的服務實作
若要執行 V2 版本的服務實作,需要更新 Lambda 函式的環境變數 API_VERSION 為 V2:
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 為無伺服器應用程式提供應用層級的安全性和使用者管理功能,包括使用者註冊、登入和存取控制等。敬請期待!