Amazon DynamoDB Streams and Java AWS Lambda
บทความนี้เราจะไม่กล่าวถึงวิธีการใช้งาน 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 ที่ได้ไปทำงานต่อไป จบปิ๊งครับ