Contents

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.