S3 Storage Classes
Amazon S3 (Simple Storage Service, AWS object storage) stores every object in a storage class. The class controls three things: how much you pay per gigabyte (GB) each month, how fast you can read the data back, and how durably AWS keeps it. Picking the right class is the single biggest lever you have on your S3 bill, because the cheapest archive tier can cost less than a tenth of the price of the default tier. The trick is that “cheap to store” usually means “slow or expensive to read”, so you match the class to how often you actually touch the data.
How storage classes differ
Every S3 class stores data across multiple devices and is designed for 99.999999999% durability (eleven nines, meaning data loss is extraordinarily unlikely). What changes between classes is availability (the chance the data is reachable at any moment), retrieval time, per-GB storage price, and whether you pay retrieval fees and minimum storage durations.
A minimum storage duration means AWS bills you as if the object lived for a set number of days, even if you delete it sooner. A retrieval fee is a per-GB charge every time you read the data. These two rules are what make the “cheap” classes expensive for the wrong workload.
| Class | Best for | Availability | Retrieval time | Min. storage duration | Retrieval fee | Relative storage cost |
|---|---|---|---|---|---|---|
| S3 Standard | Frequently accessed, latency-sensitive data | 99.99% | Milliseconds | None | None | Baseline (highest) |
| S3 Intelligent-Tiering | Unknown or changing access patterns | 99.9% | Milliseconds | None | None (small monitoring fee) | Auto-optimized |
| S3 Standard-IA | Long-lived, rarely accessed, needs fast reads | 99.9% | Milliseconds | 30 days | Per-GB | ~45% lower than Standard |
| S3 One Zone-IA | Re-creatable, infrequent data in a single AZ | 99.5% | Milliseconds | 30 days | Per-GB | ~20% lower than Standard-IA |
| S3 Glacier Instant Retrieval | Archives needing instant access (medical images) | 99.9% | Milliseconds | 90 days | Per-GB | Much lower |
| S3 Glacier Flexible Retrieval | Archives where minutes-to-hours is fine | 99.99% (after restore) | Minutes to 12 hours | 90 days | Per-GB | Very low |
| S3 Glacier Deep Archive | Long-term cold archive, compliance | 99.99% (after restore) | 12 hours | 180 days | Per-GB | Lowest |
Cost gotcha: Standard-IA and One Zone-IA (“IA” = Infrequent Access) charge a per-GB retrieval fee and bill a 30-day minimum. If you read an object often, or delete it after a few days, you can pay more than you would in S3 Standard. IA is only cheaper for data that is large, lives a long time, and is read rarely.
Matching a class to your access pattern
The decision comes down to two questions: how often will you read the data, and how fast do you need it back?
When you access data often
Use S3 Standard. There are no retrieval fees and no minimum duration, so active website assets, application uploads, and data lake hot partitions belong here. Do not move active data to IA just because IA looks cheaper per GB — retrieval fees on frequent reads will erase the savings.
When you don’t know the pattern
Use S3 Intelligent-Tiering. AWS watches each object and automatically moves it between a frequent-access tier and infrequent-access tiers based on real usage. There are no retrieval fees and no minimum duration. You pay a tiny per-object monitoring fee (a fraction of a cent per 1,000 objects monthly). This is the safe default for user-generated content, logs, and analytics output where you genuinely cannot predict access.
Tip: Intelligent-Tiering is the best choice when access is unpredictable, because it cannot accidentally cost you a retrieval fee the way manually choosing IA can. The monitoring fee only matters for huge numbers of tiny objects.
When you rarely read it but need it fast
Use S3 Standard-IA for backups and older documents you must retrieve in milliseconds when you do need them. Use S3 One Zone-IA only if the data is easily re-created (such as a thumbnail you can regenerate), because it lives in a single Availability Zone (AZ, an isolated data center) and is lost if that AZ fails.
When it’s a cold archive
Use the Glacier tiers for compliance archives, old logs, and media you may never read again. Choose Instant Retrieval if you occasionally need it back in milliseconds, Flexible Retrieval if minutes-to-hours is acceptable, and Deep Archive for the cheapest possible long-term storage where a 12-hour wait is fine.
Setting the storage class
From the AWS Management Console
- Open the S3 console and click your bucket name.
- Click Upload, add a file, then expand Properties.
- Under Storage class, choose a class (for example Intelligent-Tiering) and click Upload.
- To change an existing object, select it, choose Actions -> Edit storage class, pick the new class, and save.
With the AWS CLI
Upload an object directly into a class:
aws s3 cp ./report-2026.csv s3://devcraftly-data/reports/report-2026.csv \
--storage-class INTELLIGENT_TIERING
Output:
upload: ./report-2026.csv to s3://devcraftly-data/reports/report-2026.csv
Check the class of an existing object:
aws s3api head-object \
--bucket devcraftly-data \
--key reports/report-2026.csv
Output:
{
"LastModified": "2026-06-15T10:42:11+00:00",
"ContentLength": 184320,
"ETag": "\"9b2cf5e1a4d3c8f0e7b1a2c3d4e5f6a7\"",
"StorageClass": "INTELLIGENT_TIERING",
"ContentType": "text/csv"
}
Note: S3 Standard objects show no
StorageClassfield in the output — that absence simply means Standard.
Automating transitions with lifecycle rules
You rarely set classes by hand at scale. Instead, a lifecycle rule moves objects automatically as they age. This Terraform (infrastructure-as-code tool) snippet keeps data hot for 30 days, moves it to Standard-IA, then to Glacier Deep Archive:
resource "aws_s3_bucket_lifecycle_configuration" "archive" {
bucket = aws_s3_bucket.data.id
rule {
id = "tier-down-old-objects"
status = "Enabled"
transition {
days = 30
storage_class = "STANDARD_IA"
}
transition {
days = 180
storage_class = "DEEP_ARCHIVE"
}
}
}
Best practices
- Leave actively read data in S3 Standard — IA retrieval fees usually cost more than the storage you save.
- Use Intelligent-Tiering whenever access patterns are unknown; it removes the risk of guessing wrong.
- Pick One Zone-IA only for data you can re-create, since a single-AZ failure deletes it permanently.
- Respect the minimum storage durations (30 days for IA, 90 for most Glacier, 180 for Deep Archive) before deleting or transitioning, or you still pay for the full period.
- Automate class changes with lifecycle policies instead of manual edits so cost savings happen as data ages.
- Tag objects or use prefixes so lifecycle rules target the right data and never archive something you read daily.
- Estimate retrieval costs before bulk-restoring from Glacier — reading terabytes back can produce a surprising one-time bill.