Back to resources
// finops · cost

Cut an AWS bill in half

On most scale-ups I work with at Stralya, half the AWS bill is pure waste. Here's the playbook I apply — in order, from most to least profitable — without ever touching production.

GuideJul 17, 2026~9 min · intermediate
Cost ExplorerCloudWatchSavings PlansSpottagging
01

First, see where the money goes

You can't cut what you can't see. Before any optimization, you must attribute every dollar to a project, an environment, a team. Without tags, Cost Explorer shows you one opaque block “EC2: $12,000” and you're blind.

shellcopy
# imposer des tags = pouvoir attribuer chaque dollar a un projet
$ aws resourcegroupstaggingapi tag-resources \
--resource-arn-list arn:aws:ec2:eu-west-3:123:instance/i-0abc \
--tags Project=shop,Env=prod,Owner=julien
# ce qui n'est pas tague apparait dans "untagged" dans Cost Explorer
$ aws ce get-cost-and-usage \
--time-period Start=2026-08-01,End=2026-09-01 \
--granularity MONTHLY --metrics UnblendedCost \
--group-by Type=TAG,Key=Project
i

Enable Cost Allocation Tags in the billing console, otherwise your tags won't show up in reports. It's the step everyone forgets.

02

The 4 levers, by payoff

Always in this order: clean up the obvious waste first (free, no risk), then commit on what remains.

01
1 · Turn off the useless

Staging environments running nights and weekends, detached EBS volumes, unused elastic IPs. Immediate gain, zero risk.

02
2 · Rightsizing

Oversized instances running at 5-10% CPU. Dropping one size halves the line, with no perceived impact.

03
3 · Savings Plans

On stable, predictable load (the baseline running 24/7), a 1-year commitment pays -40% to -50% vs on-demand.

04
4 · Spot

For interruption-tolerant tasks (batch, workers, CI): up to -90%. Never for the database or checkout.

03

Rightsizing without guessing

Rightsizing is done on metrics, not on a hunch. Look at average CPU and memory over 30 days: an instance at 6% CPU for a month is an obvious candidate.

shellcopy
# quelles instances tournent a vide ? (CPU moyen < 10%)
$ aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 --metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-0abc \
--start-time 2026-08-01T00:00:00Z --end-time 2026-09-01T00:00:00Z \
--period 86400 --statistics Average
# t3.xlarge a 6% de CPU -> passe en t3.large : -50% sur la ligne
!

Drop one size at a time and watch for 48h. AWS Compute Optimizer gives ready-made recommendations — use them as a starting point, not as gospel.

04

The result, on a real case

A client store, monthly bill before/after the playbook. No feature removed, no perf degradation — just waste cut and commitments placed well.

Before
$11,800
– staging off at night
$9,600
– EC2/RDS rightsizing
$7,400
– Savings Plans
$5,900

From $11,800 to $5,900 a month — exactly half. The first two (free) levers did most of the work.

05

Keeping it down

An AWS Budgets budget with an alert at 80%: no more end-of-month surprises.
A monthly cost review, 30 minutes, on the top 5 lines.
Mandatory tags at creation (via a policy): unattributed waste doesn’t creep back.
i

The real trap isn't the first optimization, it's the drift. Hidden costs quietly return — I wrote a separate piece on it: the 5 lines that wreck your bill.

06

Savings Plans, Reserved Instances or Spot: the right commitment

Once the waste is cleaned up, the question becomes: what to commit to, and how? Three models coexist and I almost always combine them. The rule I keep repeating to teams: commit on what's predictable, keep on-demand for breathing room, and push the disposable onto Spot.

Savings Plans

Commit in $/hour, not per instance.

Compute Savings Plans: up to -66% vs on-demand, and applies automatically to EC2, Fargate and Lambda, across all families and regions.
EC2 Instance Savings Plans: up to -72%, but locked to one instance family in a given region.
This is what AWS and I recommend by default: the flexibility avoids getting stuck if you switch instance type in a year.
Reserved Instances

The older model, still useful.

Standard RIs: up to -72%, but frozen on a precise config (type, OS, tenancy).
Convertible RIs: -66%, exchangeable, but the exchange is manual.
One real remaining edge: zonal EC2 RIs can reserve capacity. Savings Plans can't.
i

AWS's official comparison table is crisp on percentages and flexibility: Compute Savings Plans and Reserved Instances. Key point: a Savings Plan never applies to Spot usage or to what's already covered by an RI.

Spot: -90%, but only on the disposable

Spot gives access to AWS's spare capacity at up to -90% vs on-demand, in exchange for a single constraint: the instance can be reclaimed with two minutes' notice. So never the database or checkout — but perfect for batch, workers, CI, rendering. The key to surviving interruptions is diversity: AWS recommends being flexible across at least 10 instance types per workload and using the `price-capacity-optimized` allocation strategy in an Auto Scaling group.

!

Never fail Spot over to on-demand "to compensate": AWS explicitly discourages it, it can actually trigger more interruptions on your other Spot instances. Fault-tolerant architecture first, savings second. Details: Best practices for Amazon EC2 Spot.

Compute Savings Plan
66% off
EC2 Instance SP / Standard RI
72% off
Spot (disposable)
90% off
07

Two overlooked seams: storage and ARM

After compute, two levers almost always slip under the radar even though they're nearly free to enable: the right S3 storage class and the migration to Graviton.

S3: stop paying everything at the Standard rate

On most buckets, a large share of objects is never read again after a few weeks: logs, exports, client uploads, backups. Leaving them in S3 Standard means paying the most expensive rate for dormant data. S3 Intelligent-Tiering fixes this hands-off: it automatically moves an object to a cheaper tier after 30 days without access, then to Archive Instant Access after 90 days — and pulls it back instantly if it's read again.

30 jno access → automatic move to Infrequent Access
90 jno access → Archive Instant Access, still millisecond access
90 / 180 joptional archive tiers (async) for the lowest cost
< 128 Koobjects not monitored, stay in Frequent Access
i

Intelligent-Tiering shines when access patterns are unknown or shifting — the default case on a scale-up. The mechanism and exact thresholds are documented here: How S3 Intelligent-Tiering works. For known lifespans (logs to delete at 90 days), a plain lifecycle policy stays simpler and cheaper.

Graviton: the same load, on ARM, cheaper

Graviton instances (AWS's in-house ARM processor) cost up to 20% less than their x86 equivalents, for the same performance and up to 60% less energy. On a baseline running 24/7, that's a cut that stacks with the Savings Plan on top. The migration cost? Often zero for managed services (RDS, ElastiCache) or multi-arch containerized workloads; sometimes a rebuild for natively compiled code.

I always start with managed services and stateless workers: low risk, immediate gain. The official figures and the estimation tool are here: AWS Graviton.

Governance: catch the drift before the bill

A budget with an 80% alert catches the overrun — but too late, and only if you set the threshold right. AWS Cost Anomaly Detection goes further: a machine learning model learns your normal spend pattern (per service, account, tag) and alerts you when a line deviates, with root-cause analysis by service, account, region or usage type. That's what catches a forgotten test instance or a bucket blowing up before it costs a whole month.

i

The service is free and sets up in minutes with AWS-managed monitors that automatically track new accounts and tags. Getting started: Getting started with AWS Cost Anomaly Detection.

08

Sources & further reading

01AWS — Compute Savings Plans and Reserved InstancesThe official comparison table: -66% vs -72%, flexibility, reserved capacity.02AWS — Best practices for Amazon EC2 Spot-90% vs on-demand, diversity across 10+ types, price-capacity-optimized strategy.03AWS — Prepare for Spot Instance interruptions2-minute notice, rebalance recommendations, Auto Scaling group.04AWS — How S3 Intelligent-Tiering worksExact thresholds (30 / 90 / 180 days), archive tiers, objects < 128 KB.05AWS — EC2 GravitonUp to 20% cheaper and 60% less energy than the equivalent x86.06AWS — Getting started with Cost Anomaly DetectionMachine-learning detection, AWS-managed monitors, root-cause analysis.07AWS — Understanding and managing S3 storage classesFull overview of S3 classes to choose from before enabling a lifecycle.

Cutting an AWS bill isn't a stroke of technical genius, it's discipline: see, cut the obvious waste, commit on the stable, and monitor. Half is often recovered without writing a line of code.