2018年7月22日 星期日

[Java] AWS Lambda + DynamoDB

承上文 [Java] AWS Lambda 入門, 這次添加存取 DynamoDB。

首先建立一個 DynamoDB 表單 "Employee",同時建立一筆資料。

接下來進入 IAM 建立一個 Role,這裡直接選擇 "AWS service", 在 "Choose the service that will use this role" 選擇 "Lambda", 然後就可以點擊按鈕 "Next: Permissions";
在 "Attach permissions policies" 裡面, 勾選 "AmazonDynamoDBFullAccess","AWSLambdaDynamoDBExecutionRole", 然後點擊按鈕 "Next: Review";
輸入 Role name,就可以建立一個 Role 了。

接下來回到之前建立的 Lambda,往下拉到 "Execution role",選取剛剛建立的 Role 就成功了。

可以參考官方文件用 node 簡單測試一下,

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'ap-northeast-1'});

exports.handler = (event, context, callback) => {
  // Create the DynamoDB service object
  ddb = new AWS.DynamoDB({apiVersion: '2012-10-08'});

  var params = {
    TableName: 'Employee',
    Key: {
      'EmpId' : {S: '1000'}
    }
    //, ProjectionExpression: 'EmpId'
  };

  // Call DynamoDB to read the item from the table
  ddb.getItem(params, function(err, data) {
    if (err) {
      console.log("Error", err);
    } else {
      console.log("Success", data.Item);
      callback(null, data);
    }
  });
};

回到之前的 Java Project,修改一下:

package example;

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class Hello implements RequestHandler {
    @Override
    public String handleRequest(Integer input, Context context) {
        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient();
        DynamoDB dynamoDB = new DynamoDB(client);
        Table table = dynamoDB.getTable("Employee");
        Item item = table.getItem("EmpId", "10000");
        System.out.println(item.toJSONPretty());
        return item.toJSON();
    }
}

另外 Lambda 也提供直接轉換物件的方式,我們不用再去處理 Json 映射物件的問題。

package example;

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import lombok.Data;

public class Hello implements RequestHandler {
    @Override
    public String handleRequest(Integer input, Context context) {
        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient();
        DynamoDBMapper dynamodbMapper = new DynamoDBMapper(client);
        Employee result = dynamodbMapper.load(Employee.class, "10000");
        System.out.println(result);
        return result.toString();
    }

    @Data
    @DynamoDBTable(tableName = "Employee")
    class Employee {
        @DynamoDBHashKey(attributeName = "EmpId")
        private String id;
        @DynamoDBAttribute(attributeName = "Name")
        private String name;
    }
}

系列:

1 則留言:

  1. Good explanation,thanks for writing,it is useful for so many developers
    AWS Online Training

    回覆刪除

[Java] Invalid HTTP method: PATCH

最近系統需要使用 Netty4,所以把衝突的 Netty3 拆掉,然後就出現了例外。 pom.xml <dependency> <groupId>com.ning</groupId> <artifactId>as...