← Articles

April 4, 2026 · Tim Fraser, Cloud Operations Lead

How to Keep AWS Costs Under Control as Your Startup Scales

In the early days, AWS costs are manageable. You're running a couple of instances, one database, maybe a load balancer. The monthly bill is $300 and nobody thinks about it.

Then you hire more engineers. You add a staging environment. Someone spins up a bigger instance "temporarily." Traffic grows. Data accumulates. A year later, you're spending $5,000/month and nobody can explain where the last $2,000 came from.

This is the normal trajectory for every growing startup. The good news is that most AWS cost problems are predictable and preventable — if you know what to watch for.

Set up billing alerts before anything else

This takes five minutes and has saved more startups from bill shock than any other single action.

Go to CloudWatch > Alarms > Billing and create alerts at thresholds that matter to you. If you're spending $500/month now, set alerts at $600, $800, and $1,000. Adjust them quarterly as your baseline changes.

Also enable AWS Budgets for a monthly budget with forecasted alerts — these warn you mid-month if you're on track to exceed your budget, not just after you've already blown through it.

The costs that sneak up

Some AWS costs scale linearly with your usage. Those are fine — more customers means more revenue to cover them. The dangerous costs are the ones that grow silently without a corresponding increase in value.

Data transfer. AWS charges for data leaving your VPC. Within a single availability zone, it's free. Between AZs, it's $0.01/GB. To the internet, it's $0.09/GB. If your application servers are in ap-southeast-2a and your database is in ap-southeast-2b, every database query generates cross-AZ data transfer charges. At scale, this adds up fast. Keep tightly coupled services in the same AZ, and use VPC endpoints for AWS service traffic. Idle and forgotten resources. That test instance from three months ago. The EBS volumes left behind when someone terminated an instance. The Elastic IP that's not attached to anything (AWS charges $3.65/month for unused Elastic IPs since 2024). Snapshots accumulating without a lifecycle policy. Individually small, collectively significant. Oversized databases. RDS pricing is driven by instance size, and most startups over-provision their database "just in case." A db.r6g.xlarge costs roughly $550/month. A db.t4g.medium costs roughly $60/month. Check your actual CPU and memory utilisation before picking a size — CloudWatch has the metrics. NAT Gateway data processing. If you're using a NAT Gateway, you pay $0.045 per GB processed on top of the hourly charge. Services that make frequent outbound calls — pulling container images, calling external APIs, sending logs — can push NAT Gateway costs surprisingly high. CloudWatch Logs. Log ingestion is $0.50/GB. If your application is verbose, or you're logging request/response bodies, this scales quickly. Set retention policies aggressively — 7 or 14 days for debug logs, 30 days for application logs, 90 days for audit logs.

Right-sizing: the highest-ROI activity

Most startups run instances that are 2-4x larger than they need. This isn't negligence — it's the rational choice when you're moving fast and don't want to deal with capacity issues. But right-sizing your top 3 cost items once a quarter can easily save 20-30% on your bill.

The process is simple:

For RDS, also check the Performance Insights tab. It shows whether your database is CPU-bound, I/O-bound, or just idling. This tells you whether you need a bigger instance, faster storage, or neither.

Reserved Instances and Savings Plans

Once your baseline spend stabilises — when you've had roughly the same core infrastructure for 3+ months — buy a 1-year Savings Plan for your steady-state compute. A 1-year no-upfront commitment saves about 30% compared to on-demand pricing, and you can modify it if your needs change.

Don't buy reservations for everything. Buy them for the instances you know you'll keep running (production database, core application servers) and leave variable workloads on-demand.

The dev/prod parity trap

It's tempting to run staging as a full copy of production. Resist this. Your staging database does not need to be Multi-AZ. Your staging instances don't need to be the same size. Your staging environment might not even need to run 24/7 — consider shutting it down overnight and on weekends. A simple Lambda that stops instances at 7pm and starts them at 7am can cut your staging compute costs by 70%.

How plainfra catches cost drift

All of the above requires you to remember to check, to know what to look for, and to have time to do it. For a startup CTO juggling product, engineering, and fundraising, that's a big ask.

plainfra's weekly health report scans all your connected AWS accounts and flags cost anomalies automatically. It identifies idle resources, oversized instances, missing lifecycle policies, and unexpected cost increases — then tells you exactly what to do about each one.

You don't need to set aside time for a cost review. The report arrives every week with a prioritised list of findings. If nothing has changed, it's a quick skim. If something has drifted — a new instance someone forgot to shut down, a data transfer spike, a database that's doubled in size — it's right there in the report.

It's a standing cost review that runs whether you remember or not. Stay subscribed, and you'll catch cost problems in the first week instead of discovering them when the quarterly bill arrives. When you're scaling fast, that early warning is worth far more than the cost of the tool.

Try plainfra free → 50K tokens, 7 days, no charge. Or see the interactive demo →.