Amazon DynamoDB Streams and Java AWS Lambda

Chiwa Kantawong (Pea)
5 min readDec 4, 2020

--

บทความนี้เราจะไม่กล่าวถึงวิธีการใช้งาน Amazon AWS Consoles นะครับ ถือว่าทุกคนใช้งานกันเป็น ไม่งั้นบทความนี้จะยืดยาวเกินไป

ไปที่ Services แล้วค้นหา Lambda สามารถ Favorite ไว้ได้ครั้งต่อไปจะได้เข้าง่ายๆ นะครับ

เมื่อเข้าไปแล้วจะเจอหน้าตาประมาณนี้

ต่อไปเรามาสร้าง Java Lamda กันครับ กด Create function เลย

Runtime เป็น Java 8 นะครับ ส่วน Function Name ให้ใส่เป็น testLambda

ส่วนของ Permission เลือก Role ที่สามารถเข้าใช้งาน DynamoDB ได้นะครับถ้าไม่มีก็สร้าง Role ขึ้นมาใหม่นะครับ

เสร็จแล้วกดปุ่มส้มๆ Create function ครับ ขวาล่างสุด

พอสร้างเสร็จมันจะมาหน้าประมาณนี้ครับ

ต่อไปเรามาสร้าง Java Project กันเราจะใช้ Maven นะครับ ใช้ start.spring.io ช่วยก็ได้ครับ แต่เราต้องลบ dependency ของ Spring Boot ออกนะครับ

แก้ pom ให้เป็น

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zengcode</groupId>
<artifactId>test-lambda</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test-lambda</name>
<description>Test Lambda</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

แก้ไข TestLambdaApplication

package com.zengcode.test.lamda;


import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Map;

public class TestLambdaApplication implements RequestHandler<Map<String,Object>, String> {

static Gson gson = new GsonBuilder().setPrettyPrinting().create();

public String handleRequest(Map<String, Object> event, Context context) {
LambdaLogger logger = context.getLogger();
String response = "200 OK";
logger.log("RAW DATA : " + event.toString());
logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
logger.log("CONTEXT: " + gson.toJson(context));
logger.log("EVENT: " + gson.toJson(event));
logger.log("EVENT TYPE: " + event.getClass().toString());
logger.log("HANDLE REQUEST SUCCESS");
return response;
}
}

แล้วก็ build เลยครับ

mvn clean package shade:shade

เมื่อเราได้ jar แล้วก็ถึงขึ้นตอนการ deploy ไปที่หน้า AWS Console ที่เราสร้าง Lambda ก่อนหน้านี้กัน

ตรง Function Cod เลือก Action ‘Upload a zip or jar file’

กด Save ไปโลดครับ ถ้าไม่มีอะไรผิดพลาดจะมีหน้าประมาณนี้ขึ้น

ต่อไปเราต้องแก้ Runtime Setting จองเราจาก example.Hello::handleRequest เป็น com.zengcode.test.lamda.TestLambdaApplication (lamda ผิดครับ ขออภัย)

com.zengcode.test.lamda = Package

TestLambdaApplication = Class Name

handleRequest = Execute Method

ต่อไปเรามาเทส Java Lambda ของเรากันว่าทำงานได้ไหม

กด Test ครับ

ใส่ Event name = TestEvent กด Create เลยครับ

เห้น 200 OK ไหมล่ะ แสดงว่า Java Lambda เราทำได้ได้ถูกต้อง

Log Output

START RequestId: ae77825b-a211-404b-8c33-2ea8c8e6206e Version: $LATEST
ENVIRONMENT VARIABLES: {
"PATH": "/usr/local/bin:/usr/bin/:/bin:/opt/bin",
"_AWS_XRAY_DAEMON_ADDRESS": "169.254.79.2",
"LAMBDA_TASK_ROOT": "/var/task",
"AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "512",
....
"AWS_XRAY_CONTEXT_MISSING": "LOG_ERROR",
"AWS_LAMBDA_FUNCTION_VERSION": "$LATEST",
"AWS_ACCESS_KEY": "ASIARG5KQ3WX3BEQANMO",
"AWS_LAMBDA_FUNCTION_NAME": "testLambda"
}CONTEXT: {
"memoryLimit": 512,
"awsRequestId": "ae77825b-a211-404b-8c33-2ea8c8e6206e",
"logGroupName": "/aws/lambda/testLambda",
"logStreamName": "2020/12/04/[$LATEST]920e52573e134ac0b9b8d570b598d506",
"functionName": "testLambda",
"functionVersion": "$LATEST",
"invokedFunctionArn": "arn:aws:lambda:ap-southeast-1:xxxx:function:testLambda",
"cognitoIdentity": {
"identityId": "",
"poolId": ""
},
"logger": {}
}EVENT: {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}EVENT TYPE: class java.util.LinkedHashMapEND RequestId: ae77825b-a211-404b-8c33-2ea8c8e6206e
REPORT RequestId: ae77825b-a211-404b-8c33-2ea8c8e6206e Duration: 92.18 ms Billed Duration: 93 ms Memory Size: 512 MB Max Memory Used: 79 MB Init Duration: 383.06 ms

ต่อไปเราจะให้ Java Lambda เราอ่าน Streams จาก DynamoDB กัน ไปหน้า DynamoDB กันเลย

กดสร้างตารางกันครับ คลิก Create table

สร้างตารางชื่อ test-lambda แล้วมี Partition key = id (Number)

ต่อไปเราจะไป set Java Lambda เราให้อ่าน Streams จาก DynamoDB (มีการ Insert/Update/Delete ที่ตารางที่เราสร้าง)

คลิกที่ + Add trigger

Add trigger เลือก DynamoDB

เลือก table ที่เราสร้างขึ้นคือ test-lambda

กด Add เลยคร้าบ

ต่อไป ไปที่หน้า DynamoDB Console อีกทีลองเพิ่มข้อมูลดูสักตัว

คลิกที่ Create item

แล้วกด Save

ไปที่ Lambda Console

แล้วคลิก View logs in CloudWatch

คลิกที่ log ตัวล่าสุด

ดูจาก log แล้วเหมือน Java Lambda ของเราทำงานได้ เย้

เราจะได้ Stream จาก DynamoDB ซึ่งมี eventName = INSERT เราก็สามารถนำ Data ที่ได้ไปทำงานต่อไป จบปิ๊งครับ

--

--

Chiwa Kantawong (Pea)
Chiwa Kantawong (Pea)

Written by Chiwa Kantawong (Pea)

Software Development Expert at Central Tech

No responses yet