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 node and npm
- Install the Serverless Framework installed with an AWS account set up.
- 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 serverless-api-java-redis -p serverless-api-java-redis
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 adding an http endpoint as below:
functions:
hello:
handler: com.serverless.Handler
events:
- httpApi:
path: /hello
method: get
The Code
Update Handler.java as below:
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("us1-lasting-lion-32618.upstash.io", 32618, true);
jedis.auth("d5033b46dfbgheb6718f9dbbd2925");
Long value = jedis.incr("counter");
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 console.
Deploy and Run
First build your project with mvn clean install
. Then deploy to AWS with serverless deploy
. The last command will output the endpoint URL as below:
Serverless: Stack update finished...
Service Information
service: serverless-api-java-redis
stage: dev
region: us-east-1
stack: serverless-api-java-redis-dev
resources: 11
api keys:
None
endpoints:
GET - https://60tinzba0a.execute-api.us-east-1.amazonaws.com/hello
functions:
hello: serverless-api-java-redis-dev-hello
layers:
None