In this project, we are going to use LocalStack to simulate locally, some services provided by AWS Cloud such as: DynamoDB, Lambda, SNS and SQS.
-
Spring BootJava Web application that exposes a REST API to manage news.It has the following endpoints:
GET /api/news GET /api/news/{id} POST /api/news {"title": "..."} DELETE /api/news/{id} -
Spring Cloud Functionapplication that usesAWS Adapterto convert it to a form that can run inAWS Lambda.dynamodb-lambda-functionlistens to events emitted by an event-source created to monitor changes inDynamoDB. Once it receives an event, it processes it and publishes a new event toSNS. -
Spring BootJava Web application that consumes the events thatdynamodb-lambda-functionpublishes toSNS. These events are queued in aSQS.
-
In a terminal, make sure you inside
springboot-aws-localstack-dynamodb-lambda-sns-sqsroot folder -
Run the following script
./package-dynamodb-lambda-function-jar.shWhen
Mavenpackaging finishes, the jar file generated indynamodb-lambda-function/targetfolder is copied todynamodb-lambda-function/sharedfolder
-
In a terminal, make sure you are in inside
springboot-aws-localstack-dynamodb-lambda-sns-sqsroot folder -
Start
LocalStackDocker containerDEBUG=1 docker-compose up -d -
[Optional] Debug logs are enabled so that we have more insights about what is happening. To monitor
localstackDocker container logs, run the command belowdocker logs localstack -f -
Initialize
LocalStackby running the following script./init-localstack.shThe script will create:
- create
news-topicinSNS; - create
news-consumer-queueinSQS; - subscribe
news-consumer-queuetonews-topic; - create
Newstable inDynamoDB; - create
ProcessDynamoDBEventLambda function; - create an
event-source-mappingto connectDynamoDBtoProcessDynamoDBEventLambda function.
Warning: it takes around 5 minutes for the
ProcessDynamoDBEventLambda function to have anActivestate. - create
-
news-producer
In a terminal and, inside
springboot-aws-localstack-dynamodb-lambda-sns-sqsroot folder, run the following command./mvnw clean spring-boot:run --projects news-producer -Dspring-boot.run.jvmArguments="-Daws.accessKey=key -Daws.secretAccessKey=secret" -
news-consumer
In another terminal and, inside
springboot-aws-localstack-dynamodb-lambda-sns-sqsroot folder, run the command below./mvnw clean spring-boot:run --projects news-consumer -Dspring-boot.run.jvmArguments="-Daws.accessKey=key -Daws.secretAccessKey=secret"
-
In a terminal and, inside
springboot-aws-localstack-dynamodb-lambda-sns-sqsroot folder, run the following script./docker-build.sh -
-
news-producer
In a terminal, run the following command
docker run --rm --name news-producer -p 9080:9080 \ -e AWS_ACCESS_KEY=key -e AWS_SECRET_ACCESS_KEY=secret \ --network=springboot-aws-localstack-dynamodb-lambda-sns-sqs_default \ ivanfranchin/news-producer:1.0.0 -
news-consumer
In a new terminal, run the command below
docker run --rm --name news-consumer -p 9081:9081 \ -e AWS_ACCESS_KEY=key -e AWS_SECRET_ACCESS_KEY=secret \ -e NEWS_PRODUCER_URL=http://news-producer:9080 \ --network=springboot-aws-localstack-dynamodb-lambda-sns-sqs_default \ ivanfranchin/news-consumer:1.0.0
-
| Application | Type | URL |
|---|---|---|
news-producer |
Swagger | http://localhost:9080/swagger-ui.html |
news-consumer |
UI | http://localhost:9081 |
-
Creating news
-
In a terminal, run the following command
curl -i -X POST http://localhost:9080/api/news \ -H 'Content-Type: application/json' \ -d '{"title": "Palmeiras is three-time champion of the Copa Libertadores da América"}'or to create news randomly
curl -i -X POST http://localhost:9080/api/news/randomly -
In
news-consumerUI, the news should be displayed
-
-
Deleting news
-
In a terminal, run the following command
curl -i -X DELETE http://localhost:9080/api/news/<NEWS-ID> -
In
news-consumerUI, the news should be removed
-
In the GIF below, we use news-producer Swagger UI to create one random news. Then, we delete the news created previously. Finally, we create more two news randomly.
- To stop applications, go to the terminal where they are running and press
Ctrl+C - To stop and remove
docker-composecontainers, network and volumes, go to a terminal and, insidespringboot-aws-localstack-dynamodb-lambda-sns-sqsroot folder, run the following commanddocker-compose down -v
To remove the Docker images created by this project, go to a terminal and, inside springboot-aws-localstack-dynamodb-lambda-sns-sqs root folder, run the script below
./remove-docker-images.sh
This is a project that @ivangfr had created. I merely forked to obtain an understanding of various AWS services

