<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cost · XB Field Notes</title><link>https://www.xbcatm.com/tags/cost/</link><description>Illustrated field notes on HTTP, DNS, TLS, Caddy, SSH, releases, and recovery.</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://www.xbcatm.com/tags/cost/index.xml" rel="self" type="application/rss+xml"/><item><title>S3 storage classes trade cost for access</title><link>https://www.xbcatm.com/posts/s3-storage-classes-trade-cost-for-access/</link><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><guid>https://www.xbcatm.com/posts/s3-storage-classes-trade-cost-for-access/</guid><description>Different data cools at different rates. Storage classes let a tier that rarely changes pay less per byte while hot data stays fast to read.</description><content:encoded>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="what-the-real-prices-say"&gt;What the real prices say&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &amp;ldquo;archive classes have retrieval fees&amp;rdquo; 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.&lt;/p&gt;
&lt;h2 id="minimum-durations-and-minimum-billable-sizes"&gt;Minimum durations and minimum billable sizes&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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&amp;rsquo;s whole annual cost. Since September 2024 the default lifecycle behaviour refuses to transition objects under 128 KB at all, for precisely that reason.&lt;/p&gt;
&lt;h2 id="break-even-not-vibes"&gt;Break-even, not vibes&lt;/h2&gt;
&lt;p&gt;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 — &amp;ldquo;once a month&amp;rdquo;, &amp;ldquo;once a quarter&amp;rdquo; — describe. The break-even is computable, so compute it instead of assuming it.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="when-it-breaks"&gt;When it breaks&lt;/h2&gt;
&lt;p&gt;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&amp;rsquo;s transition age is shorter than the interval between reads.&lt;/p&gt;
&lt;p&gt;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&amp;rsquo;s storage saving — the object paid to become slower.&lt;/p&gt;
&lt;h2 id="check-it-quickly"&gt;Check it quickly&lt;/h2&gt;
&lt;p&gt;See where the bytes actually are and what will happen to them:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;aws s3api list-objects-v2 --bucket B --query &amp;#39;Contents[].StorageClass&amp;#39; --output text | tr &amp;#39;\t&amp;#39; &amp;#39;\n&amp;#39; | sort | uniq -c
aws s3api get-bucket-lifecycle-configuration --bucket B --query &amp;#39;Rules[].[ID,Status,Transitions[0].Days,Transitions[0].StorageClass]&amp;#39; --output table
aws s3api head-object --bucket B --key K --query &amp;#39;StorageClass&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first is the distribution across classes — a large &lt;code&gt;GLACIER&lt;/code&gt; 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&amp;rsquo;s actual class, which is how you catch a lifecycle rule that silently skipped objects under 128 KB.&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/s3/storage-classes/"&gt;AWS S3 storage classes&lt;/a&gt;, what each class is designed for, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html"&gt;AWS S3 storage class guide&lt;/a&gt;, minimum storage durations and minimum billable object sizes, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html"&gt;AWS S3 lifecycle transition rules&lt;/a&gt;, transition constraints and the 128 KB default, checked 2026-09-16.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/s3/pricing/"&gt;AWS S3 pricing&lt;/a&gt;, per-GB storage, retrieval and request charges, checked 2026-09-16.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>