Choosing an S3 Storage Class for Infrequently Accessed Data: Decision Guide
Compare S3 Standard‑IA, One Zone‑IA, and Glacier Instant Retrieval for data accessed less than once per month, then apply a lifecycle rule to automate tiering and validate the transition.
28 Sept 2026, 16:08 UTC

Decision and constraints
You need to store objects that are accessed less than once per month, require 99.9 % durability, sub‑second retrieval latency, and you want to automate tiering with lifecycle policies while keeping monthly storage cost low.
Supported options
| Storage class | Storage cost (USD/GB‑month) | GET request cost (USD/1000) | Typical retrieval latency | Minimum storage duration | Typical use‑case |
|---|---|---|---|---|---|
| S3 Standard‑IA | ≈ 0.0125 | ≈ 0.01 | milliseconds (first‑byte) | 30 days | Data needing multi‑AZ resilience |
| S3 One Zone‑IA | ≈ 0.01 | ≈ 0.01 | milliseconds | 30 days | Reproducible or backup‑eligible data |
| S3 Glacier Instant Retrieval | ≈ 0.004 | ≈ 0.025 | sub‑second (typically < 500 ms) | 90 days | Archive‑like access with fast retrieve |
Trade‑offs
- Standard‑IA provides redundancy across at least two Availability Zones, protecting against an AZ‑wide outage, but costs ~20 % more than One Zone‑IA.
- One Zone‑IA stores all copies in a single AZ, lowering cost; if that AZ suffers an outage the data is unavailable unless you have another copy elsewhere.
- Glacier Instant Retrieval offers the lowest storage price, but GET request fees are higher and a 90‑day minimum storage duration applies; frequent retrieval can erase the storage savings.
Implementation: lifecycle rule JSON
The following rule moves objects to STANDARD_IA after 30 days, then to GLACIER_IR after an additional 60 days (total 90 days). Adjust the prefixes or tags to match your data set.
{
"Rules": [
{
"ID": "Move-to-IA-then-GlacierIR",
"Status": "Enabled",
"Filter": { "Prefix": "infrequent/" },
"Transitions": [
{ "Days": 30, "StorageClass": "STANDARD_IA" },
{ "Days": 90, "StorageClass": "GLACIER_IR" }
],
"NoncurrentVersionTransitions": [],
"Expiration": { "Days": 3650 }
}
]
}
To apply the rule, run (requires s3:PutLifecycleConfiguration permission on the bucket):
aws s3api put-bucket-lifecycle-configuration \
--bucket <bucket-name> \
--lifecycle-configuration file://lifecycle.json
Validation steps
- Upload a test object with the prefix
infrequent/to the bucket. - Wait >30 days (or adjust the rule for testing with a shorter period).
- Run
aws s3api head-object --bucket <bucket-name> --key infrequent/test-objectand verify thatStorageClassequalsSTANDARD_IA. - After >90 days total, repeat the
head-objectcommand; the response should showStorageClass: GLACIER_IR. - Optionally, time a GET request:
time aws s3 cp s3://<bucket-name>/infrequent/test-object /dev/null. The elapsed time should be under 500 ms for GLACIER_IR. - Enable S3 Inventory for the bucket (requires
s3:PutInventoryConfiguration) and check the weekly CSV for rows where the storage class transitions as expected.
Limitations and checks
- One Zone‑IA does not survive an AZ‑wide failure; ensure the data can be regenerated or is mirrored elsewhere.
- Glacier Instant Retrieval charges higher per‑GET fees; estimate your request volume before selecting this class.
- Lifecycle transitions only take effect at midnight UTC after the day count is met; allow for this delay when validating.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.