Back to Blog
AWSS3storagereduce_costs

S3 storage classes, the parts that bite

The real economics of S3 tiers: minimum durations, the 128KB minimum billable object, retrieval fees, and when Standard-IA actually beats Standard.

JohannaOctober 14, 20256 min read

The list price of an S3 storage class is the least interesting number on the page. What determines your bill is a set of rules that live in the fine print: minimum storage durations, a minimum billable object size, per-request charges, and retrieval fees that only appear when you actually need your data. I have watched teams "save money" by moving to a cheaper class and then triple their spend, because they moved the wrong data. This is a tour of the mechanics that decide whether a tier helps you or quietly bills you for the privilege.

All prices below are us-east-1 and will drift over time and by region. Treat them as ratios, not gospel — the ratios are what make or break a decision.

The tiers, and what each one is really for

S3 Standard is $0.023/GB-month. No retrieval fee, no minimum duration, millisecond access. It is the default for a reason.

The infrequent-access pair trades storage for a retrieval toll:

  • Standard-IA: ~$0.0125/GB-month storage, plus $0.01/GB every time you read the data. Three-AZ durability like Standard.
  • One Zone-IA: ~$0.01/GB-month, same $0.01/GB retrieval, but stored in a single Availability Zone. If that AZ is lost, the data is gone. Fine for re-creatable derivatives (thumbnails, transcodes), reckless for anything you can't regenerate.

Then the Glacier family, which is archival storage wearing three different masks:

  • Glacier Instant Retrieval: ~$0.004/GB-month, millisecond access, but a $0.03/GB retrieval fee — three times the IA rate. For data you touch a couple of times a year and need immediately when you do.
  • Glacier Flexible Retrieval: ~$0.0036/GB-month. No instant access — you request a restore and wait. Bulk retrieval (5–12 hours) is free; Standard (3–5 hours) is ~$0.01/GB; Expedited (1–5 minutes) is ~$0.03/GB plus a per-request fee.
  • Glacier Deep Archive: ~$0.00099/GB-month, the cheapest storage AWS sells. Restores take 12 hours (Standard) or up to 48 (Bulk). This is tape. Price it like tape.

The three rules that generate surprise line items

Minimum storage duration. IA classes bill a minimum of 30 days per object, Glacier Instant and Flexible 90 days, Deep Archive 180 days. If you delete — or transition via lifecycle — an object before its minimum, you are charged for the remaining days as if you'd kept it. Put a bucket of build artifacts into Standard-IA and prune them nightly, and every object still costs 30 days of storage. You bought a monthly plan and cancelled on day two; you still pay for the month.

The 128KB minimum billable object size. Standard-IA, One Zone-IA, and Glacier Instant Retrieval bill every object as if it were at least 128KB. A 10KB JSON blob in Standard-IA is billed as 128KB — roughly 13x its real size. Your "cheaper" per-GB rate is meaningless when most of the GB you're paying for is padding. This single rule is why moving a bucket of millions of small objects to IA can raise your bill.

Per-request charges. IA and Glacier have higher per-request costs than Standard, and lifecycle transitions are themselves billable requests — around $0.01 per 1,000 transitions to IA and more to Glacier. Transition ten million tiny objects and the migration request cost alone can dwarf a year of the storage you saved.

The Glacier "I need it NOW" trap

Someone archives logs to Glacier Flexible or Deep Archive, feels virtuous, and six months later an auditor or an incident needs 40TB back today. Expedited restores from Deep Archive don't exist; the fastest you get is ~12 hours. From Glacier Flexible, Expedited is ~$0.03/GB plus request fees — on 40TB that's over $1,200 in retrieval, before egress. The archival tiers are cheap precisely because AWS is betting you rarely read them and won't be in a hurry when you do. If either assumption is false for your data, you have chosen the most expensive way to store it.

Intelligent-Tiering: the internals

Intelligent-Tiering moves each object between access tiers based on when it was last touched — Frequent Access, then Infrequent (after 30 days idle), then Archive Instant Access (after 90 days idle) — with no retrieval fees and no minimum-duration penalty for those automatic tiers. In exchange you pay a monitoring and automation fee of ~$0.0025 per 1,000 objects per month.

The subtleties that decide whether it pays:

  • Objects smaller than 128KB are never monitored and never charged the fee — but they also never leave the Frequent Access tier, so they get no automatic savings. Intelligent-Tiering does nothing for a bucket of tiny objects except leave them alone.
  • The monitoring fee is per object, not per GB. Do the arithmetic: at $0.0025 per 1,000 objects, ten million objects cost $25/month in monitoring alone, regardless of their size. If those objects average a few KB, the fee can exceed what you'd pay to just leave everything in Standard.
  • It is a genuine no-brainer for large objects with unknown or shifting access patterns — media libraries, data-lake partitions, backups you might or might not read. The fee is rounding error against multi-GB objects, and you never eat a retrieval fee or a wrong-tier bet.

Rule of thumb: Intelligent-Tiering earns its keep when your average object is comfortably north of a megabyte and you genuinely can't predict access. For fleets of small objects, or data with a known cold date, an explicit lifecycle rule is cheaper and more predictable.

The break-even that actually matters: IA vs Standard

Here is the calculation people skip. In Standard-IA you pay ~$0.0125/GB-month plus ~$0.01 per GB retrieved. Standard is a flat ~$0.023/GB-month. Ignore requests for a moment and let R be the fraction of the data you retrieve per month:

Standard-IA monthly cost per GB = 0.0125 + 0.01 * R
Standard monthly cost per GB    = 0.023

Break-even:  0.0125 + 0.01 * R = 0.023
             0.01 * R = 0.0105
             R ≈ 1.05

So Standard-IA wins only if you retrieve less than about the full dataset once per month. Read your data roughly once a month or less and IA is cheaper; read it twice a month and you've overshot Standard's flat rate on retrieval fees while accepting worse availability. This is the whole game: IA is not "cheaper storage," it's a bet that the data is cold. The storage discount is ~$0.0105/GB-month, and each full retrieval costs ~$0.01/GB, so a single extra monthly read erases the entire month's savings.

Now fold back in the two rules that make the theoretical break-even worse in practice: if your objects are under 128KB, your effective storage rate isn't $0.0125 — it's $0.0125 scaled up by the padding, and the break-even moves against you hard. If your objects don't survive 30 days, the minimum-duration charge means you may never realize the discount at all.

How I decide, in order

  1. Is the object under ~128KB? Then IA and Glacier Instant are usually traps; keep it in Standard or aggregate small objects into larger ones first.
  2. Will it live at least 30/90/180 days? If not, its class's minimum duration eats the savings — leave it in Standard.
  3. Do I know the cold date? If yes, write an explicit lifecycle rule to IA then Glacier. If no, and objects are large, use Intelligent-Tiering.
  4. When I read it back, how fast do I need it and how often? "Rarely, and I can wait hours" is Deep Archive. "Rarely, but instantly" is Glacier Instant. "Monthly-ish, instantly" is Standard-IA. "All the time" was always Standard.

The classes aren't cheaper or more expensive in the abstract. They're priced for specific access patterns, and the penalties exist to punish putting data in the wrong one. Match the pattern and S3 is generous. Guess wrong and it bills you for the guess.