S3 buckets whose bytes sit mostly in Glacier instead of Deep Archive
What does ZopNight detect here?
Glacier Flexible Retrieval stores at roughly $0.0036 per GB-month; Deep Archive at $0.00099, about a 72% cut for data touched less than once a year. ZopNight computes the real per-bucket rate delta on Glacier-dominant buckets, and abstains outright (today on every bucket) rather than estimate with a flat fraction.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-1512 |
| Category | rightsizing |
| Severity | low |
| Metric | none — pure configuration read |
| Source | s3_deep_archive.go |
Where it applies
Two archive tiers, a 3.6x price gap
Glacier Flexible Retrieval and Glacier Deep Archive solve the same problem (data you must keep but almost never read) at very different rates: roughly $0.0036 versus $0.00099 per GB-month. For a bucket holding 100 TB of compliance archives that gap is worth about $267 a month, in exchange for slower retrieval: Deep Archive restores take 12 to 48 hours. Write-once-read-almost-never data rarely justifies the faster tier.
Which buckets are candidates
Discovery records, per bucket, how its bytes distribute across storage classes (the same StorageType breakdown behind BucketSizeBytes) and stamps the dominant class, the largest by bytes. A bucket becomes a candidate only when that dominant class is Glacier and a monthly cost figure exists for it. The saving, when emitted, is the genuine rate delta applied to the measured Glacier-tier capacity: the Glacier rate minus the Deep Archive rate, times the Glacier gigabytes, times 730 hours. That figure is clamped so it never exceeds the bucket’s actual billed cost, which discounts may have pushed below rack rate.
Why you will not see this finding today
Concrete-or-abstain is this rule’s contract, and today the pricing input it depends on, the per-bucket Glacier-to-Deep-Archive delta, is not yet produced by the pipeline. The rule therefore abstains on every bucket in the current release. An earlier version instead reported 30% of the bucket’s total bill as the saving: a fabricated figure with no rate basis, and exactly the behaviour the abstention replaced. A rule that says nothing until its number is real is the design, not a gap in it.
Measure your own Glacier footprint
aws cloudwatch get-metric-statistics \ --namespace AWS/S3 --metric-name BucketSizeBytes \ --dimensions Name=BucketName,Value=my-bucket Name=StorageType,Value=GlacierStorage \ --start-time "$(date -u -v-2d +%Y-%m-%dT%H:%M:%SZ)" \ --end-time "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ --period 86400 --statistics AverageMultiply the bytes by the per-GB rate delta to preview what a lifecycle transition would save.
Before you transition anything
Deep Archive fits objects accessed less than once a year, and that access-pattern judgement is yours to make at remediation, since the rule does not measure retrieval frequency. Mind the 180-day minimum storage duration: short-lived archives can cost more after the move, not less. The transition itself is a lifecycle rule, reversible only by paying to restore and re-tier the objects.