The short answer, then the arithmetic
Why is my AWS bill so high?
This is the question the whole site exists to answer. Below is the honest version: the nine things that account for most of the surprise in a small-to-mid AWS bill, what each costs at list price, and the console click or CLI call that tells you whether it applies to you.
Most AWS bills are high for boring reasons rather than architectural ones. In the accounts we scan, the recurring causes are on-demand pricing on a workload that never changes, non-production environments running 24/7, storage and snapshots that nothing ever deletes, logging left on debug, NAT gateways carrying traffic a free endpoint would carry, and resources in regions nobody remembers opening. Between 20% and 35% of a typical unmanaged bill is recoverable without changing the architecture.
Why this happens to competent teams
Creating a resource on AWS takes one API call and no approval. Deleting one requires somebody to know it exists, know nothing depends on it, and care. Those are wildly asymmetric costs, so accounts accumulate. The bill is the integral of every decision nobody revisited.
It is also nobody’s job. Engineering owns the resources but sees a bill they did not choose the shape of. Finance owns the bill but cannot tell an idle instance from a busy one. In most companies under a hundred people, the AWS bill is reviewed properly the first time when it becomes embarrassing.
None of this shows up as a spike. It shows up as a line that slopes gently upward while headcount and traffic stay flat, which is exactly the pattern that never triggers an alert.
The nine causes, and what each one costs
| Cause | List price | Typical finding |
|---|---|---|
| No Savings Plan on a steady baseline | Up to ~30% off compute for a 1-year no-upfront commitment | The single largest line in most reports. Coverage is commonly 0%. |
| Non-production running nights and weekends | You use it ~45 hours a week and pay for 168 | ~70% of the cost of every environment that could be scheduled off |
| Idle and oversized EC2 | Full instance price for near-zero work | Instances under 3% average CPU over 14 days |
| gp2 volumes never migrated to gp3 | $0.10 vs $0.08 per GB-month | A flat 20% off EBS, live, no downtime |
| Snapshots and AMIs with no lifecycle | $0.05 per GB-month, forever | Backups of instances deleted years ago |
| CloudWatch Logs set to never expire | $0.50 per GB ingested, $0.03 per GB-month stored | Debug logging left on, plus VPC Flow Logs nobody reads |
| NAT gateway carrying S3 and DynamoDB traffic | $0.045/hour plus $0.045 per GB processed | A free VPC gateway endpoint removes the per-GB charge entirely |
| Unattached public IPv4 addresses | $3.60 per address per month since Feb 2024 | Charged whether attached or not, which is new to a lot of people |
| Forgotten resources in forgotten regions | Whatever they cost, indefinitely | A test in eu-central-1 from 2023 that nobody has opened since |
US dollars, on-demand Linux, 730 hours a month, us-east-1 / us-west-2 / eu-west-1 / eu-west-2. Conservative figures from the same table our scanner uses.
How to check your own account in about twenty minutes
In order. Each step narrows the next one, and the first three account for most of what you will find.
- 1Group six months of Cost Explorer by service. Billing console, Cost Explorer, monthly granularity, group by Service. The top five services are usually 90% of the bill. Everything below is prioritised by that ranking, because a 40% saving on your ninth-largest service is not worth an afternoon.
- 2Check Savings Plans coverage. Cost Explorer, Savings Plans, Coverage report. If it reads 0% and your compute spend is flat month to month, that is the biggest single number in your audit and it takes one purchase to fix.
- 3Sort EC2 by cost and check 14 days of CPU. Anything under 3% average with max under 10% is a stop-or-terminate candidate. Anything consistently under 40% is a rightsizing candidate. Compute Optimizer does this for free if you have opted in.
- 4Filter Cost Explorer for EC2-Other. This is the line that confuses everyone: EBS volumes, snapshots, NAT gateway processing, data transfer. It is often the second-largest EC2 cost and it has no instances in it.
- 5List EBS volumes by type and state. Every gp2 volume is a 20% saving. Every volume in state "available" is attached to nothing and billing at full price.
- 6Sort CloudWatch log groups by stored bytes. Look at the retention column. "Never expire" is the default on every log group AWS has ever created for you.
- 7Open the region selector and look for spend outside your main regions. Cost Explorer, group by Region. Audit anything above about a dollar. Orphans hide where nobody looks.
What a realistic result looks like
We published the scan of our own AWS account, unedited. It found $293.82 a month of savings against $8,746.75 of spend, which is 3.4% and below our own guarantee threshold. A well-managed account genuinely does not have 30% lying around. If your account has never been reviewed, it probably does.
What will not fix it
Buying a cost dashboard. Dashboards tell you what you already suspect, which is that the bill went up. They do not tell you that the log group named /aws/lambda/image-resize-v2 has kept every line since 2023, and they cannot decide whether the 4% CPU instance is idle or memory-bound.
Committing to a three-year Savings Plan before rightsizing. Commit to the baseline you have after cleaning up, not before, or you will spend three years paying for capacity you deliberately removed.
A migration to another cloud. Whatever the pitch says, the waste patterns move with you, because the cause is organisational rather than technical.
Put numbers on it
Is my AWS bill too high?
Benchmark your spend against typical ranges for your team size in 30 seconds.
Open calculator →
gp2 → gp3 savings calculator
A flat 20% off your EBS storage, usually with better performance and zero downtime.
Open calculator →
EC2 idle cost estimator
What your under-5%-CPU instances cost, and what rightsizing the quiet ones saves.
Open calculator →
Savings Plans calculator
On demand against one and three year commitments, and why rightsizing has to come first.
Open calculator →
Frequently asked questions
How much of an average AWS bill is actually recoverable?
In accounts in the £2,000 to £30,000 a month range that have never been formally reviewed, 20% to 35% is typical, split roughly three ways between idle or oversized compute, storage and logging accumulation, and missing commitment discounts. Accounts with an active FinOps practice are usually in single digits, and that is the correct outcome.
Why did my bill go up when nothing changed?
Something almost always changed, just not in code. Storage grows on its own: snapshots, logs, S3 versions and RDS backups accumulate whether or not anyone deploys. Data transfer grows with traffic. And AWS occasionally starts charging for something that used to be free, as it did with public IPv4 addresses in February 2024, which added $3.60 a month for every address in every account overnight.
Is the AWS Free Tier the reason my first bill was a surprise?
Often, yes. The 12-month free tier ends on an anniversary rather than at a threshold, so a bill can multiply on a specific date with no change in usage. NAT gateways, load balancers, public IPv4 addresses and EBS storage above the free allowance are the usual first surprises, because none of them are usage-based in a way that feels intuitive.
Should I rightsize first or buy a Savings Plan first?
Rightsize first, always. A Savings Plan is a commitment to spend a fixed amount per hour for one or three years. If you commit and then remove 30% of your compute, you keep paying for the commitment. Clean up, let the baseline settle for a couple of weeks, then commit to roughly 70% to 80% of what is left.
Can I do this myself instead of hiring someone?
Yes, and the seven steps above are the honest version of the first day of any audit. What you buy from an audit is the long tail: about seventy checks across every region, fourteen days of CloudWatch evidence per instance, and someone who has seen the difference between an idle instance and a memory-bound one enough times to call it correctly.
Keep reading
Prices checked against AWS list rates on 2 August 2026. AWS changes prices; treat every figure here as a close approximation rather than a quote.
£499 fixed. Free scan first. 20%+ found or it’s free.
The scan is read-only — a role you create and delete, no keys shared — and shows your estimated monthly saving before anyone talks about money.