Spring Boot SNS Lambda
Description
In this example we will publish messages to an SNS topic, and Lambda from a Spring Boot application.
Prerequisites
- JDK 21
- Maven 3.8.5+
- Spring Boot, version 3+
- LocalStack
- Docker - for running LocalStack
- AWS CLI and awslocal
Run LocalStack
version: '3.8'
services:
localstack:
image: localstack/localstack
container_name: localstack_main
ports:
- "4566-4599:4566-4599"
environment:
- SERVICES=sns,s3,sqs,dynamodb,ses,lambda,logs,stepfunctions
- DYNAMODB_SHARE_DB=1
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
- DOCKER_HOST=unix:///var/run/docker.sock
volumes:
- "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
Create Topic
awslocal sns create-topic --name localstack-topic --region us-east-1
Create a Subscription
awslocal sns subscribe \
--region us-east-1 \
--protocol lambda \
--topic-arn arn:aws:sns:us-east-1:000000000000:localstack-topic \
--notification-endpoint arn:aws:lambda:us-east-1:000000000000:function:localstack-lambda-sns
Project Structure
-
Source Code: https://github.com/ZbCiok/zjc-examples/tree/main/aws/aws/sns/spring-boot-sns-lambda
-
Project Structure:
.
├── sns-lambda
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ └── example
│ │ │ │ ├── Main.java
│ │ │ │ └── SnsRequestHandler.java
│ │ │ └── resources
│ │ └── test
│ │ └── java
│ └── target
│ ├── classes
│ ├── original-sns-trigger-lambda-0.0.1.jar
│ ├── sns-trigger-lambda-0.0.1.jar
│ └── test-classes
|
└── spring-boot-sns-lambda
├── mvnw
├── mvnw.cmd
├── pom.xml
├── README.md
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── jreact
│ │ │ └── sns
│ │ │ ├── PersonRequest.java
│ │ │ ├── SNSAppConfig.java
│ │ │ └── SNSApp.java
│ │ └── resources
│ │ └── application.properties
│ └── test
│ └── java
└── target
-
Lambda Function
https://github.com/ZbCiok/zjc-examples/tree/main/aws/aws/sns/spring-boot-sns-lambda/sns-lambda
package com.example;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SNSEvent;
import java.util.List;
import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;
import lombok.extern.java.Log;
import java.util.Iterator;
@Log
public class SnsRequestHandler implements RequestHandler<SNSEvent, Boolean> {
LambdaLogger logger;
private SNSEvent event;
@Override
public Boolean handleRequest(SNSEvent event, Context context) {
log.info(">>> start handleRequest...");
logger = context.getLogger();
List<SNSRecord> records = event.getRecords();
if (!records.isEmpty()) {
Iterator<SNSRecord> recordsIter = records.iterator();
while (recordsIter.hasNext()) {
processRecord(recordsIter.next());
}
}
return Boolean.TRUE;
}
public void processRecord(SNSRecord record) {
try {
String message = record.getSNS().getMessage();
logger.log(">>> message: " + message);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} -
Run Lambda Function
awslocal lambda create-function \
--region us-east-1 \
--function-name localstack-lambda-sns \
--runtime java21 \
--zip-file fileb://sns-trigger-lambda-0.0.1.jar \
--handler com.example.SnsRequestHandler \
--role arn:aws:iam::000000000000:role/example-lambda-noop-role \
--timeout 120
-
Spring Boot
https://github.com/ZbCiok/zjc-examples/tree/main/aws/aws/sns/spring-boot-sns-lambda/spring-boot-sns-lambda
mvn clean install
mvn spring-boot:run
-
Output (Docker Log):
...
localstack_main | 2024-10-07T15:06:10.577 DEBUG --- [ns:$LATEST_1] l.s.l.i.version_manager : [localstack-lambda-sns-9977d26f-34e3-4fd8-b718-488404fe7eb3] INFO: >>> start handleRequest...
localstack_main | 2024-10-07T15:06:10.577 DEBUG --- [ns:$LATEST_1] l.s.l.i.version_manager : [localstack-lambda-sns-9977d26f-34e3-4fd8-b718-488404fe7eb3] >>> message: {"id":0,"firstName":"Jack","lastName":"Smith","age":30,"address":"Address02"}END RequestId: 9977d26f-34e3-4fd8-b718-488404fe7eb3
...
localstack_main | 2024-10-07T15:06:10.602 DEBUG --- [ns:$LATEST_0] l.s.l.i.version_manager : [localstack-lambda-sns-d762704c-0d15-4dee-9b45-543fb9193d6e] INFO: >>> start handleRequest...
localstack_main | 2024-10-07T15:06:10.602 DEBUG --- [ns:$LATEST_0] l.s.l.i.version_manager : [localstack-lambda-sns-d762704c-0d15-4dee-9b45-543fb9193d6e] >>> message: {"id":0,"firstName":"John","lastName":"Doe","age":26,"address":"Address01"}END RequestId: d762704c-0d15-4dee-9b45-543fb9193d6e
...
-
Notice:
{"id":0,"firstName":"Jack","lastName":"Smith","age":30,"address":"Address02"}
{"id":0,"firstName":"John","lastName":"Doe","age":26,"address":"Address01"}
📄️ Spring Boot Message to SNS
Description
📄️ Spring Boot SNS Lambda
Description