How to Reduce Your AWS Bill: A 30-Day Step-by-Step Guide
To reduce your AWS bill, work in this order: turn on Cost Explorer and daily CUR to find where the money actually goes, delete idle and orphaned resources, right-size overprovisioned compute and storage, then buy Savings Plans against the baseline that survives. Most accounts that have never been optimized give up 20% to 35% within 30 days, and the first two steps cost nothing and carry no production risk. Buying commitments first is the common mistake: it locks in the waste you have not removed yet.
Typical savings range
20%-35%
Time to first wins
2-4 weeks
Risk to production
Low when phased
SEO Focus Topics
Key Takeaways
- • Sequence beats effort: visibility, then waste removal, then right-sizing, then commitments. Buying Savings Plans first locks in the waste you have not deleted yet.
- • The free wins come first. Deleting unattached EBS volumes, idle load balancers, orphaned snapshots and unused Elastic IPs costs nothing and needs no negotiation.
- • Right-size before you commit, because a Savings Plan bought against an oversized fleet commits you to paying for the oversizing for one to three years.
- • AWS advertises savings of "up to 72 percent" on Savings Plans and Reserved Instances versus On-Demand, but you only realise that on the workload you actually keep running.
- • Data transfer and NAT Gateway charges are the most commonly missed line item, because they hide inside "EC2-Other" rather than appearing as their own service.
- • Without a monthly review cadence, an optimized account drifts back up within a quarter. The cadence is the deliverable, not the one-time cut.
The order to work in, and why the order is the whole trick
Almost every failed AWS cost programme I have seen failed on sequence rather than effort. A team gets a mandate to lower the AWS bill, sees that Savings Plans advertise the largest headline discount, buys coverage in week one, and then discovers in month three that a third of the committed spend is covering instances nobody needed. The commitment is not refundable. They have converted removable waste into contractual waste.
Work in this order instead: find the spend, delete what nobody is using, right-size what remains, and only then commit to the baseline that survived all three steps. Each step shrinks the thing the next step operates on, which is exactly what you want, because commitments are the only step you cannot undo.
The first two steps are free, reversible, and need no approval from finance. That matters when you are trying to build credibility for a cost programme: you can show a real reduction on the next invoice before you have asked anyone to sign a one-year commitment.
- ✓ Week 1: visibility. Cost Explorer, daily CUR, cost allocation tags, anomaly detection.
- ✓ Week 2: waste removal. Delete orphaned, idle, and forgotten resources. No performance risk.
- ✓ Week 3: right-sizing. Compute, storage tiers, database instances, log retention.
- ✓ Week 4: commitments. Buy Savings Plans against the new, smaller, verified baseline.
Week 1: get visibility before you touch anything
You cannot reduce a bill you cannot read. The AWS console bill by service is not enough, because the service-level view hides the two things that matter most: which team or workload owns the spend, and which usage type inside a service is driving it. A line that says EC2-Other is $40,000 tells you nothing until you can see that most of it is NAT Gateway data processing.
Enable Cost Explorer and switch on daily Cost and Usage Reports delivered to S3. CUR is the granular, hourly, resource-level dataset. Cost Explorer is the fast interactive view. You want both: Cost Explorer to answer questions in minutes, CUR to answer questions the console cannot express.
Then fix tagging, which is the step everyone postpones and everyone regrets postponing. Without an owner tag and an environment tag enforced on new resources, every future conversation about a cost spike ends in a hunt for whose thing it is. Activate the tags as cost allocation tags in the Billing console, otherwise they do not appear in CUR at all.
- ✓ Enable Cost Explorer, and enable hourly and resource-level granularity if you can justify the cost of the extra CUR volume.
- ✓ Deliver a daily CUR to S3 in Parquet, and query it with Athena. This is the difference between guessing and knowing.
- ✓ Enforce two tags minimum: owner and environment. Activate them as cost allocation tags, which is a separate step from applying them.
- ✓ Turn on AWS Cost Anomaly Detection with alerts to a channel a human reads. Detection with no route to a person is not detection.
- ✓ Set AWS Budgets with alerts at 80% and 100% of expected monthly spend, per account or per tag.
Week 2: delete the waste, which is free and risk-free
This is the most satisfying week, because everything here is spend on resources that are not serving traffic, not attached to anything, or not being read by anyone. Removing them cannot degrade performance, because they are not doing anything.
The reason this waste accumulates is not carelessness, it is asymmetry. Creating a resource is one click, and the person who created it moves on. Nothing in AWS ever tells you that the volume you detached eight months ago is still billing. It just keeps billing quietly, forever, in a line item nobody itemises.
Work through the list below systematically rather than opportunistically. On an account that has never been swept, this pass alone commonly finds a meaningful percentage of the bill, and it takes a day or two.
- ✓ Unattached EBS volumes. They bill at full rate whether or not an instance is attached. Snapshot first if you are unsure, then delete.
- ✓ Orphaned EBS snapshots, especially automated ones from instances that no longer exist and retention policies nobody set an end date on.
- ✓ Idle load balancers with no healthy targets, and load balancers left behind by deleted services.
- ✓ Unassociated Elastic IPs, which are charged specifically because they are not in use.
- ✓ Stopped EC2 instances that are still carrying attached EBS volumes. Stopping the instance stops the compute charge, not the storage charge.
- ✓ Old, unused RDS and Redshift snapshots, and RDS instances running in non-production accounts around the clock.
- ✓ CloudWatch log groups with no retention policy set. The default is to retain indefinitely, and log storage compounds silently for years.
- ✓ Provisioned but unused capacity: DynamoDB provisioned throughput on tables with near-zero traffic, and Kinesis shards over-provisioned for a peak that never arrives.
Week 3: right-size compute, storage, and databases
Right-sizing is where you reduce the cost of things you are genuinely using, which means it does carry risk and needs to be staged. The rule is to change one dimension at a time, in non-production first, with a metric you are watching and a rollback you have already written down.
Start with AWS Compute Optimizer, which analyses CloudWatch metrics and produces instance recommendations. Treat its output as a candidate list rather than a work order: it does not know about your seasonal peak, your failover headroom, or the batch job that runs on the last day of the month. Cross-check every recommendation against at least a full business cycle of metrics.
The largest structural saving in compute right now is usually architectural rather than dimensional. Moving a workload from x86 to Graviton, where AWS advertises "up to 40 percent better price performance" for equivalent instances, is often a bigger lever than shaving one instance size, and for interpreted languages and containerised services the migration is frequently just a rebuild.
- ✓ EC2 and containers: use Compute Optimizer plus your own peak-window metrics. Downsize in one step at a time, not two.
- ✓ Consider Graviton for anything that is not pinned to x86 by a binary dependency. Test in staging, measure, then migrate.
- ✓ EBS: migrate gp2 volumes to gp3, which AWS prices at up to 20 percent lower cost per GB and lets you provision IOPS independently of volume size.
- ✓ S3: apply lifecycle policies to move cold data into infrequent access and archival tiers, or enable Intelligent-Tiering where access patterns are unpredictable.
- ✓ Watch the archival minimum-duration rules. Glacier tiers bill a minimum retention period, so data deleted before that minimum is charged as though it stayed the full term.
- ✓ RDS: right-size instance classes, turn off Multi-AZ in non-production, and stop development databases outside working hours.
- ✓ Set CloudWatch log retention explicitly on every log group, and route long-term retention to S3 rather than keeping it in CloudWatch.
The line item almost everyone misses: data transfer and NAT Gateway
When a team tells me they have already optimized and the bill is still high, the unexamined spend is usually data transfer. It hides badly. Much of it lands in a usage type called EC2-Other rather than in a service called "data transfer", so a service-level view of the bill simply does not show it as a category.
NAT Gateway is the sharpest edge here. It carries an hourly charge per gateway plus a per-GB data processing charge on everything that flows through it, and that per-GB charge applies even to traffic heading to AWS services in the same region. A chatty service pulling from S3 or DynamoDB through a NAT Gateway is paying a processing fee on every byte, for no reason.
The fix is usually VPC endpoints. A gateway endpoint for S3 and DynamoDB costs nothing and takes that traffic off the NAT path entirely. Interface endpoints for other services carry their own hourly and per-GB charges, so those need the arithmetic done rather than assumed, but the S3 and DynamoDB gateway endpoints are close to a free win.
- ✓ Query CUR grouped by usage type, not by service, to see NAT Gateway processing and inter-AZ transfer as their own lines.
- ✓ Add S3 and DynamoDB gateway VPC endpoints. They are free and they remove that traffic from NAT processing charges.
- ✓ Look for cross-AZ chatter between services that could be co-located, since inter-AZ transfer is billed in both directions.
- ✓ Check whether you are running more NAT Gateways than you need. One per AZ is the resilient pattern, one per subnet is an accident.
- ✓ Put CloudFront in front of high-volume egress where it fits, since CloudFront egress is priced differently from direct EC2 and S3 egress.
Week 4: buy commitments against the baseline that survived
Now, and only now, the discount instruments make sense. AWS advertises savings of "up to 72 percent" versus On-Demand on both Savings Plans and Reserved Instances, and after three weeks of cleanup you are finally applying that discount to a fleet you actually intend to keep.
Compute Savings Plans are the flexible option: they apply across instance family, size, region, operating system, and across EC2, Fargate and Lambda, at a slightly lower discount than the alternatives. EC2 Instance Savings Plans lock you to a family in a region for a higher discount. Databases have their own instrument since 2 December 2025: Database Savings Plans cover Aurora, RDS, DynamoDB, ElastiCache, DocumentDB, Timestream, Neptune, Keyspaces, DMS and OpenSearch at up to 35%. Redshift is not covered and still needs Reserved Nodes.
Do not buy your full baseline in one purchase. Cover the portion of usage you are most confident about, typically the floor of your last 60 to 90 days of production usage, and add coverage in tranches as confidence grows. Staggered expiry dates are also a real benefit, because it means you are never renegotiating your entire commitment position in a single month.
- ✓ Look at 60 to 90 days of post-cleanup usage and identify the floor, not the average.
- ✓ Cover the floor first. Leave the variable layer on On-Demand or Spot, where flexibility is worth more than the discount.
- ✓ Prefer Compute Savings Plans when your architecture is still changing, and EC2 Instance Savings Plans when it genuinely is not.
- ✓ Compute Savings Plans do not cover databases. Use a Database Savings Plan or RDS Reserved Instances for those, and Reserved Nodes for Redshift.
- ✓ Consider Spot for fault-tolerant, interruptible, stateless workloads such as batch processing, CI runners and rendering.
- ✓ Track commitment utilisation and coverage monthly. Utilisation below target means you over-committed, coverage below target means you left discount on the table.
Make it stick: the cadence that stops the bill drifting back
A one-time cut is not a result, it is a photograph. Every account I have watched regress had the same story: a successful optimization sprint, a proud slide deck, then nine months of new services launched by people who were not in the room. Costs return to trend within a quarter or two.
The durable version is a cadence with named owners and a standing agenda. It does not need to be heavy. It needs to be regular, and it needs someone accountable for each line rather than a diffuse sense of shared responsibility.
The other half of durability is prevention. Cost information has to reach engineers at the moment they are making the decision, not four weeks later in a finance review. That means anomaly alerts in the team channel, budgets per team, and cost estimates in infrastructure pull requests where the tooling supports it.
- ✓ Weekly: triage anomaly alerts, assign an owner to each, close the loop on last week.
- ✓ Monthly: review spend by team and by service against budget, review commitment utilisation and coverage, pick the next optimization target.
- ✓ Quarterly: revisit commitment strategy, architectural cost decisions, and whether the tagging policy is actually being enforced on new resources.
- ✓ Continuously: budget alerts routed to the team that owns the spend, not only to finance.
- ✓ Make the unit economics visible. Cost per customer, per tenant, or per transaction is the number that tells you whether a rising bill is a problem or a success.
What to expect, honestly
On an AWS account that has never been through a structured cost exercise, 20 to 35 percent within 30 days is a realistic range, and the majority of it comes from the free weeks rather than the commitment week. On an account that has already been optimized once, expect single digits and a lot more effort per percentage point.
What you should not expect is a single big lever. The bill comes down through a few dozen small, boring, individually unimpressive actions, which is precisely why it is usually left undone. Nobody gets excited about deleting snapshots. The snapshots keep billing anyway.
If you want the compressed version: turn on the data, delete what is idle, shrink what is oversized, commit to what is left, and put a monthly meeting in the calendar so it does not all come back.
Frequently Asked Questions
How can I reduce my AWS bill quickly?
The fastest risk-free reductions come from deleting resources nobody is using: unattached EBS volumes, orphaned snapshots, unassociated Elastic IPs, idle load balancers, and CloudWatch log groups with no retention policy. None of this affects running workloads, so it needs no change window and no performance testing. Do that before you buy any Savings Plans, because commitments bought against unoptimized usage lock the waste in for the length of the term.
How much can I realistically cut my AWS bill by?
On an account that has never been through a structured optimization pass, 20% to 35% within 30 days is a realistic range, with most of it coming from waste removal and right-sizing rather than from discount instruments. On an account that has already been optimized once, expect single-digit percentages and considerably more effort for each one.
Should I buy Savings Plans or Reserved Instances first?
Neither, first. Clean up and right-size first, then commit against the baseline that survives. When you do commit, Compute Savings Plans are the flexible default because they apply across instance family, size, region and across EC2, Fargate and Lambda. For databases, compare a Database Savings Plan against RDS Reserved Instances rather than assuming either wins, because on provisioned instances the Reserved Instance often still discounts deeper. Redshift is covered by neither and needs Reserved Nodes.
What is EC2-Other on my AWS bill?
EC2-Other is a catch-all usage grouping that typically contains EBS volumes and snapshots, Elastic IPs, NAT Gateway hourly and data processing charges, and data transfer. It is the single most commonly misread line on an AWS bill, because a service-level view shows it as one large number with no obvious owner. Group your Cost and Usage Report by usage type rather than by service to break it apart.
How do I stop my AWS bill from creeping back up?
Put a cadence in place with named owners: weekly anomaly triage, a monthly spend and commitment-utilisation review, and a quarterly revisit of commitment and architecture decisions. Route budget and anomaly alerts to the engineering team that owns the spend rather than only to finance, because the people who can fix a cost are the people who created it.
Do I need a FinOps tool to reduce AWS costs?
Not to start. Cost Explorer, a daily Cost and Usage Report queried through Athena, AWS Budgets, Cost Anomaly Detection, Compute Optimizer and Trusted Advisor are all native and will carry you through the first optimization pass. Third-party tooling earns its cost later, typically when you need chargeback across many teams or accounts, or continuous automated rightsizing.
Sources
About the author
Hermann Lotter
FinOps practitioner who has led cloud and AI cost optimization inside a 180-person organisation, identifying six-figure annual savings across AWS and LLM spend. He writes Easy Entropy from hands-on engagements, not theory. LinkedIn
Free Assessment
Want this outcome in your AWS bill?
Get a free cloud cost analysis and a prioritized optimization roadmap.
Request Free Analysis →Related Articles
Cost Optimization
How to Stop AWS Charges: Find What Is Billing You, Shut It Off, Keep It Off
AWS keeps charging you because resources bill until they are deleted, not stopped. Here is the sequence that actually ends the charges: read the bill by usage type, stop or delete whatever sits behind each line, verify on the next day of usage data, and close the account properly if you want everything off.
Case Study
Case Study: E-commerce Saves $175K/yr on AWS in 60 Days
How a technology services company unlocked six-figure annual savings through automated commitment management.