Amazon Web Services introduced Serverless Application Model, or SAM, a couple of months ago. It defines simplified syntax for expressing
serverless resources. SAM extendsĀ AWS CloudFormationĀ to add support for API Gateway, AWS Lambda and Amazon DynamoDB.Ā This blog will show how to create a simple microservice using
SAM. Of course, we’ll use Couchbase instead of DynamoDB! This blog will also use the basic concepts explained in Microservice using AWS API Gateway,Ā AWS Lambda and Couchbase.Ā SAM
will show the ease with which the entire stack for microservice can beĀ deployed andĀ managed.

As a refresher, here are key components in the architecture:

serverless-microservice

  • Client could be curl, AWS CLI/Console, Postman client or any other tool/API that can invoke a REST endpoint.
  • AWS API Gateway is used to provision APIs. The top level resource is available at path /books.Ā HTTP GET and POST methods areĀ published for the resource.
  • Each API triggers a Lambda function. Two Lambda functions are created,Ā book-listĀ function for listing all the books available and book-createĀ function to create a new book.
  • Couchbase is used as a persistence store in EC2. All theĀ JSON documents are stored and retrieved from this database.

Other blogs on serverless:

Let’s get started!

Serverless Application Model (SAM) Template

An AWS CloudFormation template with serverless resources conforming to the AWS SAM model is referred to as a SAM file or template. It is deployed
as a CloudFormation stack. Let’s take a look at our SAM template: This template is available atĀ github.com/arun-gupta/serverless/blob/master/aws/microservice/template.yml.

SAM template SpecificationĀ provide complete details about contents in the template. The key parts of the template are:

  • Defines two resources, both ofĀ Lambda Function type identified by AWS::Serverless::Function attribute. Name of the Lambda function is defined by Resources..
  • Class for each handler is defined by the value of Resources..Properties.Handler attribute
  • Java 8 runtime is used to run the Function defined by Resources..Properties.Runtime attribute
  • Code for the class is uploaded to an S3 bucket, in our case to s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar
  • Resources..Properties.Environment.Variables.COUCHBASE_HOST attribute value defines the host where Couchbase is running. This can be easily deployed on EC2 as explained at Setup Couchbase.
  • Each Lambda function is triggered by an API. It is deployed using AWS API Gateway. The path is defined by Events.GetResource.Properties.Path. HTTP method is defined using Events.GetResource.Properties.Method attribute.

JavaĀ Application

The Java application that contains the Lambda functions is atĀ github.com/arun-gupta/serverless/tree/master/aws/microservice/microservice-http-endpoint.
Lambda function thatĀ is triggered by HTTP GETĀ method is shown:

A little bit of explanation:

  • Each Lambda function needs to implement the interfaceĀ com.amazonaws.services.lambda.runtime.RequestHandler.
  • API Gateway and LambdaĀ integrationĀ require a specific input format and output format.
    These formats areĀ defined as GatewayRequest and GatewayResponse classes.
  • Function logic uses Couchbase Java SDKĀ to query the Couchbase database. N1QL query is used to query
    the database. The results and exception are then wrapped in GatewayRequest and GatewayResponse.

Lambda function triggered by HTTP POST method is pretty straightforward as well:

A bit of explanation:

  • Incoming request payload is retrieved from GatewayRequest
  • Document inserted in Couchbase is returned as response.
  • Like the previous method,Ā Function logic uses Couchbase Java SDKĀ to query the Couchbase database. The results and exception are then
    wrapped in GatewayRequest and GatewayResponse.

Build the Java application as:

Upload Lambda Function to S3

SAM template reads the code from an S3 bucket. Let’s create a S3 bucket:

us-west-2 region is one of the supported regions for API Gateway. S3 bucket names are globally unique but their location is region specific. Upload
the code to S3 bucket:

The code is now uploaded to S3 bucket. SAM template is ready to be deployed!

Deploy SAM Template

Deploy the SAM template:

It shows the output:

ThisĀ one command deploys Lambda functionsĀ and REST Resource/APIs that trigger these Lambda functions.

Invoke the Microservice

API Gateway publishes a REST API that can be invoked by curl, wget, AWS CLI/Console, Postman or any other app that can call a REST API. This blog will use AWS Console to show the interaction. API Gateway home atĀ us-west-2.console.aws.amazon.com/apigateway/home?region=us-west-2#/apis shows:
AWS SAM Microservice API
Click on the API to see all the APIs in this resource:

AWS SAM Microservice API Resources

Click on POST to see the default page for POST method execution:

AWS SAM Microservice API POST

Click on Test to test the API:

AWS SAM Microservice API POST Input

Add the payload in Request Body and click on Test to invokeĀ the API. The results are shown as below:

AWS SAM Microservice API POST Output

NowĀ click on GET to see the default execution page:

AWS SAM Microservice API GET

Click on Test to testĀ the API:

AWS SAM Microservice API GET Input

No request body is needed, just click on Test the invoke the API.Ā The results are as shown:

AWS SAM Microservice API GET Output

Output from the Couchbase database is shown in the Response Body.

References

Author

Posted by Arun Gupta, VP, Developer Advocacy, Couchbase

Arun Gupta is the vice president of developer advocacy at Couchbase. He has built and led developer communities for 10+ years at Sun, Oracle, and Red Hat. He has deep expertise in leading cross-functional teams to develop and execute strategy, planning and execution of content, marketing campaigns, and programs. Prior to that he led engineering teams at Sun and is a founding member of the Java EE team. Gupta has authored more than 2,000 blog posts on technology. He has extensive speaking experience in more than 40 countries on myriad topics and is a JavaOne Rock Star for three years in a row. Gupta also founded the Devoxx4Kids chapter in the US and continues to promote technology education among children. An author of several books on technology, an avid runner, a globe trotter, a Java Champion, a JUG leader, NetBeans Dream Team member, and a Docker Captain, he is easily accessible at @arungupta.

Leave a reply