I'm trying to choose the most cost-effective S3 storage class for roughly 150 TB of data. Standard has higher storage costs but avoids most retrieval concerns, while Standard-IA and Glacier tiers reduce storage costs but can introduce retrieval charges and other constraints.
Object sizes are easy to measure, but our actual access patterns aren't obvious. I could enable access logging or CloudTrail data events and build an analysis pipeline, but that seems like a substantial rabbit hole. Intelligent-Tiering seems attractive, although I'm concerned that its automatic transitions might not always be cheaper than Standard, especially for objects accessed occasionally.
Should I use S3 Storage Class Analysis or Storage Lens, enable Intelligent-Tiering, create approximate lifecycle rules, or invest in analyzing access logs? How much precision is really worthwhile at this scale?
5 Answers
S3 Storage Class Analysis is probably the first thing to try. It can monitor a bucket or prefix and show which objects appear suitable for Standard-IA based on observed access patterns. Let it collect data for a while before making broad lifecycle changes. Storage Lens can also provide useful aggregate visibility, but you may not need full access-log and CloudTrail analysis just to make an initial tiering decision.
Be careful with small objects and archive tiers. Glacier-family classes can have minimum billable storage durations, minimum object-size assumptions, and metadata overhead. Moving many small objects may reduce the advertised per-GB storage price without reducing the actual bill as much as expected. Check object counts, average size, minimum-storage charges, retrieval volume, and any request or transfer costs before applying a blanket transition.
I’d avoid building a custom analytics system before confirming that the savings justify it. Start with Standard for clearly active data, Intelligent-Tiering for ambiguous data, and lifecycle transitions for prefixes you already know become cold after a certain period. Then compare the resulting bill and usage metrics. At this scale there may be meaningful savings, but a complicated logging pipeline can also consume a lot of engineering time for marginal improvement.
The simplest rule is to estimate the percentage of the collection retrieved per month and compare the storage discount with retrieval and request charges. If that percentage is unknown, measure it with Storage Class Analysis rather than turning on every possible logging feature. For predictable cold data, lifecycle rules can be cheaper; for unpredictable data, Intelligent-Tiering usually avoids the risk of guessing badly.
For about 150 TB, the number of objects and their average size may matter as much as the total capacity. Intelligent-Tiering has no retrieval or transition fees, but it does charge a small per-object monitoring fee. That makes it much more attractive for medium or large objects, while millions of tiny objects can make the monitoring charge and minimum-storage effects significant.
If access patterns are genuinely uncertain, Intelligent-Tiering is a reasonable default. Custom lifecycle rules generally win only when you understand the workload well enough to predict when data becomes cold.

That was my main concern: spending weeks looking for a theoretically optimal policy when a heuristic would get most of the savings. I’m leaning toward Intelligent-Tiering now and treating detailed access analysis as a later optimization.