In this tutorial, we will build a stateful serverless API using Java and Redis
on AWS Lambda. The API will simply count the page views and return it as HTTP
response.
Prerequisites
- Install the Serverless Framework installed with an AWS account set up.
npm i serverless@3.39.0 -g
- Install JDK and not Java JRE. Set your JAVA_HOME.
- Install Apache Maven.
- Create a free Serverless Redis database from
Upstash as described
here.
Project Setup
Create the project:
serverless create --template aws-java-maven --name counter-api -p aws-java-counter-api
Add jedis
as dependency to the pom.xml
:
...
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
...
Update serverless.yml
as below:
service: counter-api
frameworkVersion: '3'
provider:
name: aws
runtime: java17
package:
artifact: target/hello-dev.jar
functions:
hello:
handler: com.serverless.Handler
events:
- httpApi:
path: /hello
method: get
Counter Function Setup
Update src/main/java/com/serverless/Handler.java
as below:
src/main/java/com/serverless/Handler.java
package com.serverless;
import java.util.Map;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import redis.clients.jedis.Jedis;
public class Handler implements RequestHandler<Map<String, Object>, ApiGatewayResponse> {
@Override
public ApiGatewayResponse handleRequest(Map<String, Object> input, Context context) {
Jedis jedis = new Jedis("lasting-roughy-29092.upstash.io", 6379, true);
jedis.auth("********");
Long value = jedis.incr("counter");
jedis.close();
String message = "Hello World, Count:" + value;
return ApiGatewayResponse.builder()
.setStatusCode(200)
.setObjectBody(message)
.build();
}
}
In the above code, you need to replace your Redis endpoint and password. You can copy Jedis connection code from the Upstash Redis Console -> Your Database -> Connect to your database -> Java.
Build and Deploy
Build your project:
Deploy to AWS:
Visit the output URL to see the counter in action.