The Journey: Building a Serverless SaaS on AWS

James MillerJun 16th 2021

The perks of Serverless are pretty well known here in mid-2021. No servers to manage, paying only for what you use, you know the drill. When building Ready Five, we decided at the outset to use only Serverless services on AWS. No exceptions.

I'll be honest, the initial learning curve to hold to this constraint was intense. Our team is historically well-versed in developing, managing, and scaling Rails applications. Home to us is hundreds of EC2 instances, ActiveRecord callbacks for days, relational database migrations, server-rendered views, and breaking changes in Rails patch releases every few weeks. 🙃

Fast forward to today. No more MySQL, all in on DynamoDB. Forget the open-source visibility of Rack and Puma, now it's the black box of AppSync and API Gateway. No more tightly-coupled callback code, everything is event-driven with SNS and EventBridge. Views are all served statically from a React single-page app with data from a GraphQL endpoint. All business logic is compiled in Go binaries and invoked with Lambda.

Every bit is repeatably deployable with CloudFormation using infrastructure-as-code.

Why? Just for a challenge? The thrill of it? Nope. Our product is mission-critical. Customers expect unmatched reliability for their incident management software. We're a small team and chose to stand on the shoulders of giants instead of manage our own infrastructure. It allows us to deliver an incredible product built on stable and scalable services.

This series is all about the journey. From the frustrations, mistakes, and setbacks to finding the golden path and embracing the future. I hope a few of the bumps we hit make for smoother sailing for you.

We're going to get into the weeds with a collection of AWS services: DynamoDB, Lambda, Cognito, AppSync, API Gateway, CloudFormation & SAM, SNS, SQS, & EventBridge, and CloudWatch. We'll unpack the acronyms and have some fun.

Let's begin with how we dove into NoSQL with DynamoDB, forced to forget everything we know about normalized, relational data.