Cloud cost architecture: the levers, in order of size
What it is
The set of changes that reduce a cloud bill, ordered by how much they typically move it, plus the observation that the order is stable across companies and almost nobody works it in order.
THE LEVERS, roughly by size of effect
1. DELETE THINGS NOBODY USES 10-30%
2. RIGHT-SIZE OVER-PROVISIONED
COMPUTE 10-25%
3. COMMITMENT DISCOUNTS
(reserved, savings plans) 20-40% on committed
4. STORAGE TIERING AND LIFECYCLE 10-30% of storage
5. ARCHITECTURAL: caching, batching,
and removing a component variable, often the
largest single win
6. SPOT / PREEMPTIBLE FOR
INTERRUPTIBLE WORK up to 70-90% on that
workload
7. EGRESS AND CROSS-AZ TRAFFIC often the surprise
8. INSTANCE FAMILY AND ARCHITECTURE
(Graviton and equivalents) 10-40% on compute
Commonly confused with a FinOps reporting exercise. Attribution tells you where the money goes and changes nothing; the levers are what change it, and a cost programme that produces dashboards and no architectural change is the standard failure.
Also commonly confused with a one-time project. Cloud cost is a rate, not a balance, so a one-time 30 percent reduction is reversed by two quarters of growth unless something structural changed.
The problem it solves
The bill grows faster than traffic, and nobody can say why.
THE SHAPE OF THE PROBLEM
traffic +40% year on year
bill +85% year on year
The gap is the thing to explain, and it is almost never one
cause. It is typically:
environments nobody turned off
instances sized for a launch that never came
storage with no lifecycle policy
a chatty service pair that moved across an AZ boundary
a data pipeline that reprocesses everything nightly
because incremental was never built
And the reason the gap persists: nobody owns it. Engineering owns latency, product owns features, finance owns the total, and the per-service cost that would let anyone act sits between them.
Mechanics
Lever 1: delete things nobody uses
Consistently the largest and cheapest lever, and consistently done last because it is unglamorous.
WHAT TO LOOK FOR
non-production environments running 24/7 that are used
9 hours a weekday
-> 168 hours to 45 is a 73% reduction on those
unattached storage volumes and old snapshots
load balancers with no healthy targets
idle instances from a migration that finished
logs retained for years with a 30-day access pattern
dev databases nobody has connected to in 90 days
duplicate monitoring agents from two overlapping tools
THE MECHANISM THAT MAKES IT STICK
Not a cleanup sprint. A scheduled scaledown for
non-production (off at 19:00, on at 08:00, weekends off),
and a tag policy where an untagged resource older than
N days is a candidate for deletion with a notification
first.
The scheduled scaledown is worth arguing for specifically, because it is a one-time change that keeps saving, whereas a cleanup sprint reverses within two quarters.
Lever 2: right-sizing, and the metric that matters
THE COMMON STATE
Instances chosen by copying the last service, or sized
for a peak that was estimated rather than measured.
Typical finding: 20-40% average CPU utilisation and
memory at 30%, on instances that could be one size down.
THE METRIC TO USE
Not average CPU. p95 CPU and p95 memory over a full
weekly cycle, because the point is whether the smaller
size survives the peak.
THE DISCIPLINE
Right-size DOWN one step, watch for a week, repeat.
A single large jump is how you cause an incident and lose
the mandate for the whole programme.
And the caution that keeps this honest: right-sizing has a floor set by the latency SLO, not by utilisation. A service at 40 percent CPU may be correctly sized if it needs headroom for burst, and queueing theory says waiting explodes as utilisation approaches one. Sizing to 80 percent average CPU is not efficiency, it is a latency incident scheduled for the next traffic spike.
Lever 3: commitments, and how to size them
The discount is real (typically 20-40% for one to three
year commitments) and the risk is committing to capacity
you stop needing.
THE SIZING RULE
Commit to your FLOOR, not your average.
Look at the last 12 months of usage and commit to roughly
the minimum sustained level, so the commitment is covered
even in a trough.
Then cover the middle with a shorter or more flexible
commitment, and the peak with on-demand.
A common shape: 60-70% committed, 20-30% flexible,
10-20% on-demand.
WHAT MAKES IT SAFE
Convertible or flexible commitment types, which allow
changing instance family, cost slightly less discount and
remove most of the regret risk.
And commit AFTER right-sizing, never before, or you have
committed to instances you were about to shrink.
"Right-size before you commit" is the ordering error that costs the most, because a three-year commitment to over-provisioned instances locks in the waste.
Lever 5: the architectural levers, which are the largest single wins
Levers 1 through 4 are hygiene and they are bounded. The architectural ones are unbounded and they are where the outsized results are.
CACHING
A 40 ms query served from a 0.5 ms cache at 90% hit rate
removes 90% of the database load, which frequently
removes a database tier.
BATCHING
Per-request work batched into per-second work. One API
call per event at 2,000 events/sec against one call per
100 events is a 100x reduction in request charges.
REMOVING A COMPONENT
The largest single win available, and the one nobody
looks for. A service whose entire job could be a library
call. A queue between two services that always run
together. A cache in front of something already fast.
DATA PROCESSING SHAPE
A nightly job that reprocesses everything because
incremental was never built. Changing it to incremental
is often a 90%+ reduction on that pipeline.
STORAGE FORMAT
Uncompressed JSON to compressed Parquet is typically
5-10x on both storage and scan cost for analytical data.
Columnar means a query touching 3 of 40 columns reads
3/40 of the bytes.
The example worth carrying: an LLM workload's cost is dominated by prompt structure rather than model choice. Putting the stable system prompt and examples first so the provider's cache applies can remove most of the input cost, and it is message ordering rather than an architecture change. See LLM cost engineering.
Lever 7: egress and cross-AZ, the surprise
THE THING PEOPLE DO NOT MODEL
Cross-AZ traffic is charged in both directions on most
clouds. Two chatty services in different AZs pay for
every message, twice.
A 200 MB/s service-to-service link across AZs, at typical
per-GB rates, is a five-figure monthly line item that
appears under "data transfer" and is attributed to
nobody.
Internet egress is more expensive still, which is why a
CDN in front of anything user-facing pays for itself on
the transfer alone before considering latency.
WHAT TO DO
Keep chatty pairs AZ-local, with cross-AZ replicas for
availability rather than for traffic.
Use VPC endpoints for cloud service traffic so it does
not traverse the internet gateway.
Compress everything crossing a boundary. At a 500 µs
round trip, compression is free in latency terms and it
is bandwidth you are billed for.
Put a CDN in front of anything served to users.
"Data transfer" being the third-largest line item and attributed to nobody is a common finding, and it is invisible in per-service cost reporting because it is charged to the account rather than to a workload.
The order to work them
1. Delete unused cheap, large, immediate
2. Right-size cheap, large, needs a week
of watching per step
3. Storage lifecycle cheap, large on storage
4. Fix the egress surprise usually one or two chatty
pairs
5. Commitments AFTER right-sizing
6. Architectural expensive, largest, and it
is the only category that
changes the growth RATE
7. Spot for interruptible high value, needs the
workload to tolerate
interruption
8. Instance architecture often a rebuild-and-test,
10-40% on compute
Steps 1 to 5 reduce the current bill. Step 6 changes the slope, and that distinction is the one to make to leadership, because a cost programme that only does 1 to 5 delivers a step change that growth erases.
A worked example: a bill growing at twice the traffic rate
CONTEXT
$180k/month, growing 85% year on year against 40% traffic
growth. Leadership asked for a 30% reduction.
THE BREAKDOWN (two days of work, and the first useful step)
compute $71k 39%
managed databases $38k 21%
data transfer $26k 14% <- unattributed
object storage $22k 12%
managed services (other) $19k 11%
observability $4k 2%
WHAT THE LEVERS FOUND
1. DELETE. Three non-production environments running
24/7, two idle load balancers, 4 TB of snapshots older
than a year, and a duplicate APM agent on every host
from a migration that finished 14 months earlier.
-> $19k/month. Two engineer-weeks.
2. RIGHT-SIZE. p95 CPU across the fleet was 22%. Stepped
down one size at a time over six weeks.
-> $14k/month.
4. EGRESS. The 14% data transfer line was almost entirely
two services: the API and the feature store, which
were in different AZs and exchanged 180 MB/s.
Co-locating them (with cross-AZ replicas kept for
availability) removed most of it.
-> $17k/month, from a change that took three days.
*** This was the single largest per-effort win and
nobody had looked, because "data transfer" was
attributed to no team. ***
5. COMMITMENTS. Applied AFTER right-sizing, at 65% of the
new floor, on flexible plans.
-> $16k/month.
6. ARCHITECTURAL. The nightly analytics job reprocessed
the full dataset because incremental had never been
built. Six engineer-weeks to make it incremental.
-> $11k/month, AND it stopped growing with data
volume, which is the part that matters.
TOTAL: $77k/month, 43% against a 30% target.
THE FINDING WORTH REPORTING
Five of the six were hygiene, and together they were a
step change that 40% traffic growth would erase in about
eighteen months. Only the sixth changed the growth rate,
and it was the only one that required real engineering.
So the recommendation to leadership was: take the 43%,
and fund two more architectural items, because otherwise
we are having this conversation again next year.
Production evidence
The FinOps Foundation framework (inform, optimise, operate) is the standard organising model, and its central claim, that cost optimisation is a continuous practice rather than a project, is the basis for the rate-versus-balance framing.
Cloud provider pricing documentation on cross-AZ and internet egress charges is the source for the data-transfer point, and the fact that cross-AZ is billed in both directions on major providers is the specific detail teams miss.
AWS's Graviton, and equivalent ARM offerings elsewhere, publish price-performance improvements in the 20 to 40 percent range for suitable workloads, which is the basis for the instance-architecture lever, and the caveat is that it needs a rebuild and a performance test rather than a config change.
Spot and preemptible instance documentation across providers gives the 70 to 90 percent discount range and the interruption semantics that determine which workloads can use it.
Columnar format benchmarks (Parquet versus row-oriented formats, and the ClickHouse and DuckDB literature) support the 5 to 10x storage and scan reduction for analytical workloads.
Queueing theory, and the Universal Scalability Law, is the basis for the right-sizing floor: waiting time scales as one over one minus utilisation, so sizing to high average utilisation trades a cost saving for a latency cliff.
The debate
The case for working the hygiene levers first: they are cheap, fast, low-risk and they build the mandate. A team that delivers 20 percent in a month gets funded for the architectural work; one that proposes a six-month re-architecture first does not.
The case for going straight to architecture: hygiene is a step change that growth erases, and the only durable improvement is changing what the system does. Spending two quarters on right-sizing delays the work that matters.
The case for buying a cost tool: attribution is genuinely hard and the tools do it well.
The case against the tool: attribution changes nothing on its own, and a cost programme that produces dashboards and no architectural change is the standard failure mode.
My position: work the hygiene levers in order to fund the credibility, then spend it on the architectural ones, and be explicit with leadership about which category each item is in.
The distinction I would make in every cost conversation is that hygiene reduces the bill and architecture changes the slope. In the worked example five of six items were hygiene, delivering a 43 percent reduction that 40 percent traffic growth erases in about eighteen months. Only the incremental-processing change altered the growth rate. Reporting a percentage without that distinction sets up the same conversation next year.
The single highest-return item in my experience is the one nobody looks at: egress and cross-AZ traffic. In the example it was 14 percent of the bill, almost entirely two chatty services in different availability zones, and three days of work removed most of it. It stays invisible because "data transfer" is charged to the account rather than to a team, so per-service cost reporting shows nobody responsible for it.
The ordering error that costs the most is committing before right-sizing, because a three-year commitment to over-provisioned instances locks in the waste for three years. Right-size, watch for a few weeks, then commit to the new floor.
And the caution that keeps right-sizing from causing an incident: the floor is set by the latency SLO, not by utilisation. Queueing time scales as one over one minus utilisation, so a service at 40 percent CPU may be correctly sized for burst headroom, and sizing everything to 80 percent average is a latency incident scheduled for the next spike. Step down one size at a time and watch for a week, because a single large jump is how you cause an incident and lose the mandate for the whole programme.
Where I would push back on a request for a cost target: ask whether the goal is the bill or the unit economics. A bill that grows 40 percent while traffic grows 60 percent is a success, and a flat bill on flat traffic with rising cost per transaction is a failure. Cost per unit of business outcome is the number that survives growth.
Follow-up Q&A
"Where do you start on a cloud bill?" With the breakdown, then the levers in order of effort-to-effect: delete what nobody uses, right-size, storage lifecycle, fix the egress surprise, apply commitments, then architecture. Deleting unused resources is consistently the largest and cheapest lever and consistently done last because it is unglamorous, and the version that sticks is a scheduled scaledown for non-production rather than a cleanup sprint, because a sprint reverses within two quarters.
"What's the lever people miss?" Egress and cross-AZ traffic. Cross-AZ is billed in both directions on major clouds, so two chatty services in different availability zones pay for every message twice. In one case that was fourteen percent of the bill, almost entirely two services exchanging 180 megabytes a second across an AZ boundary, and co-locating them took three days. It stays invisible because "data transfer" is charged to the account rather than to a team, so it appears in no per-service report and nobody owns it.
"How do you size a commitment?" To your floor, not your average: look at twelve months of usage and commit to roughly the minimum sustained level, so it is covered even in a trough. Then flexible commitments for the middle and on-demand for the peak, typically something like 65 percent committed. And the ordering matters more than the sizing: right-size first, then commit, because a three-year commitment to over-provisioned instances locks in the waste for three years.
"What's the risk in right-sizing?" Causing a latency incident and losing the mandate for the whole programme. The floor is set by the SLO rather than by utilisation, because queueing time scales as one over one minus utilisation, so a service at 40 percent CPU may be correctly sized for burst headroom and sizing everything to 80 percent average is an incident scheduled for the next spike. So: p95 CPU and memory over a full weekly cycle rather than averages, and step down one size at a time watching for a week.
"Which lever is actually the largest?" The architectural ones, and they are unbounded where the others are not. Caching that removes a database tier, batching that turns per-request work into per-second work, changing a nightly full reprocess to incremental, or removing a component entirely. In one case making an analytics job incremental was six engineer-weeks for $11k a month, and more importantly it stopped that cost growing with data volume.
"What's the distinction you'd make to leadership?" Hygiene reduces the bill; architecture changes the slope. In the case I worked, five of six items were hygiene and delivered 43 percent against a 30 percent target, and 40 percent traffic growth erases that in about eighteen months. Only the incremental-processing change altered the growth rate. Reporting a percentage without that distinction sets up the identical conversation next year, so the recommendation was to take the 43 percent and fund two more architectural items.
"Is a FinOps tool worth it?" For attribution, yes, because it is genuinely hard and the tools do it well. But attribution changes nothing on its own, and the standard failure is a cost programme that produces excellent dashboards and no architectural change. I would treat the tool as the input to the lever list rather than as the deliverable, and I would judge the programme on cost per unit of business outcome rather than on the reporting.
"What if leadership asks for a flat bill?" I would ask whether the goal is the bill or the unit economics, because those diverge. A bill growing 40 percent while traffic grows 60 percent is a success; a flat bill on flat traffic with rising cost per transaction is a failure. Cost per resolved ticket or per active user is the number that survives growth, and it is also the number that tells you whether a feature is worth what it costs.
"What about spot instances and ARM?" Both real and both conditional. Spot is 70 to 90 percent off for workloads that tolerate interruption, which means batch, CI, stateless workers with fast rescheduling, and not a stateful primary. ARM instances are typically 20 to 40 percent better on price-performance for suitable workloads, and it is a rebuild-and-performance-test rather than a config change, so it belongs later in the list than its headline number suggests.
Common misconceptions
"Cost optimisation is a project." It is a rate, not a balance. A one-time 30 percent reduction is erased by two quarters of growth unless something structural changed.
"Attribution is the work." Attribution tells you where the money goes and changes nothing. The levers change it, and a dashboard-only programme is the standard failure.
"Right-size to high utilisation." Queueing time explodes as utilisation approaches one. The floor is the latency SLO, not the utilisation number.
"Commit early for the discount." Commit after right-sizing, or you lock in the over-provisioning for the length of the term.
"Data transfer is a small line item." Cross-AZ is billed both directions and is frequently the third-largest category, attributed to nobody.
Interview delivery note
Give the levers in order and name the one people skip: "There's a stable order to these: delete what nobody uses, right-size, storage lifecycle, fix egress, commitments, then architecture. The first is consistently the largest and cheapest and consistently done last because it's unglamorous, and the version that sticks is a scheduled scaledown for non-production rather than a cleanup sprint."
Volunteer the surprise, because it is the highest per-effort win: "The one nobody looks at is cross-AZ traffic, which is billed in both directions. In one case it was fourteen percent of the bill, almost entirely two services exchanging a hundred and eighty megabytes a second across an AZ boundary, and co-locating them took three days. It's invisible because 'data transfer' is charged to the account rather than a team, so no per-service report shows it."
Name the ordering error: "And right-size before you commit, never the other way round, because a three-year commitment to over-provisioned instances locks in the waste for three years."
Give the caution that shows you have done it: "Right-sizing has a floor set by the SLO rather than by utilisation. Queueing time scales as one over one minus utilisation, so a service at forty percent CPU may be correctly sized for burst. I'd step down one size at a time and watch for a week, because a single large jump causes an incident and you lose the mandate for the whole programme."
Close with the framing for leadership: "and I'd be explicit that hygiene reduces the bill and architecture changes the slope. In the case I worked, five of six items were hygiene, delivering forty-three percent, which forty percent traffic growth erases in about eighteen months. Only the incremental-processing change altered the rate. Reporting a percentage without that distinction sets up the same conversation next year."
Further reading
- The FinOps Foundation framework and the FOCUS specification, for the practice and the cost-data model.
- Cloud provider pricing documentation on cross-AZ and internet egress, read specifically for the both-directions detail.
- The AWS Well-Architected cost optimisation pillar, for right-sizing and commitment guidance.
- Gunther's Guerrilla Capacity Planning, for the utilisation floor that right-sizing must respect.
- LLM cost engineering, for the same lever ordering applied to model spend.