Spring Boot to AWS Lambda Serverless Migration

VerticalServe Blogs
3 min readAug 6, 2024

--

To convert a Spring Boot API to run on AWS Lambda, we need to make a few modifications to our existing application. Let’s go through the process step-by-step.

1. Update Dependencies

First, we need to add the AWS Lambda Java Core Library and the AWS Serverless Java Container for Spring Boot to our pom.xml:

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.amazonaws.serverless</groupId>
<artifactId>aws-serverless-java-container-spring</artifactId>
<version>1.9.1</version>
</dependency>

2. Create a Lambda Handler

Next, we need to create a Lambda handler class that will serve as the entry point for our application:

import com.amazonaws.serverless.exceptions.ContainerInitializationException;
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class LambdaHandler implements RequestStreamHandler {
private static SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;

static {
try {
handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class);
} catch (ContainerInitializationException e) {
e.printStackTrace();
throw new RuntimeException("Could not initialize Spring Boot application", e);
}
}

@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
handler.proxyStream(inputStream, outputStream, context);
}
}

3. Modify the Main Application Class

Update your main Application class to remove the main method:

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
// Remove the main method
}

4. Update Controller Mappings

Ensure your controller mappings are compatible with API Gateway. For example:

@RestController
@RequestMapping("/api")
public class ProductController {

@GetMapping("/products")
public List<Product> getAllProducts() {
// Implementation
}

@GetMapping("/products/{id}")
public Product getProductById(@PathVariable Long id) {
// Implementation
}

// Other endpoints...
}

5. Configure AWS SAM Template

Create a template.yaml file in your project root to define the AWS SAM (Serverless Application Model) template:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Spring Boot API on AWS Lambda

Resources:
SpringBootFunction:
Type: AWS::Serverless::Function
Properties:
Handler: com.example.LambdaHandler::handleRequest
Runtime: java11
CodeUri: target/your-application.jar
MemorySize: 512
Timeout: 30
Events:
ApiEvent:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY

Outputs:
ApiUrl:
Description: URL of the API endpoint
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"

6. Build the Application

Build your application using Maven:

mvn clean package

This will create a JAR file in the target directory.

7. Deploy to AWS Lambda

Use the AWS SAM CLI to deploy your application:

sam deploy --guided

Follow the prompts to configure your deployment settings.

8. Test the Deployed API

Once deployed, you can test your API using the URL provided in the SAM deployment output. Use tools like cURL or Postman to send requests to your API endpoints.For example:

curl https://your-api-id.execute-api.your-region.amazonaws.com/Prod/api/products

Conclusion

Converting a Spring Boot API to run on AWS Lambda involves several steps, including adding dependencies, creating a Lambda handler, and configuring the deployment. By following this guide, you can successfully migrate your Spring Boot application to a serverless architecture on AWS Lambda. Remember to optimize your application for serverless environments by minimizing cold start times and managing resources efficiently. Consider using AWS Lambda SnapStart for Java to improve startup performance.With these modifications, your Spring Boot API can now run as a serverless application on AWS Lambda, providing scalability and potentially reducing costs for your specific traffic patterns

About:

VerticalServe Inc — Niche Cloud, Data & AI/ML Premier Consulting Company, Partnered with Google Cloud, Confluent, AWS, Azure…60+ Customers and many success stories..

Website: http://www.VerticalServe.com

Contact: contact@verticalserve.com

Successful Case Studies: http://verticalserve.com/success-stories.html

InsightLake Solutions: Our pre built solutions — http://www.InsightLake.com

--

--

No responses yet