Posted on Mar 21, 2026 · Updated Mar 21, 2026 · 10 min read

Why Is My AWS Bill So High? A Founder's Troubleshooting Guide

You opened your AWS console expecting a $200 bill and found $600 instead. You're not alone. Organizations waste 27% of their cloud spend on resources they don't need, according to Flexera's 2025 State of the Cloud Report. For a small SaaS spending $1,000 a month, that's $270 going to waste every single month.

AWS has over 200 services, each with its own pricing dimensions. Some charge per hour. Some per gigabyte. Some per request. A few charge for doing absolutely nothing. This guide walks you through the six most common reasons your bill is too high, how to audit it in 15 minutes, and how to prevent surprises going forward. No jargon, no fluff.

TL;DR

Most small AWS bills are inflated by six culprits: idle EC2 instances, NAT Gateway fees, unattached EBS volumes, cross-AZ data transfer, oversized RDS databases, and forgotten snapshots. Organizations waste 27% of cloud spend on average (Flexera 2025). A 15-minute Cost Explorer audit can find most of it.

Close-up of network server hardware with blinking status LEDs and ethernet cables connected

What makes AWS bills so confusing?

AWS offers over 200 services, and the average cloud budget overrun sits at 17% (Flexera 2025). The confusion isn't your fault. AWS pricing is genuinely complex, built for enterprise-scale flexibility rather than small-team clarity.

Here's why it gets messy. A single EC2 instance doesn't just charge for compute time. It also generates charges for its attached storage (EBS), any Elastic IP address you forgot to release, data moving in and out, and possibly a NAT Gateway sitting between your instance and the internet. One server, five line items.

The AWS bill itself doesn't help. It groups charges by service, not by project or purpose. You see "$85 for EC2" but you don't immediately know which instances caused it. Was it your production server? That test box from two weeks ago that's still running? The bill won't tell you without digging into Cost Explorer.

Then there's the delay. AWS bills are finalized at month-end, so you're often reacting to spending that happened 15-30 days ago. By the time you notice the spike, you've already paid for it. This delay is why budget alerts matter so much, which we'll cover later.

The 6 most common reasons your AWS bill is too high

Industry-wide, $44.5 billion in cloud infrastructure waste is projected for 2025 (Harness 2025). Most of that waste comes from the same handful of mistakes. For small teams spending $100-$2,000 per month, these six issues account for the vast majority of bill shock.

Where Small AWS Bills Leak Money% of small AWS bills where each issue appears0%25%50%75%Idle EC260%Old Snapshots50%Unattached EBS45%Data Transfer40%Oversized RDS40%NAT Gateway35%Source: Aggregate data from Flexera 2025 and Harness FinOps in Focus 2025
Idle EC2 instances are the most common cost leak, but old snapshots and unattached storage are close behind because they're invisible in day-to-day operations.

1. Idle EC2 instances (the biggest offender)

An EC2 instance is a virtual server. "Idle" means it's running but not doing useful work. Maybe it was a staging server for a feature you shipped last month. Maybe it's a dev box someone spun up on Friday and forgot about. Either way, AWS charges by the hour regardless of whether it's doing anything.

A t3.medium instance costs about $30 per month. Sounds small, but stack three or four idle instances and you're burning $90-$120 for nothing. Go to EC2 in your AWS console, click "Instances," and sort by CPU utilization. Anything below 5% for the past two weeks is a candidate for termination.

2. NAT Gateway: the silent $32/month tax

A NAT Gateway lets resources in a private subnet (like a database) reach the internet. AWS charges $0.045 per hour just for it to exist. That's roughly $32 per month before it processes a single byte of data. On top of that, you pay $0.045 per GB of data that flows through it. For a small team, that fixed cost alone can be 10-15% of your total bill.

The fix depends on what's using it. If your resources only need to talk to S3 or DynamoDB, a VPC Gateway Endpoint costs $0 and eliminates NAT fees entirely. For a deeper breakdown, see our NAT Gateway pricing guide.

3. Unattached EBS volumes

EBS volumes are virtual hard drives. When you terminate an EC2 instance, its EBS volumes don't always get deleted automatically. They just sit there, costing $0.08-$0.10 per GB per month. A 100 GB volume you forgot about? That's $8-$10 per month. Multiply by five forgotten volumes and it adds up.

Check for these by going to EC2, then "Volumes" in the left sidebar. Filter by state: "available." Any volume marked "available" isn't attached to anything. Snapshot it if you need the data, then delete it.

4. Data transfer between Availability Zones

AWS charges $0.01 per GB for data moving between Availability Zones (AZs) in the same region. That sounds tiny. But if your web server in AZ-a talks to your database in AZ-b on every request, those pennies compound fast. A service handling 10 million requests per day with 1 KB payloads generates about 300 GB of cross-AZ traffic monthly, costing $3. Bigger payloads multiply that quickly.

The simple fix: put your app and database in the same AZ when high availability isn't critical. For production workloads where multi-AZ matters, accept the cost but make sure you're aware of it in your budget.

5. Oversized RDS instances

RDS is AWS's managed database service. It's common to pick a db.r5.large or db.r6g.xlarge "just in case" and never revisit it. A db.r6g.xlarge with Multi-AZ runs about $350 per month. If your database only uses 20% of its CPU and memory, you could drop to a db.r6g.large at roughly $175 and see no performance difference.

Check RDS Performance Insights or CloudWatch metrics for your instance. Look at CPU utilization and freeable memory over the past 30 days. If CPU stays below 30% and memory usage is below half, you're probably oversized.

6. Old snapshots and unused AMIs

Every time you create a backup (snapshot) of an EBS volume or build a custom machine image (AMI), AWS stores it in S3 and charges $0.05 per GB per month. Over time, old snapshots pile up. We've seen accounts with 50+ snapshots from instances that were deleted months ago. At $0.05/GB, a dozen 50 GB snapshots costs $30 per month.

Go to EC2, then "Snapshots." Sort by creation date. Anything older than 90 days that isn't tied to a disaster recovery plan is probably safe to delete. Same for AMIs under "Images" in the sidebar.

How do you audit your AWS bill in 15 minutes?

The average cloud budget overrun is 17% (Flexera 2025). You can find most of that overrun in 15 minutes using tools already in your AWS account. No third-party software needed. Here's the step-by-step process.

Typical AWS Bill Breakdown for a Small SaaSApproximate percentage of total monthly spend by service category$1,000/month exampleEC2 — 40%RDS — 25%Data Transfer — 15%S3 — 8%Other — 12%Source: Aggregate patterns from AWS Cost Explorer data across small SaaS accounts
EC2 and RDS together typically account for 65% of a small SaaS AWS bill, making them the highest-impact areas for cost reduction.

Step 1: Open Cost Explorer (2 minutes)

Go to the AWS Billing console and click "Cost Explorer." Set the time range to the last 3 months and group by "Service." This gives you the big picture: which services are costing the most, and whether spend is growing or stable. Look for any service that jumped more than 20% month-over-month. That's your first lead.

Step 2: Check for idle EC2 instances (3 minutes)

Open the EC2 dashboard. Click "Instances." Add the "CPU utilization" column (or check CloudWatch for each instance). Flag anything with average CPU below 5% over the last 14 days. Also check the "Instance state" column. Stopped instances don't charge for compute, but their attached EBS volumes still cost money.

Step 3: Hunt orphaned storage (3 minutes)

Still in the EC2 console, go to "Volumes" in the left sidebar. Filter by "State = available." Every volume in that list is costing you money without being attached to anything. Then check "Snapshots" and sort by date. Delete anything older than 90 days that you don't need for compliance or recovery.

Step 4: Review NAT Gateway and data transfer (4 minutes)

Back in Cost Explorer, group by "Usage Type" and filter for "NatGateway." You'll see both the hourly charge and the per-GB processing charge. If you see NAT Gateway fees but your architecture doesn't strictly require one, consider VPC endpoints as a free alternative for S3 and DynamoDB traffic.

Step 5: Evaluate RDS sizing (3 minutes)

Open the RDS console and click into your database. Check "Performance Insights" or the "Monitoring" tab. If average CPU stays below 30% and freeable memory exceeds 50% of total, you can likely downsize one tier. Write down the current instance class and estimated monthly cost. Compare it to one size smaller.

That's it. Five steps, 15 minutes. Most founders find $50-$300 in monthly savings on their first pass. The key is doing this regularly, not once.

How do you prevent surprise AWS bills?

Finding waste after it happens isn't enough. With an average 17% budget overrun across the industry (Flexera 2025), prevention matters more than remediation. AWS gives you three free tools to catch spending problems before they hit your invoice.

Set up AWS Budgets (5 minutes)

Go to the Billing console, then "Budgets," then "Create budget." Set a monthly cost budget equal to what you expect to spend. Add alert thresholds at 50%, 80%, and 100% of your budget. AWS sends you an email when you cross each threshold. This is the single most important thing you can do. It costs nothing and takes five minutes.

Enable AWS Cost Anomaly Detection

Cost Anomaly Detection uses machine learning to spot unusual spending patterns. It's free to enable. Go to the Cost Management console, click "Cost Anomaly Detection," and create a monitor for your entire account. It'll alert you when any service spikes beyond its normal pattern. Does it catch everything? No. But it catches the big surprises like a runaway Lambda function or an accidentally provisioned large instance.

Create a CloudWatch billing alarm

This is a hard-stop alert. In CloudWatch, create an alarm on the "EstimatedCharges" metric in the "Billing" namespace. Set it to your maximum acceptable monthly spend. When your estimated bill hits that number, you get notified immediately. Think of it as the smoke detector for your AWS account.

Pro tip: combine all three. Budgets catch gradual drift. Anomaly Detection catches weird spikes. The CloudWatch alarm catches worst-case scenarios. Together, they cost $0 and cover most failure modes. For a deeper look at planning your cloud spend up front, check out our cloud cost estimation guide.

When is it worth getting a cloud cost tool?

AWS's native tools work well up to a point. But once your bill crosses roughly $500-$1,000 per month or you have multiple team members spinning up resources, the gaps start showing. With 27% average waste (Flexera 2025), even a 10% reduction on a $1,000 bill pays for most tools.

Signs you've outgrown Cost Explorer

You can't tell which project or customer is driving costs. You're spending more than 30 minutes per week manually checking for waste. Multiple people have AWS console access but nobody owns the bill. You've had more than two "surprise bill" months in a row. If any of these sound familiar, a dedicated tool will pay for itself.

What to look for in a cost tool

Automated idle resource detection, not just dashboards. Rightsizing recommendations with actual dollar amounts. Budget tracking that's easier to read than Cost Explorer. And most importantly: something your whole team will actually use. The fanciest FinOps platform in the world doesn't help if it sits untouched after the first week.

For teams in the $100-$2,000 per month range, you don't need an enterprise FinOps suite. You need clear visibility into what's running, what it costs, and what's wasted. SpendArk's free cloud cost calculator and guides are a free place to start. But whatever tool you pick, the important thing is getting a handle on your spend before your next surprise bill.

Laptop screen displaying financial analytics dashboard with colorful charts and cost breakdowns

Stop surprises before they happen

Idle EC2 instances, NAT Gateway fees, and cross-AZ transfer charges are what make AWS bills unpredictable. These providers keep pricing flat so there's less to audit.

  • DigitalOcean — simple, flat-priced compute and managed databases with no NAT Gateway or cross-AZ surprises.
  • Hetzner — unbeatable price/performance for compute once you outgrow free tiers, billed per instance, not per hidden line item.
  • Vultr — global low-cost VPS with predictable monthly pricing instead of a dozen metered AWS services.

Some provider links above are affiliate links — we may earn a commission at no extra cost to you. It never affects our pricing data.

Frequently asked questions

Why did my AWS bill suddenly spike?

Sudden spikes usually come from one of three causes: a new resource someone provisioned and forgot, a runaway process generating excessive data transfer, or a service scaling up automatically without a cap. Open Cost Explorer, group by "Service," and compare the current month to the previous month. The service with the biggest jump is your culprit.

How much does a NAT Gateway cost per month?

A NAT Gateway costs a fixed $0.045 per hour, which works out to roughly $32 per month just for existing (AWS VPC Pricing). On top of that, you pay $0.045 per GB of data processed. For small teams, VPC Gateway Endpoints for S3 and DynamoDB can eliminate this cost entirely.

Can I set a hard spending limit on AWS?

AWS doesn't offer a true hard spending cap that shuts everything down. However, you can combine AWS Budgets with automated actions (like stopping EC2 instances) to approximate one. The closest native option is setting a budget action that triggers an IAM policy restricting new resource creation once you hit your limit.

What percentage of cloud spend is typically wasted?

Organizations waste approximately 27% of cloud infrastructure spend on idle, overprovisioned, or forgotten resources (Flexera 2025). For a team spending $1,000 per month, that's $270 per month — or $3,240 per year — going to resources that serve no purpose.

Is AWS Free Tier really free?

Partially. AWS Free Tier includes 750 hours of t2.micro EC2 per month and 5 GB of S3 storage for 12 months. But many services have fine-print limits. It's easy to exceed them without realizing it, especially with data transfer and API request charges. Always set up billing alerts even on a free tier account.

Estimate your cloud costs — for free

Compare AWS, Azure, and GCP pricing side by side with our free calculator, and dig into the guides to learn how to cut cloud waste. No sign-up required.