In this post, we want to guide you through our complete setup for our custom video platform.
Our CloudWatch Book's Video Section
This starts from the purchase to actually accessing our custom build video-access platform.
Overview about our CloudWatch Book Landing Page & Video Platform Architecture
We'll explain why we decided against a third-party solution for our video section and built something on our own with SST, Next.js, Lambda, and Vimeo.
Preface
We launched our first educational book about AWS, AWS Fundamentals ๐, at the start of 2023. While it includes many visuals, it neither comes with deployable code nor hands-on video tutorials.
For our second book, The CloudWatch Book ๐, we aimed higher. The book comes with hands-on application that can be deployed on AWS. Along this, there are videos where we explore CloudWatch features ๐ฅ.
For delivering videos, we looked for the most convenient way for us and the users.
Why Custom & Serverless?
We opted for a custom solution to avoid restrictions and maintain full control, integrating seamlessly with ๐จ ConvertKit and LemonSqueezy. A Serverless approach was ideal for us - we know the services very well and Lambda comes with basically zero operations and low-to-zero costs (in our case).
Overview of Technologies
We utilized a modern tech stack:
SST: A framework for building serverless applications on AWS, simplifying deployments and management immensely. Deploying a Lambda function with an API Gateway? Not more than a few lines of code. SST will take care of the heavy lifting.
Next.js: A React framework for fast, user-friendly web applications, natively supported by SST. Also enables you to run code on the server side. This means you can access AWS resources without creating APIs. Next.js will take care of this and SST will deploy the server-side code to Lambda@Edge functions.
Architecture Overview
Our architecture includes:
Customer Purchase Flow: Users buy the package on cloudwatchbook.com. A successful payment triggers a webhook-based Lambda function to generate a personalized access token stored in DynamoDB and ConvertKit.
Personalized Video Access Link Notification: The token links to the userโs purchase, allowing unique access to video content. An automated email is sent with the access link.
Video Platform Access and Content Delivery: Users access the platform with a validated token, loading embedded Vimeo links.
Weโve managed to keep AWS costs close to zero, only paying for Vimeo. ๐
Building the Platform
Let's dive into these three main components that made up everything from purchasing the book to accessing our videos.
Customer Purchase Flow
After the payment completes in LemonSqueezy, we'll receive an order_created webhook to our Lambda function.
Purchase Flow
This function will take care of storing the necessary information both on ConvertKit side, as well as in our own DynamoDB table.
Storing Customer Data received from LemonSqueezy
We'll generate an access token which can be later used to access the video section.
Personalized Video Access Link Notification
We send an email with the personalized link using ConvertKitโs Visual Automation based on custom fields and a uniquely assigned tag in the previous step.
Sending out the Links to access our Platform
The subscriber will automatically join the flow and receive the email with the link that contains the personalized access token.
Video Platform Access and Content Delivery
Users access the platform with their link and we'll validate their token via a Lambda function and the data in our DynamoDB table, which will finally retrieve the video links from Vimeo.
Actually accessing our Platform
What we'll also do: we track views and follow up with users who havenโt accessed content within 30 days. This way, we can get feedback if there's an issue with the platform or if the content is not as expected.
Where to Go from Here
Weโre thrilled with our custom platform, which allows for future enhancements like:
Motivational animations for video completions.
Custom โcompletion badgesโ for users.
Feedback forms for user issues.
... and much more.
Conclusion
That's already it! ๐
We shared how we built a serverless video platform for our CloudWatch Book using SST, Next.js, ConvertKit, LemonSqueezy, and Vimeo. This custom solution provides control, flexibility, and cost-effectiveness.
We encourage you to explore building your own serverless platform.
Even though we still reside in a "buy before build" mindset, many custom setups do make sense to connect the dots between multiple platforms!
P.S.: We're on the AWS Community Days in Romania! ๐ท๐ด Sandro will be on stage to give a talk about Hashnode's journey with GraphQL ๐ฃ๏ธ If you're also there in person, please come and talk to us! ๐
AWS FOR THE REAL WORLD โฑ๏ธ Reading time: 6 minutes ๐ฏ Main Learning: You cannot skip a level of AWS observability. Structured logs come first, then the AI agent that reads them for you. ๐ Blog Post ๐ Claude Code agent (free gist) ๐ฌ Watch on YouTube Hey Reader ๐๐ฝ This week I'm bringing back one of our most-read posts: the 3 levels of AWS observability. A lot of you joined after it went out in May, and the topic fits this week perfectly. Because the real question isn't "do I have logs?" anymore....
AWS FOR THE REAL WORLD โฑ๏ธ Reading time: 10 minutes ๐ฏ Main Learning: Every convenience layer AWS built on ECS is dead or dying, while ECS itself has not changed since 2014. Build on the primitive, and make the layer above it prove itself first. ๐ Blog Post Hey Reader ๐๐ฝ Getting started with an AWS service often feels more complicated than it should. Four concepts must be understood before a single container runs. A VPC is required before a single request. So, the fancy CLI that promises to do...
โฑ๏ธ Reading time: 21 minutes ๐ฏ Main Learning: Same CloudFront logs: 12.5s through Kinesis, S3, Glue and Athena, about 1s through Tinybird's managed ClickHouse. ๐ Blog Post Hey Reader ๐๐ฝ We've been running Plausible for the analytics on awsfundamentals.com. Good software, no complaints. We still wanted the data to be ours: our retention, our schema, nobody's script in the visitor's browser. So we built the dashboard ourselves. Twice, on two different backends, fed by the same CloudFront logs....