AWS Compute Blog
SquirrelBin: A Serverless Microservice Using AWS Lambda
Tim Wagner, AWS Lambda General Manager
Will Gaul, AWS Lambda Software Developer
With the recent release of Amazon API Gateway, developers can now create custom RESTful APIs that trigger AWS Lambda functions, allowing for truly serverless backends that include built-in authorization, traffic management, monitoring, and analytics. To showcase what’s possible with this new integration and just how easy it is to build a service that runs entirely without servers, we’ve built SquirrelBin, a simple website that allows users to CRUD runnable little nuggets of code called acorns. Let’s take a look at how we made SquirrelBin…
The SquirrelBin Architecture
The following diagram illustrates SquirrelBin’s architecture:
Notice what isn’t in the diagram above: servers. In fact, no infrastructure is required for any part of the experience.
There is a clean separation between data management and presentation. The website itself is a fully client-side single page app written in Angular and hosted statically on Amazon S3, with DNS managed by Amazon Route 53. To manage acorns, the app makes REST calls to Amazon API Gateway. These endpoints then trigger Lambda functions that either interact with SquirrelBin’s underlying Amazon DynamoDB acorn-store or run the actual acorn code. Because SquirrelBin’s API is on a completely separate Lambda-powered stack it would be easy to create additional clients, such as an iOS app that calls the Lambda functions via the AWS Mobile SDK, or an Alexa Skill that enables you to run acorns with your voice.
You might have noticed that the Lambda control plane consists of five functions, one for each CRUD operation. All of these functions are just instances of the new microservice-http-endpoint blueprint available now in the Lambda console:
Yep, we wrote no code for any of the CRUD operations for the site!
While identical, each function is each only responsible for handling requests for its respective endpoint. This architecture presents a number of advantages:
- Isolated deployments and failures: A problem with your API no longer takes down your entire backend. Each Lambda function operates individually and can be edited without affecting other functions.
- Per-endpoint analytics for free: Each function will publish metrics on request count, errors, and more to CloudWatch, enabling you to quickly answer questions like, “How many acorns have been created in the last 24 hours?”
- Modularity, simplicity, and separation of concerns: Because each function is only responsible for doing One Thing Well TM, it becomes easier to manage end-to-end configuration, code logic, and service integrations.
That covers the CRUD operations. Executing an acorn is just as easy: A simple version of code execution that supports nodejs can be written in just four lines of code:
exports.handler = function(event, context) {
if (event.language === 'javascript') context.succeed(eval(event.code.replace(/require/g, '')));
else context.fail('Language not supported');
};
Developing SquirrelBin
We began the development process with an understanding of our desired architecture and set up each component within minutes, all from within the AWS console. (In fact, the longest part of the backend setup was waiting for the DNS record to propagate!)
The website itself was developed in tandem, at first using hard-coded mock data and Angular’s $timeout service to simulate REST calls. Once the basic page layouts were complete we swapped in the API Gateway URL and began interacting with live data. In total, SquirrelBin runs in about 150 lines of client-side JavaScript. You can see the full source self-hosted on SquirrelBin here.
We hope that this post has illustrated the simplicity and power of serverless backends made possible with Amazon API Gateway and AWS Lambda, and has inspired you to try making your own!
Until next time, happy Lambda (and SquirrelBin) coding!
-Will and Tim