DynamoDB 作為 NoSQL 資料函式庫服務,在伺服器less 架構中扮演重要角色。本文將探討如何利用 AWS Lambda 函式搭配 Java SDK 與 DynamoDB 互動,包含建立資料表及新增資料專案。首先,我們會逐步講解如何使用 Java SDK 建立 DynamoDB 資料表,包含定義請求、回應物件,設定主鍵、排序鍵以及讀寫容量單位等。接著,示範如何撰寫 Lambda 函式程式碼,使用 DynamoDB wrapper client 建立資料表,並根據需求設定等待資料表建立完成。此外,文章也會說明如何使用 CloudFormation 範本定義 Lambda 函式及相關 IAM 角色與許可權,並使用 AWS CLI 進行佈署和測試。最後,我們會進一步探討如何新增資料專案到 DynamoDB 資料表,同樣涵蓋請求物件定義、服務邏輯實作、以及 AWS CLI 呼叫 Lambda 函式的完整流程。

使用 Amazon DynamoDB 進行資料儲存:第 3 章

從 Lambda 建立資料表

在本章節中,我們將介紹如何使用 AWS Lambda 函式建立 Amazon DynamoDB 資料表。我們將使用 AWS SDK for DynamoDB 來實作此功能。

準備工作

在開始之前,請確保您具備以下條件:

  • 一個有效的 AWS 帳戶
  • 已安裝 Java 和 Maven
  • 已設定 AWS CLI
  • 已建立一個名為 serverless-cookbook-parent-aws-java 的 Maven 父專案

建立 Lambda 函式以建立資料表

要建立一個 Lambda 函式以建立資料表,請按照以下步驟進行:

  1. 建立 Maven 專案:使用 serverless-cookbook-parent-aws-java 作為父專案,建立一個新的 Maven 專案,並新增 DynamoDB Java SDK 相依性。
  2. 定義 Request 和 Response 物件:定義一個 Request 物件來接收建立資料表的請求引數,以及一個 Response 物件來傳回建立資料表的結果。
@Data
public class Request {
    private String tableName;
    private String partitionKey;
    private String sortKey;
    private long readCapacityUnits;
    private long writeCapacityUnits;
    private boolean waitForActive;
}
  1. 實作服務邏輯:使用 DynamoDB wrapper client 建立資料表。
Table table = dynamoDB.createTable(request.getTableName(),
        Arrays.asList(
                new KeySchemaElement(request.getPartitionKey(), KeyType.HASH),
                new KeySchemaElement(request.getSortKey(), KeyType.RANGE)),
        Arrays.asList(
                new AttributeDefinition(request.getPartitionKey(), ScalarAttributeType.S),
                new AttributeDefinition(request.getSortKey(), ScalarAttributeType.N)),
        new ProvisionedThroughput(request.getReadCapacityUnits(), request.getWriteCapacityUnits()));

程式碼解析

  • 使用 dynamoDB.createTable 方法建立資料表。
  • KeySchemaElement 用於定義資料表的索引鍵。
  • AttributeDefinition 用於定義資料表的屬性。
  • ProvisionedThroughput 用於定義資料表的讀寫容量。
  1. 選擇性等待資料表建立完成:根據 waitForActive 引數的值,決定是否等待資料表建立完成。
if (request.isWaitForActive()) {
    try {
        table.waitForActive();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

程式碼解析

  • 使用 table.waitForActive() 方法等待資料表建立完成。
  • 如果發生 InterruptedException,則列印錯誤訊息。
  1. 檢查資料表是否存在:檢查資料表是否已經存在,如果存在則傳回例外。
if (this.dynamoDB.getTable(tableName).getDescription() != null) {
    return true;
}

程式碼解析

  • 使用 dynamoDB.getTable 方法取得資料表的描述。
  • 如果資料表存在,則傳回 true
  1. 定義 Lambda 處理程式:定義一個 Lambda 處理程式來呼叫服務方法並傳回結果。
  2. 封裝和佈署 Lambda:封裝 Lambda 函式並佈署到 AWS。
  3. 定義 CloudFormation 範本:定義一個 CloudFormation 範本來建立必要的資源,包括 Lambda 函式和 IAM 角色。
- Effect: Allow
  Action:
    - dynamodb:CreateTable
    - dynamodb:DescribeTable
  Resource:
    - Fn::Sub: arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/*

程式碼解析

  • 使用 Effect: Allow 允許 Lambda 函式執行 CreateTableDescribeTable 操作。
  • 使用 Resource 指定允許操作的資源。
  1. 佈署 CloudFormation 範本:佈署 CloudFormation 範本以建立必要的資源。
  2. 呼叫 Lambda 函式:使用 AWS CLI 呼叫 Lambda 函式以建立資料表。
aws lambda invoke \
    --invocation-type RequestResponse \
    --function-name lambda-dynamodb-create-table \
    --log-type Tail \
    --payload '{
        "tableName":"my_table",
        "partitionKey": "id",
        "sortKey": "dateandtime",
        "readCapacityUnits": 1,
        "writeCapacityUnits": 1,
        "waitForActive": false
    }' \
    --region us-east-1 \
    --profile admin \
    outputfile.txt

程式碼解析

  • 使用 aws lambda invoke 命令呼叫 Lambda 函式。
  • 使用 --payload 指定請求引數。
  1. 清除資源:使用 aws dynamodb delete-table 命令刪除建立的資料表。
aws dynamodb delete-table --table-name my_table

使用Lambda向Amazon DynamoDB新增資料專案

在前面的章節中,我們已經討論瞭如何使用AWS Java SDK從Lambda函式操作DynamoDB,包括建立表格等基本步驟。本章節將重點介紹如何從Lambda向DynamoDB表格新增資料專案。

準備工作

在開始之前,請確保您具備以下條件:

  1. 一個活躍的AWS賬戶。
  2. 按照《入門Serverless運算在AWS》第一章中的指示,設定Java、Maven、父專案(serverless-cookbook-parent-aws-java)以及AWS CLI。
  3. 對Java和Maven有一定的瞭解。

操作步驟

以下是從Lambda向DynamoDB新增資料專案的主要步驟:

  1. 建立Maven專案:為Lambda建立一個Maven專案,使用共同的父專案,並新增DynamoDB Java SDK依賴。

  2. 定義請求和回應域物件:定義請求和回應物件。請求物件(Request)包含表格名稱、主鍵、排序鍵、主鍵值、排序鍵值、等待表格啟用的標誌,以及字串和整數型別的資料對映。

    @Data
    public class Request {
        private String tableName;
        private String partitionKey;
        private String sortKey;
        private String partitionKeyValue;
        private Integer sortKeyValue;
        private boolean waitForActive;
        private Map<String, String> stringData;
        private Map<String, Integer> integerData;
    }
    
  3. 實作服務:實作將專案新增到DynamoDB表格的服務方法。首先,取得DynamoDB表格例項,然後建立一個新的專案並設定其主鍵。如果請求中包含額外的字串或整數資料,則將其新增到專案中。最後,使用putItem方法將專案儲存到表格中。

    Table table = dynamoDB.getTable(request.getTableName());
    Item item = new Item()
        .withPrimaryKey(request.getPartitionKey(), request.getPartitionKeyValue(),
                        request.getSortKey(), request.getSortKeyValue());
    
    if (request.getStringData() != null) {
        request.getStringData().forEach((k, v) -> item.withString(k, v));
    }
    if (request.getIntegerData() != null) {
        request.getIntegerData().forEach((k, v) -> item.withInt(k, v));
    }
    table.putItem(item);
    
  4. 定義Lambda處理器:定義Lambda處理器以呼叫服務方法並傳回回應。

  5. 封裝和佈署Lambda:封裝Lambda函式並將其佈署到AWS。

  6. 定義CloudFormation範本:在CloudFormation範本中,為Lambda新增執行PutItemDescribeTable操作的許可權。

    - Effect: Allow
      Action:
        - dynamodb:PutItem
        - dynamodb:DescribeTable
      Resource:
        - Fn::Sub: arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/*
    
  7. 佈署CloudFormation範本:佈署包含Lambda函式和必要許可權的CloudFormation範本。

  8. 呼叫Lambda並測試:使用AWS CLI呼叫Lambda函式並測試其功能。

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

重點解析

本章節詳細介紹瞭如何從Lambda向DynamoDB新增資料專案。重點包括建立合適的請求物件、實作服務方法以將專案新增到DynamoDB表格、以及組態必要的許可權。透過這些步驟,您可以有效地利用Lambda和DynamoDB建立無伺服器架構的應用程式。

程式碼重點解析

Table table = dynamoDB.getTable(request.getTableName());
Item item = new Item()
    .withPrimaryKey(request.getPartitionKey(), request.getPartitionKeyValue(),
                    request.getSortKey(), request.getSortKeyValue());
if (request.getStringData() != null) {
    request.getStringData().forEach((k, v) -> item.withString(k, v));
}
if (request.getIntegerData() != null) {
    request.getIntegerData().forEach((k, v) -> item.withInt(k, v));
}
table.putItem(item);

程式碼解析:

  1. 取得DynamoDB表格例項:使用dynamoDB.getTable方法根據請求中的表格名稱取得對應的DynamoDB表格例項。

  2. 建立新專案:透過new Item()建立一個新的專案,並使用withPrimaryKey方法設定其主鍵,包括主鍵值和排序鍵值。

  3. 新增額外資料:如果請求中包含額外的字串或整數資料,則使用withStringwithInt方法將其新增到專案中。

  4. 儲存專案:最後,使用table.putItem(item)將構建好的專案儲存到DynamoDB表格中。

更多資訊

除了單個新增專案外,DynamoDB還支援批次寫入操作,使用batch-write-item命令可以一次性寫入多個專案到一個或多個表格中。但是,每次批次寫入最多不超過25個專案,否則整個操作將失敗。詳細的使用方法和限制可以參考AWS官方檔案。