AWS in production
I design, deploy and run every system on this site myself, and almost all of it sits on AWS. This page is the inventory: each service, what it does for a real business, and how it is wired. Nothing here is a sandbox demo.
Rental Pilot
Rental software for any business that rents things out, white-labelled for companies in 18 industries, each on its own domain. The API runs on EC2, where I administer the server myself. About Rental Pilot
How it is wired
Edge
Each company on its own domain.
- Route 53DNS, SPF, DKIM, DMARC and CAA
- CloudFront SaaSone multi-tenant distribution, a tenant per company
- Certificate Managera certificate for every tenant domain
- Response headers policyHSTS and security headers at the edge
Compute
The servers I run.
Data and AI
What the API calls.
- MySQL on EC2production and a scrubbed sandbox, never shared
- EBS snapshotsscheduled by Data Lifecycle Manager
- Amazon BedrockRadar and the website assistants
- SESinvoices, notices and alerts
Operations
How it ships and stays up.
- CodeCommitsource for the API and the apps
- CodePipeline and CodeDeployevery push to main lands on the test server
- CloudWatchmemory and swap alarms on the server
- AWS CLIscripted, guarded production deploys
Service by service
CloudFront SaaS (multi-tenant)
Each rental company gets the app on its own address, app.{their domain}.
One multi-tenant distribution serves every tenant. A new company is a new tenant with its own domain and certificate, not a new stack.
Try it with your business nameEC2
The Rental Pilot API, its MySQL databases and the real-time chat server.
One Ubuntu instance behind Apache. Production and the sandbox share the box but never a database; the sandbox is refreshed from a production snapshot with customer emails scrubbed.
S3 and CloudFront
The React web app and the customer portal.
Every deploy builds, syncs to S3, invalidates CloudFront and runs a smoke suite against production before it counts as done.
CodeCommit, CodePipeline and CodeDeploy
Source control and the test server.
Every push to main deploys itself to the test server. Production is a separate, deliberate deploy that refuses to run from anything but the tip of main.
Amazon Bedrock
Radar, the help assistant inside the app, and the assistants on three company websites.
Claude with tool use: Radar searches the help guides and files a problem report only after the person agrees. Every question is logged with its cost, under a daily spend cap.
SES
Invoices, delivery and return notices, and alerts.
Production sends live. The sandbox never does: its mail queues for approval, and its customer addresses are scrubbed so a test can never reach a real customer.
Route 53
DNS for the company domains.
SPF, DKIM and DMARC on every domain, with DMARC and TLS reports flowing back; CAA records name the only authorities allowed to issue certificates.
CloudFront response headers policies
Security headers on every app host.
HSTS, nosniff, frame and referrer rules applied at the edge, so no app build can forget them.
See the security pageWorkMail
Company mailboxes.
Hosted mail for the businesses I run systems for, on their own domains. AWS retires WorkMail on 31 March 2027, so these are moving next.
WorkMail migrationCloudWatch
Server health.
Memory and swap alarms on the API server email me before a slowdown becomes an outage.
Lend Pilot
Software for private mortgage lenders, in its own AWS account. About Lend Pilot
How it is wired
Edge
Each lender on its own domain, set up by the app.
- Route 53the app writes each tenant's DNS records
- CloudFront SaaSthe app creates a distribution tenant per lender
- Certificate Managera managed certificate per lender domain
- nginx and Let's EncryptTLS on the origin
Compute
One server, many lenders.
- EC2its own instance, in its own region
- Docker ComposeAPI, web app and database as one unit
- Schedulerdomain activation, reminders, renewal drips
Data and AI
What the API calls.
- PostgreSQLrow-level multi-tenancy
- Claudereads borrower documents; math stays in code
- SESsign-in links, campaigns and the comms outbox
Operations
How it ships.
- CodeCommitsource
- Deploy scriptsync, rebuild, migrate, smoke-test
- Smoke suiteruns against production after every deploy
Service by service
CloudFront SaaS, Route 53 and Certificate Manager, automated
A lender types in their domain and the app does the rest.
The API writes the DNS records in Route 53, creates a CloudFront distribution tenant with a managed certificate, and switches the domain on once CloudFront is serving it. No ticket, no console.
EC2 with Docker Compose
The Node and Express API, PostgreSQL and the web app.
Containers on one instance behind nginx, so the whole product starts, stops and upgrades as one unit.
SES
Sign-in links, reminders, renewal drips and campaigns.
Every message goes through a status-tracked outbox with retries, so a failed send is recorded and retried, never silently lost.
Super Sonic Stucco and the company websites
The stucco company's job app and the two company websites, on the same server as Rental Pilot.
How it is wired
Edge
Three public addresses.
- Route 53DNS with SPF, DKIM, DMARC and CAA
- Let's EncryptTLS for every host
- Apachesecurity headers, no directory listings, no version banners
Compute
Shares the Rental Pilot server.
Data and AI
What they call.
- MySQLthe job app and both WordPress sites
- Amazon Bedrockan assistant on each website
- WorkMailthe companies' mailboxes
- SESoutgoing app email
Operations
How it stays up.
- Deploy scriptlocked, so two deploys never interleave; md5-verified
- CloudWatchalarms that caught a WordPress login-flood
- EBS snapshotsthe same scheduled backups
Service by service
EC2
The stucco company's job app and both company websites.
They share the Rental Pilot server under separate Apache sites. Deploys go through a locked script and are verified by checksum on the server.
Amazon Bedrock
Assistants on supersonicstucco.ca and supersonicrentals.ca.
They answer visitors from each site's own content. Repeat questions get a saved answer at no cost, and every question reaches a person.
WorkMail and SES
Company mailboxes and outgoing mail.
Mailboxes on WorkMail; application mail through SES, with SPF, DKIM and DMARC on every domain so it lands in the inbox.
Small sites for pennies a month
Not every client needs a server. A school or a non-profit gets a fast, secure site on S3 and CloudFront that costs well under a dollar a month to host, plus the domain.
How it is wired
Edge
Fast everywhere, HTTPS only.
- CloudFrontcached at the edge, HTTPS enforced
- Certificate Managera free, auto-renewing certificate
- Route 53 or the registrarDNS pointing at CloudFront
Storage
No server at all.
- S3the whole site as static files
- CloudFront in frontthe bucket is never the public address
Build
Plain files out.
- Next.js static exportRail & Sail: pages built ahead of time
- Hand-written HTMLZero Cut: twelve pages, one stylesheet
Operations
One command.
- Deploy scriptsync to S3, then invalidate CloudFront
- Nothing to patchno server, no plugins, no database
Two examples
Rail & Sail Montessori House
A Richmond preschool, built from the school's own documents.
Eight pages in Next.js, exported to static files and served from S3 through CloudFront, with DNS in Route 53, all in the school's own AWS account so they own it outright.
railandsailmh.caZero Cut Disability Society
A BC non-profit helping people claim the Disability Tax Credit without paying a promoter's cut.
Twelve hand-written pages with no framework and no third-party requests at all: no fonts, analytics or trackers, enforced by a Content Security Policy. Accessible to WCAG 2.2 AA, served from S3 through CloudFront.
zerocuttaxsociety.ca
This site
Serverless on purpose: no EC2, nothing to patch, and it costs a few dollars a month. Most pages let you watch it happen. Watch it live
Right now
Reading CloudWatch…
Trace your own request
Press the button and your browser makes a real request: through CloudFront to a Lambda function that reads DynamoDB, with AWS X-Ray tracing it. Then this page asks X-Ray for that exact trace and draws it.
How it is wired
Edge
Where a visitor meets AWS.
- Route 53DNS, CAA locked to Amazon certificates
- CloudFrontprivate S3 origin, security headers, hash-only CSP
- CloudFront Functionsanswers /edge/hello in milliseconds, no origin
- KeyValueStorefeature switches flipped from my phone
- Certificate ManagerTLS for every hostname
Compute
Code that runs only when asked.
- Lambda function URLsfive functions, reachable only through CloudFront
- API Gateway WebSocketstreams my build log live
- S3the static site and the deploy artifacts
Data and AI
What the functions call.
- Amazon BedrockClaude for the agent and the build crew
- Bedrock Guardrailschecks every question and answer
- DynamoDBvisits, saved answers, votes, logs, with TTL
- Textractreads receipts
- Pollyspeaks the agent's answers
- Cost Explorerthe real bill, twice a day
Operations
How I know it is working.
- EventBridgehealth checks every five minutes
- CloudWatchlogs and seven alarms
- SNSalarms to my phone and inbox
- Budgetsan alert before the month runs over
- CloudFormationthe whole stack, one deploy script
- IAMone least-privilege role per function
Service by service
Lambda
Every dynamic thing on this site: the visitor map, the agent, the build crew, the tools and the feature switches.
Five Node 22 functions on Graviton. Their URLs answer only CloudFront, through an Origin Access Control, so POST bodies are signed and nothing can call them directly.
Amazon Bedrock and Guardrails
Ask my agent, and five Claude agents that build a mini app while you watch.
Answers stream as they are written. A guardrail checks every question and answer, and good answers are saved so the next person asking gets them instantly, at no cost.
Ask my agentDynamoDB
Who is on the site right now, saved answers and votes, and the activity log.
One table, keyed by kind of record, with time-to-live so old visits clean themselves up.
CloudFront Functions and KeyValueStore
A hello at the edge, and switches I flip from my phone.
The function reads the switches and your city at the nearest edge location and answers without calling any server. During re:Invent it adds a banner for visitors in Las Vegas.
See the edge answerAPI Gateway WebSocket
The build log, live.
My coding sessions report what they are doing, and the page receives it as it happens over a WebSocket API.
Open the build logTextract
Read a receipt.
Expense analysis finds the vendor, line items and total, and the page draws boxes on your own photo where each one was found.
Try itPolly
The agent, out loud.
Answers are read by a generative voice one sentence at a time, so speech starts before the answer is finished.
Cost Explorer and Budgets
The real bill, on a public page.
The month to date is pulled twice a day and shown on the glass box; a budget alarm emails me well before the limit.
See this month's billEventBridge
Status checks.
Every five minutes a scheduled rule checks every production system I run and records the result; an outage reaches my phone.
Status pageCloudWatch and SNS
Errors and alarms.
Seven alarms feed one topic that reaches my phone and my inbox. Error alerts are capped per function per hour, so one bad minute never becomes a hundred notifications.
SES
Email for mervinc.ca.
Inbound mail lands in S3 through a receipt rule; a Lambda rewrites the headers so it passes SPF and DMARC, and forwards it to my inbox.
CloudFormation and IAM
All of it, reproducibly.
The dynamic half of the site is one template, deployed by one script, with a separate least-privilege role for each function.
Running all of this costs a few dollars a month, and the bill is on the glass box page for anyone to check.
Well-Architected, pillar by pillar
AWS's own six-part yardstick for a workload, applied to this site, with the proof one click away. Where a number can be live, it is.
Operational excellence
- The dynamic half of this site is one CloudFormation template, deployed by one script.
- Deploys refuse to run from anything but a clean tip of main.
- Every production system is probed every five minutes; alarms reach my phone.
Security
- Security headers and a hash-only Content Security Policy at the edge.
- Function URLs answer only CloudFront, through an Origin Access Control.
- One least-privilege IAM role per function; a Bedrock guardrail on every question and answer.
Reliability
- Serverless functions and on-demand DynamoDB, so there is no server to fall over.
- Probes run in AWS, outside the systems they check, so a dead server cannot vouch for itself.
- The edge answers some requests with no origin at all.
Performance efficiency
- Lambda functions on Graviton (arm64).
- Static pages cached at CloudFront edge locations near each visitor.
- Answers stream as they are written instead of arriving all at once.
Cost optimization
- Everything is pay-per-request: nothing bills while nobody is visiting.
- A budget alarm emails me well before the limit.
- The bill is public on this site, pulled from Cost Explorer twice a day.
Sustainability
- Graviton processors and serverless functions that scale to zero between requests.
- Pages and images are small and cached at the edge, so most requests never reach a function.
- Static sites for small clients run on S3 and CloudFront with no server at all.
The template behind it
The dynamic half of this site is infrastructure as code: one CloudFormation template, the real one, deployed by one script. Pick any resource to see what it is, what it depends on and its exact YAML. Download the full template.
Loading the template…
Pick a resource on the left.
At re:Invent?
I'd like to hear what you're running on AWS. Get in touch, or ask my agent anything on this page.