Cutting the AWS Bill — 28 case studies

Part 8: Technique Catalogue, Maths and Pitfalls

Part 8 of 10 · intermediate

Sep 26, 2026 · devops · 13 min read · 2626 words intermediate

The AWS cost technique catalogue, the maths, and twenty pitfalls.

devops aws finops reference

This part is the reference chapter: every technique from the 28 case studies organised by the AWS service it applies to (EC2, containers and serverless, storage, databases and caches, networking, observability, pricing and commitments), each with why it saves money, what to watch out for and which cases used it; the reusable back-of-envelope maths (payback period, S3 break-even, scheduling, NAT versus endpoints, the cost of one log line, cross-AZ chatter, sanity-checking a claimed saving, commitment sizing); and twenty pitfalls with a guard rail for each. Use it as a checklist during a cost review. Prices are approximate us-east-1 list prices as of September 2026 and change often, so confirm on the current AWS pricing pages before you rely on any figure.

Get the full report. This series expands the research report Cutting the AWS Bill: 28 Case Studies (53 pages, PDF, 780 KB). One click starts the download.

⬇ Download PDF

1. How to use this reference

The earlier parts tell stories. This one is for the day you sit down with a Cost Explorer view and a coffee and need to know: what could I try on this line item, what could go wrong, and who has done it already? Find the service, read the row, and follow the cross-reference to the part that tells the full story.

Two cautions apply to everything below. First, prices quoted are approximate us-east-1 list prices as of September 2026; confirm current numbers before deciding. Second, every technique has a watch-out for a reason: each one is the residue of someone's near-miss or incident.

Reading a catalogue row Techniquewhat to do Why it saveswhich term of equation Watch-outswhat breaks Seen ingo read the case Technique + Why + Watch-outs + Evidence: never apply a row without reading its watch-out.

Fig. 1 - Every catalogue row has the same four parts.

2. Compute: EC2

TechniqueWhy it savesWatch-outsSeen in
Delete idle and temporary instancesStops paying for forgotten capacity and attached EBSVerify ownership; stopped instances still pay for EBS and Elastic IPsLevels.fyi 1, Duolingo
Right-size (Compute Optimizer)Most fleets run far below capacityCheck memory as well as CPU; watch p99 latencySegment, Duolingo
Graviton / newer generationAround 20% lower price per instance, often better performanceNative dependencies, x86-only binaries, licensed softwarePinterest, Honeycomb, Zomato, Zendesk (Part 4)
Spot for tolerant workloadsUp to ~90% off On-DemandInterruptions; diversify types and AZs; checkpointSalesforce, Lyft CI, Moneysmart, Tinybird (Part 5)
Bin-pack onto fewer instance typesHigher utilisation; simpler commitmentsNoisy neighbours; blast radiusSegment
Schedule non-productionPay only for working hoursProvide a self-service wake-upMoneysmart

3. Compute: containers and serverless

TechniqueWhy it savesWatch-outsSeen in
ECS/Fargate task right-sizingTasks are billed on requested vCPU and memory, not usageDuolingo found 90-95% memory utilisation safe; test your ownDuolingo, Levels.fyi 1
Lower minimum tasks, calmer scale-outFewer idle tasks off-peakKeep headroom for cold startsDuolingo, Levels.fyi 1
EKS: Karpenter plus consolidationJust-in-time nodes, continuous repacking, Spot mixRequires graceful shutdown and disruption budgetsTinybird, Salesforce
EKS: right-size pod requests firstSchedulers pack requests, not usageUse VPA recommendations; avoid OOM killsTinybird
EKS: stay on standard supportExtended-support versions carry a much higher control-plane fee (about $0.60 vs $0.10 per cluster-hour)Plan upgrades on a cadenceGeneral practice
Lambda on arm64About 20% lower duration price, often fasterCheck native modules and layersLevels.fyi 1
Step Functions: avoid per-second transitionsStandard workflows bill per state transitionUse Express workflows or in-process orchestration for high volumePrime Video (Part 6)

4. Storage: S3, EBS, backups, registries

TechniqueWhy it savesWatch-outsSeen in
S3 lifecycle to IA / Glacier IR / Deep ArchiveStandard ~$0.023, IA ~$0.0125, Glacier IR ~$0.004, Deep Archive ~$0.00099 per GB-monthPer-object transition fees; 30/90/180-day minimums; 128 KB minimum billable sizeCanva, Snap, Rewind, Levels.fyi 1, Pinterest (Part 3)
Measure access firstStorage Class Analysis and Storage Lens show real accessProduct changes can reheat cold dataCanva
Expire noncurrent versionsVersioned buckets keep every overwrite forever by defaultKeep enough history for recoveryDuolingo
Abort incomplete multipart uploadsOrphaned parts are billed but invisible in listingsAdd a lifecycle rule to every bucketGeneral practice
Intelligent-TieringAutomatic tiering for unpredictable accessPer-object monitoring fee; objects under 128 KB are not tieredAirbnb
Pause event consumers during bulk transitionsPrevents a flood of storage-class eventsRe-attach listeners afterwardsLevels.fyi 1
EBS gp2 to gp3About 20% cheaper per GB; IOPS and throughput decoupledSet IOPS/throughput to match gp2 burst if neededLevels.fyi 1
Delete unattached volumes and old snapshotsOrphans accumulate after instance deletionSnapshot before deletingSegment, Levels.fyi 1
Tiered backup retention (grandfather-father-son)Keeps recovery points while cutting copiesDocument the policy for auditorsLevels.fyi 2
ECR lifecycle policiesOld images pile up per buildKeep images referenced by running or rollback releasesLevels.fyi 1

5. Databases and caches

TechniqueWhy it savesWatch-outsSeen in
Graviton classes and gp3 storage for RDSLower price per vCPU and per GBTest extensions and driversLevels.fyi 1
Aurora I/O-OptimizedRemoves per-I/O charges for I/O-heavy clustersEvaluate when I/O is roughly a quarter or more of Aurora spendDuolingo
DynamoDB key designCapacity is sized by the hottest partitionNeeds data-model changesSegment
DynamoDB TTLAutomatic deletion of stale itemsDoes not clean existing rows unless you backfill the attributeDuolingo
DynamoDB Standard-IA table classCheaper storage for large, rarely read tablesHigher read/write pricesDuolingo
Capacity mode reviewOn-demand for spiky, provisioned plus autoscaling for steadyRevisit as traffic maturesLyft (top 25 tables)
Find orphaned caches and databasesLegacy features leave them behindCheck connections from inside firstLevels.fyi 1, Duolingo
Valkey engine for ElastiCachePriced below Redis OSS on ElastiCacheValidate client compatibilityLevels.fyi 2
Database Savings PlansUp to 35% off with a one-year, no-upfront commitment across engines and regionsCommit after right-sizing; one-year term onlyPart 6

6. Networking and data transfer

TechniqueWhy it savesWatch-outsSeen in
S3 and DynamoDB gateway endpointsFree; removes NAT processing (~$0.045/GB) for that trafficConfirm every private route table has the prefix-list routenOps, general practice
Interface endpoints for chatty AWS APIsCheaper than NAT for ECR pulls, CloudWatch, STS at volumeHourly fee per AZ; do the mathsnOps
Zone-aware routingAvoids cross-AZ charges (~$0.01/GB each way)Balance capacity per AZDoorDash
Remove hairpins through CDN/WAFStops paying per-request edge prices for internal trafficReplace edge caching first (shadow-run)Levels.fyi 2
PrivateLink for overlapping CIDRsPrivate connectivity without re-addressing networksCheck AZ coverage of endpointsLevels.fyi 2
Trace bytes with VPC Flow LogsTurns a network line item into a list of talkersFlow logs have their own cost; samplenOps
Release unused public IPv4 addressesAWS charges for every public IPv4 address (about $0.005/hour each)Prefer private subnets plus endpointsGeneral practice
Cheaper CDN or better cache-hit ratioFor content sites the CDN can be the largest line itemEgress and request pricing differ widelyLevels.fyi 1

7. Observability

TechniqueWhy it savesWatch-outsSeen in
Set log retention everywhereCloudWatch log groups default to never expireKeep audit logs per policyLevels.fyi 1, Duolingo
Stop logging payloads and stack tracesIngestion is priced per GB (around $0.50 in the standard class)Keep error-level detail; sample the restLevels.fyi 2, Duolingo
Cheaper destinations for bulk logsS3 (or the CloudWatch Infrequent Access class) is far cheaper for rarely read logsLose some real-time query featuresLevels.fyi 2
Filter WAF/CDN logsKeep blocked or suspicious requests, not every allowed oneSecurity team sign-offLevels.fyi 2
Automated anomaly detectionCatches regressions within daysTune thresholds per serviceDuolingo

8. Pricing and commitments

TechniqueWhy it savesWatch-outsSeen in
Compute Savings PlansFlexible across families, regions, Fargate and LambdaCommit to the trough, not the averageAirbnb
Reserved Instances at high coverageAbout 50% off for predictable baselinesLess flexible than Savings PlansHERE
Database Savings PlansExtends commitment discounts to databases, including serverlessOne-year term onlyPart 6
Managed-Spot or group-buying servicesOutsourced optimisation for a share of savingsFees (e.g. 20% of savings); resale rulesMoneysmart, Levels.fyi 1

9. The maths, gathered in one place

Every calculation here was used by a case-study team. Do the arithmetic for your own numbers; the point of each formula is to turn an opinion into a number you can argue about.

9.1 Payback period

payback_months = one_off_cost / monthly_saving

Canva: $1.6M divided by $0.3M a month is about 5.3 months. Rewind: $103K divided by $16K a month is about 6.4 months. 37signals: roughly $700K of hardware against about $160K a month of reduced cloud spend, recouped within 2023. Anything under six months is usually an easy yes; above eighteen months needs a strategic reason.

9.2 S3 transition break-even by object size

months = (0.02 / 1000) / (object_GB x (0.0125 - 0.004))
Average object sizeMonths to break evenVerdict
128 KB19.3Only if data will stay cold for years
200 KB12.3Marginal
400 KB6.2Canva's cut-off; good
1 MB2.4Excellent
4 MB0.6Immediate win

Glacier IR also bills a minimum of 90 days per object and 128 KB per object, and its retrieval charges are higher than Standard-IA's. Include expected retrieval volume if data is not truly cold. Part 3 works this in detail.

9.3 Scheduling non-production

ScheduleHours per weekCompute saving vs 24x7
24 x 71680%
Weekdays 07:00-22:00 (Moneysmart)7555%
Weekdays 08:00-20:006064%
Weekdays 09:00-19:005070%

9.4 NAT gateway versus gateway endpoint

A workload in private subnets pushing 10 TB a month to S3 through a NAT gateway pays about 10,240 GB times $0.045, roughly $461 a month in processing, plus about $33 per NAT gateway per month in hourly charges (times the number of AZs). Through an S3 gateway endpoint the same traffic costs nothing extra. For ECR image pulls, CloudWatch or STS, interface endpoints cost about $0.01 per hour per AZ plus $0.01 per GB, which beats NAT once volume is more than a few hundred GB a month.

9.5 The cost of one log line

A Lambda invoked 50 million times a month that logs a 20 KB event on every call writes roughly 950 GB a month. At around $0.50 per GB ingested, that is about $475 a month before storage, and storage keeps growing if the log group never expires. A 200-byte summary line instead writes about 9.5 GB, roughly $5 a month: the same 99% reduction Levels.fyi saw.

9.6 Cross-AZ chatter

Two services exchanging 50 TB a month across AZs pay about $0.01 per GB in each direction, around $1,000 a month. If zone-aware routing keeps 80% of that traffic local, the charge falls to roughly $200. The saving grows linearly with every new hop in a microservice call chain.

9.7 Sanity-checking a claimed saving

Levels.fyi cut RDS snapshot storage from 15.7 TB to 3 TB and reported about $1,200 a month in savings. At roughly $0.095 per GB-month for RDS backup storage beyond the free allowance, 12.7 TB is about $1,235 a month, which matches. Reproducing a claimed saving from list prices is a quick way to check that you understand where the money went.

9.8 Commitment sizing

  • Finish right-sizing, Graviton moves and scheduling first; commitments freeze the footprint.
  • Look at hourly eligible spend over the last 30-60 days and commit to roughly its trough, not its average.
  • Ladder purchases (for example quarterly) so commitments expire at different times and can track change.
  • Track coverage (discounted share of eligible usage) and utilisation (share of commitment used); aim high on utilisation before pushing coverage.
  • Prefer Compute Savings Plans and Database Savings Plans when your instance families or engines are still changing.

9.9 Three yes/no checklists

Is it a Spot candidate?Is it Graviton-ready?Would leaving pay off?
Stateless or checkpointed; tolerates a two-minute termination notice; runs on several instance types; horizontally scaled; retries are cheapInterpreted or JVM runtime, or you control the build; no x86-only binaries or licensed agents; base images published for arm64; CI can build multi-arch images; benchmark on production-like loadLoad is steady and predictable; storage and egress dominate the bill; few managed-service dependencies; in-house ops and hardware skills; existing racks, power and contracts

10. Twenty pitfalls and their guard rails

PitfallSeen inGuard rail
Committing before optimisingHERE (context), generalRight-size and modernise first; commit to the new trough
Trusting the last few days in Cost ExplorerLevels.fyi 2Check a control line item; wait several days
Deleting based on activity graphsLevels.fyi 1Inspect from inside (INFO, connections); snapshot first
Bulk storage-class changes firing eventsLevels.fyi 1Pause or filter S3 event consumers during transitions
Ignoring transition fees and minimum durationsCanva, RewindCompute payback per bucket; align ages with minimums
Assuming a new TTL cleans old dataDuolingoBackfill the TTL attribute or run a one-off purge
Never reverting incident scale-upsSegmentCreate a scale-down ticket in every incident review
Staging larger than productionDuolingoBudget alerts per environment; schedules for non-prod
Per-transition orchestration in hot loopsPrime VideoEstimate cost per unit of work; keep inner loops in memory
Internal traffic hairpinning through the edgeLevels.fyi 2Private paths (PrivateLink, endpoints) for service calls
Gateway endpoint without the routenOpsAudit route tables for the S3/DynamoDB prefix-list route
Round-robin across AZs by defaultDoorDashZone-aware or topology-aware routing with balanced capacity
Spot or consolidation without graceful shutdownTinybirdSIGTERM handling, PDBs, readiness probes first
Single-instance proofs of conceptLevels.fyi 2Test across every AZ and instance group before cutover
Timeouts that measure the wrong thingLevels.fyi 2Measure on an idle path; do not discard completed work
Lift-and-shift without modernisationGEICORight-size and re-architect during migration
Comparing exits to On-Demand list pricesOneUptime (critics)Compare with the best cloud price including SP and Spot
Maximal compliance retentionLevels.fyi 2Define, document and follow a tiered retention policy
Logging full payloads and stack tracesLevels.fyi 2, DuolingoSummary lines, sampling, error-only in loops
Forgetting double-running costsDropboxBudget for parallel systems during migrations
Group-buying commitments without checking termsLevels.fyi 1Verify current AWS resale and pooling rules

The pitfalls cluster into four families: order (commit before optimising), evidence (trusting graphs and fresh billing data), side effects (event floods, hairpins, churn) and scope (one-instance proofs of concept, lift-and-shift). Most guard rails are a habit rather than a tool: snapshot first, price the one-off, test across every zone, and keep a ticket to undo every emergency scale-up.

Which section of this catalogue should I start with?

Start with observability and storage: log retention, versioning, multipart-upload aborts and lifecycle rules are the lowest-risk, highest-certainty rows, and they appear in nearly every case study. Then networking (endpoints), then compute swaps, and commitments last.

Are these prices still correct?

They are approximate us-east-1 list prices as of September 2026 and change frequently. Use them to understand the shape of each trade-off and always confirm on the current AWS pricing pages.

How do I sanity-check a saving someone claims?

Reproduce it from list prices, as in the RDS backup example: 12.7 TB at about $0.095 per GB-month is roughly $1,235 a month, matching the reported $1,200. If the numbers do not reconcile, the scope or the assumption is different from what you think.

Takeaways

  • Use the catalogue per service. Find the line item, read the watch-out, then read the case.
  • Log retention, versioning, multipart aborts and lifecycle rules are the lowest-risk rows and appear everywhere.
  • The maths fits on one page: payback, S3 break-even, schedules, NAT versus endpoints, log lines, cross-AZ, sanity checks, commitment sizing.
  • Pitfalls cluster into order, evidence, side effects and scope.
  • Confirm prices before relying on any figure; the shape of the trade-off matters more than the third digit.

References & further reading

Keep it offline. The complete 28-case report, with the scoreboard, lever matrix and 90-day playbook, is one PDF.

⬇ Download PDF
← Part 7 next: Part 9 →
© cvam — written in plaintext, served warm