A 94% struggle rate is a remarkable statistic. According to a September 2025 Crayon study, that is the share of IT leaders who report ongoing difficulty optimising cloud storage costs despite years of cloud adoption. Object storage lifecycle policies are one of the most direct levers available, yet most teams either ignore them entirely or configure them once and forget that the rules exist. Getting them right is part engineering discipline, part cost accounting, and, when personal data is involved, part legal obligation.
This post covers how S3-compatible lifecycle rules actually work, the cost traps that catch teams off guard, the GDPR storage-limitation angle that makes expiry automation legally necessary, and why the jurisdiction of your object storage provider is not a secondary concern.
How object storage lifecycle policies work
Every S3-compatible lifecycle configuration is built from two rule types: transition actions and expiration actions. Transitions move objects between storage classes after a specified number of days; expirations permanently delete them. Transitions always flow from warmer to colder tiers. A lifecycle rule cannot warm data back up; that requires a restore or a copy operation initiated by your application or a person.
The AWS S3 reference implementation, which most S3-compatible platforms follow, enforces minimum age constraints worth knowing before you write any rule. Objects must sit in their current class for at least 30 days before transitioning to Standard-IA or One Zone-IA. Glacier Flexible Retrieval carries a 90-day minimum duration once landed; Glacier Deep Archive carries 180 days. Billing continues for the full minimum period regardless of when you delete or transition the object out.
Since September 2024, AWS S3 also prevents objects smaller than 128 KB from being transitioned to any storage class at all. Before that change, small objects could transition to Glacier tiers by default, which created a trap: transition request charges on millions of tiny files frequently exceeded the storage savings in the first month. The rule change closed that trap for new configurations, but buckets configured before September 2024 retain the old behaviour unless modified. If your lifecycle rules predate that change, audit them.
Expiration rules are simpler but require care when versioning is enabled. When versioning is on, deleting a current version creates a delete marker rather than removing the data. Lifecycle policies can manage both current and noncurrent versions independently, so you need explicit rules for each if you want full hygiene. One rule that almost every bucket should have regardless of everything else: abort incomplete multipart uploads after 7 days. Incomplete uploads accumulate silently and are billed as stored bytes.
Common tiering patterns and when to use them
A tiered archive pattern that works well for operational data with a known access window: Standard for the first 30 days, Standard-IA from day 30, Glacier Instant Retrieval from day 90, Deep Archive from day 365, deletion after 7 years. For backup rotation, daily backups stay in Standard for one week, transition to IA for one month, then move to Deep Archive for one year before expiry.
For versioned buckets, a sensible baseline is to transition noncurrent versions to Glacier Flexible Retrieval after 30 days and expire them after 365. This keeps your version history available for recovery without paying Standard rates indefinitely for objects your application has already superseded.
Lifecycle rules are the right tool when access patterns are predictable. When they are not, a rule that confidently moves objects to a slow retrieval tier will generate surprise costs and slower-than-expected restores at exactly the moment you need speed.
For media libraries, audit logs with irregular query patterns, or any dataset where objects might be re-requested months after creation without warning, Intelligent-Tiering is a better fit. It charges a small per-object monitoring fee but moves data between access tiers automatically based on observed behaviour, with no retrieval charges when objects move between tiers. Many teams use both approaches: lifecycle rules for data with a known retention schedule, Intelligent-Tiering for long-lived assets with unpredictable access.
The cost mechanics that bite you
Storage rates on AWS S3 vary roughly 23 times between the cheapest and most expensive classes. That range makes tiering look like a straightforward win, but the full cost picture includes per-request charges on PUT, COPY, and lifecycle transition operations, plus retrieval fees that can exceed storage costs for data you access infrequently from cold tiers. A lifecycle rule that transitions 10 million small objects to Glacier on day 30 may generate more in transition charges in month one than it saves in storage for the rest of the year.
The calculation you need before writing a transition rule: multiply the number of objects by the per-request transition cost, compare it to the monthly storage cost difference between the source and destination class, and divide to find the break-even month. If break-even is beyond your expected retention period, the transition does not save money. This arithmetic is straightforward but frequently skipped.
Data expiry automation as a legal requirement
GDPR Article 5(1)(e) requires that personal data be kept in a form that permits identification of data subjects for no longer than is necessary for the purposes for which the data was processed. This is the storage limitation principle, and it is not a best-practice recommendation. It is a legal obligation with a fine ceiling of €20 million or 4% of global annual turnover under Article 83(5).
The leading enforcement precedent is instructive. In 2019, the Berlin DPA fined Deutsche Wohnen €14.5 million for operating a tenant data archive that retained data without any mechanism to delete it. The violation was not that data had been collected improperly; it was that the system had no deletion capability at all. Automated lifecycle expiration policies are a direct technical response to exactly that failure mode: they enforce retention schedules consistently, without depending on someone remembering to run a deletion job.
A dataset that was minimal at collection still breaches Article 5 if it is never deleted. Lifecycle expiry automation is the operationalisation of storage limitation, and it belongs in your bucket configuration alongside your access controls and encryption settings.
Why jurisdiction is part of the architecture
Object storage lifecycle rules control what happens to data over time. Jurisdiction controls what law governs that data at every point in its lifecycle, including during processing by the storage provider’s own systems. The Court of Justice of the European Union’s Schrems II decision in 2020 struck down the EU-US Privacy Shield framework and made clear that US surveillance law creates a structural incompatibility with GDPR for data held by US-headquartered providers, regardless of where the servers sit.
We operate our object storage across four European datacenters, each Tier III, carrier-neutral, and ISO 27001 certified, under a contractual 99.9% uptime SLA. The sovereignty guarantee here is not a marketing line: it is a contract-level commitment, governed by European law, with no parent entity subject to US CLOUD Act or FISA 702 demands. When you configure a lifecycle rule on our platform, the data it governs, the transitions it triggers, and the deletions it executes all occur within that legal perimeter. That is a materially different position from a hyperscaler with a European region but a US parent company.
Lifecycle policy design is ultimately a combination of three things: engineering discipline in how you model access patterns, cost accounting in how you evaluate transition economics, and legal compliance in how you enforce retention limits. All three are tractable problems. The jurisdiction of your storage provider determines whether solving them is enough, or whether there is a fourth variable you cannot configure away.




