S3 buckets are account-wide rather than regional, so Parsivex evaluates each bucket once per scan no matter how many regions you scan.
What triggers this finding
An S3 bucket storing at least 10 GB of data with no lifecycle rules configured to transition objects to cheaper storage tiers.
Typical fix
Add lifecycle rules to transition infrequently accessed objects to S3 Intelligent-Tiering or Glacier after 90 days. Paid plans include lifecycle configuration scripts with a replacement warning.
Example savings
Often 30–50% of standard storage cost for cold data — e.g. $5–$50+/month on buckets with tens or hundreds of GB.
See also: Severity and savings estimates for how Parsivex calculates figures on your report.
How S3 storage classes are priced
S3 bills storage per GB-month, prorated by the hour, plus per-request charges on top — roughly $0.005 per 1,000 PUTs and $0.0004 per 1,000 GETs. Standard costs $0.023 per GB-month in us-east-1 and asks nothing else of you: no minimum storage duration, no minimum billable object size, no retrieval fee. Every cheaper class buys its discount by taking one of those guarantees away.
Standard-IA and One Zone-IA bill a 30-day minimum duration, a per-GB retrieval fee, and a 128 KB minimum billable object size. Glacier Instant Retrieval carries a 90-day minimum, Glacier Flexible Retrieval 90 days with a restore step, and Deep Archive 180 days. Intelligent-Tiering takes a different trade: no retrieval fee and automatic movement between tiers, paid for with a monitoring and automation charge of $0.0025 per 1,000 objects per month.
Parsivex's estimate compares the bucket's size at $0.023 per GB-month against $0.0125 per GB-month. That second figure is an infrequent-access rate, so the saving shown assumes the whole bucket eventually goes cold. Treat it as the ceiling on what tiering can return, not the expected outcome — the real number depends on what share of your objects are genuinely dormant.
The finding requires a bucket of at least 10 GB with zero lifecycle rules. Note the shape of that second condition: any rule suppresses the finding, even one that only aborts incomplete uploads and does nothing about storage class. A large bucket with one unrelated rule will never appear here.
Sizing a bucket without listing it
Never run ListObjectsV2 to size a bucket. Listing is billed per request, and on a bucket with tens of millions of objects the audit costs more than the waste. CloudWatch publishes daily storage metrics for free:
aws cloudwatch get-metric-statistics --namespace AWS/S3 \
--metric-name BucketSizeBytes \
--dimensions Name=BucketName,Value=analytics-archive Name=StorageType,Value=StandardStorage \
--start-time 2026-08-08T00:00:00Z --end-time 2026-08-11T00:00:00Z \
--period 86400 --statistics Average
Run it again with --metric-name NumberOfObjects and Name=StorageType,Value=AllStorageTypes. These metrics are computed once a day, so expect a figure up to 48 hours stale.
Then do the division that decides the outcome: bytes ÷ objects. Average object size is the single number that determines whether tiering pays, and it is the one no dashboard puts in front of you. S3 Storage Lens reports both per bucket in its free tier if you would rather read it than compute it.
Confirming the rules is one call, and the error is the answer:
aws s3api get-bucket-lifecycle-configuration --bucket analytics-archive
NoSuchLifecycleConfiguration means no rules exist.
Buckets where tiering costs more than it saves
The monitoring fee is charged per object, while the storage saving accrues per gigabyte. When a bucket holds many small objects those two work against each other, and average object size — not total size — decides the outcome. There are three bands, and only one of them matches what this finding assumes.
Above roughly 240 KB average, tiering pays. The saving is $0.0105 per GB-month, and at that object size the monitoring fee is small against it.
Between 128 KB and roughly 240 KB, the fee outweighs the saving. These objects are monitored and eligible to transition, so you pay $0.0025 per 1,000 objects every month to chase a smaller saving. A 200 GB bucket of 200 KB objects — a million of them — is charged $2.50 a month in monitoring against a modelled storage saving of $2.10. Enabling Intelligent-Tiering there makes the bill worse.
Below 128 KB, nothing happens at all. Objects under 128 KB are never moved to a cold tier and are not charged the monitoring fee either. A bucket of millions of small log fragments will not cost you anything extra — but the saving on this finding will simply never materialise, because the data it is priced against never leaves the frequent-access rate.
Divide bytes by object count before acting. That one number separates a real saving from a rounding error or a net loss.
Three other cases where the finding is technically right and the action is wrong:
- Hot buckets. Data served constantly belongs in Standard. Transitioning it to an IA class adds retrieval fees on every read and can raise the bill outright.
- Short-lived data. Objects deleted within 30 days of creation still incur the full minimum-duration charge if they were transitioned to Standard-IA, so tiering a rolling workspace bucket costs money.
- Buckets managed elsewhere. If replication, Object Lock, or a data platform owns the object lifecycle, adding an S3 rule underneath it invites conflicts.
Cost and risk of a lifecycle change
Adding a lifecycle rule changes metadata, never object content, and objects remain readable at the same keys throughout. Rules are evaluated once a day, so nothing happens the moment you save — expect a day or two before transitions appear, and longer before the bill reflects them.
The real hazard is the API's shape: PutBucketLifecycleConfiguration replaces the bucket's entire rule set rather than appending to it. Send only your new rule and you have silently deleted every existing one, including any abort rule protecting you from incomplete multipart uploads. Read the current configuration, merge, then write. Parsivex's remediation scripts carry this warning inline for the same reason.
Transitions themselves are billed as requests — a per-1,000-object charge each time an object moves class — so moving millions of small objects has a genuine one-off cost that can take months of storage savings to repay. Reversal costs another transition charge, plus any minimum-duration charge still outstanding on objects that have not yet served their 30, 90, or 180 days in the colder class. Roll out on one bucket, watch a full billing cycle in Cost Explorer, and only then apply the pattern more widely.