AWS Cost Troubleshooting · Startup Guide
Why Is My AWS Bill So High? The 7 Most Common Causes for Startups
Your AWS bill jumped and you don't know why. Here are the 7 most common causes we find in startup accounts - and how to fix each one fast.
Over-provisioned EC2 instances
Saves $400–2,000/monthThat's $2,400–$12,000 in waste every 6 months of "we'll get to it."
The most common finding in every audit. Instances are sized for peak load at launch and never revisited. CloudWatch shows 5–15% average CPU utilization, but the team is afraid to downsize in case something breaks.
The fix
Analyze 2 weeks of CPU, memory, network, and EBS I/O metrics. Downsize to the next smaller instance family, or migrate to Graviton (20–40% cheaper). Memory metrics require CloudWatch Agent - most startups don't have it installed.
NAT Gateway data processing charges
Saves $800–3,000/monthA 15-minute fix. Every month you delay costs another $800–$3,000.
NAT Gateway charges $0.045/GB for all data processed - on top of the hourly rate. Traffic from EC2 instances to S3 or DynamoDB goes through NAT Gateway by default, racking up charges that look like 'data transfer' on the bill.
The fix
Create a Gateway VPC Endpoint for S3 and DynamoDB. Traffic routes through AWS's private network, bypassing NAT Gateway entirely. Cost: free. Implementation: 15-minute Terraform change.
Unattached EBS volumes and old snapshots
Saves $100–500/monthThat's $600–$3,000 sitting in deleted infrastructure every 6 months.
Every time an EC2 instance is terminated, the EBS volume is often left behind unless `DeleteOnTermination` is set. Snapshots accumulate from automated backups with no lifecycle policy. This is invisible until Cost Explorer is filtered by EBS.
The fix
Run `aws ec2 describe-volumes --filters Name=status,Values=available` to find unattached volumes. Audit snapshots older than 30 days. Migrate gp2 volumes to gp3 for 20% savings with no performance impact.
No Savings Plans or Reserved Instances
Saves $1,000–8,000/monthThat's $6,000–$48,000 paid to On-Demand pricing every 6 months instead of committing.
On-Demand pricing is 30–66% more expensive than 1-year Savings Plans. Startups avoid commitments because they worry about locking in the wrong instance type - but Compute Savings Plans are fully flexible across instance families, regions, and OS.
The fix
Calculate your steady-state baseline from 3 months of Cost Explorer data. Buy a Compute Savings Plan for ~70% of your baseline compute spend. Do this only after rightsizing - never commit to waste.
Idle load balancers
Saves $50–200/monthThat's $300–$1,200 in charges on resources actively serving zero traffic.
Application Load Balancers cost $16–30/month each in baseline charges, regardless of traffic. Staging environments, test deployments, and decommissioned services often have ALBs still running with zero or near-zero traffic.
The fix
List all load balancers and check `RequestCount` in CloudWatch for the past 30 days. Delete any with fewer than 100 requests/day that aren't attached to active services.
Over-provisioned RDS instances
Saves $300–1,500/monthThat's $1,800–$9,000 in database overprovisioning every 6 months.
RDS is consistently the second-biggest AWS line item. Instances are sized conservatively at launch and grow with the team's anxiety about database performance - not with actual utilization. Multi-AZ deployments double the cost.
The fix
Check RDS `CPUUtilization`, `DatabaseConnections`, and `FreeStorageSpace` over 2 weeks. Downsize instances with consistent sub-30% CPU. Consider Aurora Serverless v2 for variable workloads.
Forgotten dev and staging environments
Saves $200–2,000/monthThat's $1,200–$12,000 paid for environments your team stopped using months ago.
Dev and staging environments are created for a sprint and never torn down. They run 24/7 at full production size. A single forgotten staging environment with an RDS db.r5.xlarge and a few EC2 instances can cost $800+/month.
The fix
Tag all resources with `Environment: dev/staging/prod`. Set up AWS Cost Explorer tag-based filtering. Create a scheduled Lambda to stop non-production resources outside business hours using Instance Scheduler.
The Right Order to Fix These
Sequence matters. Committing to Reserved Instances before rightsizing locks in waste.
Rightsize first
Delete waste. Downsize over-provisioned instances. Fix NAT Gateway. These require no commitment and save money immediately.
Architect better
Add VPC endpoints, move dev/staging to scheduled start/stop, clean up unattached EBS and snapshots.
Then commit
Once you know your true baseline, buy Savings Plans and Reserved Instances. Every dollar committed should be to resources you'll actually use.
Related resources:
Now You Know Where the Money Goes. The Question Is: How Long Will You Wait?
You’ve just read the 7 most common causes. You probably recognized 3–5 of them in your own account.
Here’s what happens next for most startups: they bookmark this page, tell themselves “we’ll get to it,” and then don’t. Six months later, the bill is even higher and the waste has compounded.
Option A: DIY the quick wins
They’re real and they work. Start with VPC endpoints and gp2→gp3 migration - you can do both today. Free, quick, and no risk.
Option B: Get the full picture in 7 days
Every resource, every dollar, every quick win AND the architectural changes your team won’t find on their own - the AWS Cost Audit does that for €5K. If it doesn’t find at least €15K in savings, it’s free.
See the AWS Cost Audit →The one option that’s guaranteed to cost you money is doing nothing.