Skip to main content

Spring Boot SNS Lambda

Description

In this example we will publish messages to an SNS topic, and Lambda from a Spring Boot application.

Prerequisites

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

.
├── 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
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
...
{"id":0,"firstName":"Jack","lastName":"Smith","age":30,"address":"Address02"}
{"id":0,"firstName":"John","lastName":"Doe","age":26,"address":"Address01"}