How I Over-Engineered a Simple Project (And What I Should’ve Done Instead)
Lessons from building a small app with enterprise-grade AWS architecture

All I wanted was a small web service. Nothing complex. Just something that:
- Pulled data from a few sources
- Cobbled it together
- Saved the results somewhere
- Exposed it via a simple REST API
That’s it. I didn’t need a UI. I didn’t have users. I didn’t even need a custom domain.
Naturally, I created it with:
- ECS on Fargate
- RDS (Postgres)
- Multiple Lambda functions
- API Gateway
- CodeBuild and CodeDeploy
- Terraform to orchestrate all of it
- And a decent chunk of time figuring out IAM
Total spend? Approximately $564 in one month.
I’m not saying that I regret it. But I’m not not saying that either.
The App That Didn’t Need a Platform
Looking back, here’s what my app actually needed:
- A way to periodically fetch and transform external data
- A place to store that data
- An endpoint or two to query it
And a code repo.
That’s the whole thing. This could’ve run on a Raspberry Pi. Instead, I spun up a modest slice of AWS’s managed cloud galaxy.
Why Did I Do It This Way?
Because I’m a developer.
Because it felt right to use infrastructure-as-code, CI/CD pipelines, and modular services.
Because AWS makes it so easy to add “just one more thing.”
Because at some point, I stopped asking what the app needed and started asking what I could justify using.
What I Actually Used
Component | Service | Why I Used It |
---|---|---|
Compute | ECS (Fargate) | Persistent backend. Containers are cool |
Data | RDS (PostgreSQL) | Because I like relational databases |
Backend logic | Lambda | For async fetch jobs |
API layer | API Gateway | To expose the REST endpoints |
CI/CD | CodeBuild/Deploy | To auto-deploy from git |
Infra Management | Terraform | For reproducibility and sanity (mostly) |
In isolation, all of these choices are defensible. Together, they’re… a bit much.
What I Could’ve Used Instead
This could have all been done for free, using the following tools:
- Lambda for all logic (including scheduled jobs and API)
- DynamoDB or even S3 for storage (if relational data wasn’t crucial)
- API Gateway to expose endpoints
- GitHub Actions to deploy using
aws-cli
- CloudWatch for logs, if I felt like squinting
No ECS. No RDS. No Terraform. No money down.
AWS Free Tier: What’s Actually Free?
A surprising amount, honestly — as long as you stay within the limits:
Service | Free Tier Allocation | Notes |
---|---|---|
Lambda | 1M requests + 400,000 GB-seconds/month | Perfect for light workloads |
API Gateway | 1M HTTP API calls/month | REST APIs are slightly more expensive |
DynamoDB | 25GB storage, 200M reads, 2.5M writes/month | Enough for most small applications |
S3 | 5GB standard storage + 20K GETs, 2K PUTs | Great for static assets or backups |
CloudFront | 1TB data transfer out | Enough unless you’re going viral |
CloudWatch | 5GB logs + 10 custom metrics/month | Just enough to know what’s broken |
Cognito | 50K monthly active users | Free login system |
CodeBuild | 100 build minutes/month (12 months only) | Use GitHub Actions if you go over |
EC2 | t2.micro or t3.micro for 750 hours/month | 12-month limited, Linux only |
Adding a Custom Domain (The First Real Expense)
Here’s where the free ride ends:
- Domain registration: Not covered by AWS Free Tier. $10–15/year via Route 53 or other registrars.
- Hosted zones (Route 53): $0.50/month per domain + query fees
- SSL certs: Free via AWS Certificate Manager
- Custom domain mapping for API Gateway: Free-ish, but a bit of setup required
If you’re just doing this for yourself, you don’t need a custom domain. But if you’re going public-facing or demoing something, it does add polish.
What I Learned (That I Knew All Along)
- Just because you can build it like it’s going to handle millions of users doesn’t mean you should
- Terraform is great… until you need to destroy just one thing
- CI/CD is more satisfying than useful when you’re the only dev
- AWS bills are sneaky — especially when you forget to turn things off
- The real MVP is the simplest possible thing that does the job
Final Thoughts
I built it like I was launching a startup. I wasn’t.
But honestly? I had fun. I learned a lot. And now I have this post as a souvenir.
If you’re starting a small project and just want to build something that works, don’t get seduced by shiny services. Unless, of course, you’re also doing it for the fun of it — in which case, carry on.
And set a billing alarm.