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