Choosing a storage class is a bet on when you will read the bytes again. S3 Standard costs $0.023 per GB-month in us-east-1; Glacier Deep Archive costs $0.00099. That is a 23-fold difference for identical durability, and the whole decision is which number your access pattern deserves.

The headline rate is the least informative number in the table. Retrieval charges, minimum storage durations, per-object metadata overhead and transition requests scale with object count rather than total bytes, so the cheap-looking class can be the expensive one for your workload.

What the real prices say

The published us-east-1 rates: Standard $0.023, Standard-IA $0.0125, One Zone-IA $0.010, Glacier Instant Retrieval $0.004, Glacier Flexible Retrieval $0.0036 and Deep Archive $0.00099 per GB-month. Retrieval is where the classes diverge more sharply: Standard-IA and One Zone-IA charge $0.010 per GB read, and Glacier Instant Retrieval charges $0.030.

The non-obvious part: in us-east-1 the current price list charges nothing per GB for standard-tier retrieval from Glacier Flexible Retrieval and Deep Archive. You pay per restore request instead — $0.00005 — and you wait hours. So “archive classes have retrieval fees” is only reliably true for the instant-retrieval classes. Assume otherwise and the arithmetic inverts: if Deep Archive charged the often-quoted $0.02 per GB, reading a 1 GB object 52 times a year would cost $1.05 instead of $0.015 — a 70-fold swing from one regional detail.

Minimum durations and minimum billable sizes

Minimum storage duration is 30 days for Standard-IA and One Zone-IA, 90 for Glacier Instant Retrieval, 90 for Glacier Flexible Retrieval, 180 for Deep Archive. Delete or transition out earlier and you are billed for the remainder — a 1 GB object deleted after 10 days from a 180-day class still costs $0.00586.

Minimum billable object size is the other trap. Standard-IA, One Zone-IA and Glacier Instant Retrieval bill a floor of 128 KB, so a 10 KB object stored in Glacier Instant Retrieval is charged as 128 KB — a 12.8-fold inflation. Glacier Flexible Retrieval and Deep Archive have no floor but add 40 KB of metadata per archived object, 32 KB at the class rate, 8 KB at the Standard rate. And the transition itself costs a request per object: $0.00001 into Standard-IA, $0.00002 into Glacier Instant Retrieval, $0.00003 into Glacier Flexible Retrieval, $0.00005 into Deep Archive. For a 10 KB object in Glacier Instant Retrieval that single request is 65% of the object’s whole annual cost. Since September 2024 the default lifecycle behaviour refuses to transition objects under 128 KB at all, for precisely that reason.

Break-even, not vibes

For a 1 GB object held a year, Standard-IA stops being cheaper than Standard after 13 reads, and Glacier Instant Retrieval after 8. Both land near one read a month, which is what the documented design points — “once a month”, “once a quarter” — describe. The break-even is computable, so compute it instead of assuming it.

The weekly reader is where this goes wrong. A 1 GB object read 52 times a year and transitioned to Glacier Instant Retrieval costs $1.61 against $0.276 on Standard, 5.8 times more, with $1.56 of retrieval fees accounting for the entire difference. A 30-day transition rule is right for a log archive and wrong for a weekly report, and the rule cannot tell them apart unless you scope it by prefix or tag.

When it breaks

The first failure is a lifecycle rule cooling objects that are read every week. It presents as a storage line that went down and a total bill that went up, with the difference sitting in retrieval charges elsewhere on the invoice. Pull per-class retrieval spend rather than looking at the storage line, and check whether any rule’s transition age is shorter than the interval between reads.

The second failure is objects stranded in an archive class with no tested restore path. Glacier Flexible Retrieval restores take minutes on the expedited tier and 5 to 12 hours in bulk; Deep Archive takes 12 to 48. A restore also produces a temporary copy with its own expiry, so a restore that worked last quarter may not work today. Worse, a 100 KB object in Standard-IA is already more expensive than Standard at zero reads, because the transition request exceeds the entire year’s storage saving — the object paid to become slower.

Check it quickly

See where the bytes actually are and what will happen to them:

aws s3api list-objects-v2 --bucket B --query 'Contents[].StorageClass' --output text | tr '\t' '\n' | sort | uniq -c
aws s3api get-bucket-lifecycle-configuration --bucket B --query 'Rules[].[ID,Status,Transitions[0].Days,Transitions[0].StorageClass]' --output table
aws s3api head-object --bucket B --key K --query 'StorageClass'

The first is the distribution across classes — a large GLACIER count on a bucket whose consumers read weekly is the whole problem. The second shows the transition ages; any age shorter than your read interval is a rule that will bill you for retrieval. The third confirms one object’s actual class, which is how you catch a lifecycle rule that silently skipped objects under 128 KB.

Sources