How to change Default Storage Class on AWS S3
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Introduction
Amazon S3 does not have a simple bucket-level switch called "default storage class" that changes how every upload behaves automatically. For ordinary uploads, if you do nothing, S3 stores new objects in STANDARD. To make new objects land in another class, you usually specify the storage class during upload, or you use lifecycle rules to transition objects after they are created.
Understand the Three Different Mechanisms
People often mix up three different S3 behaviors:
- upload-time storage class selection
- lifecycle transitions after upload
- Intelligent-Tiering as a chosen storage class
These solve different problems.
If you want all new objects uploaded by one application to start in STANDARD_IA, then the application or CLI command should set StorageClass on upload.
If you want objects to begin in STANDARD and move later, then use lifecycle rules.
If you want AWS to move objects among access tiers automatically within one storage class family, upload them as INTELLIGENT_TIERING.
Set the Storage Class When Uploading
The most direct way to change the effective default for your workflow is to specify the class at write time.
With the AWS CLI:
With boto3 in Python:
This is usually the real answer when someone says they want to "change the default". The bucket is not changing its personality; the uploader is choosing the storage class for each object.
Use Lifecycle Rules for Existing or Aging Objects
If your goal is cost optimization over time, lifecycle policies are often better than forcing every object into a colder class immediately.
For example, you might keep objects in STANDARD for 30 days, then move them to STANDARD_IA.
Apply it with the CLI:
This does not alter how objects are initially written. It changes how they age.
Intelligent-Tiering Is a Storage Class, Not a Lifecycle Rule
Another common source of confusion is INTELLIGENT_TIERING. It is not a lifecycle policy by itself. It is a storage class you select for the object.
If you upload directly into INTELLIGENT_TIERING, S3 manages movement between internal access tiers for you. That can be a strong option when access patterns are unpredictable.
This is often simpler than manually guessing when access frequency will drop.
There Is No Universal Bucket Default Toggle
The most important architectural point is this: S3 buckets do not expose a global setting like "all future uploads must use class X" for every client automatically.
Different upload paths can still choose different classes:
- application code via SDK
- AWS CLI commands
- replication rules
- third-party tools
- browser uploads through presigned URLs
So if you need consistent behavior, enforce it in the write path you control, or use policies and application logic to reject or rewrite objects that do not meet your standard.
When the Storage Class Choice Should Be Delayed
Do not rush cold data classes into paths that still need low-latency reads. STANDARD_IA, ONEZONE_IA, Glacier classes, and related options have different durability, availability, and retrieval cost tradeoffs.
A safer pattern is often:
- write to
STANDARD - observe access patterns
- transition with lifecycle rules
That is especially true when the upload path is shared by multiple applications with different access expectations.
Common Pitfalls
A common mistake is assuming lifecycle rules change the storage class at upload time. They do not; they transition objects later.
Another mistake is talking about a bucket-wide default that S3 itself enforces universally. In practice, the effective default usually lives in the uploader.
People also choose infrequent-access classes too early and then get surprised by retrieval charges or latency tradeoffs.
Finally, be precise with class names. STANDARD, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, and Glacier classes all behave differently.
Summary
- S3 does not have a simple universal bucket-level "default storage class" switch for all uploads
- New objects go to
STANDARDunless the uploader specifies another class - To change the effective default, set
StorageClassduring upload in the CLI or SDK - Use lifecycle rules when you want objects to transition after creation
- '
INTELLIGENT_TIERINGis itself a storage class, not merely a lifecycle option' - Choose storage classes based on access patterns, retrieval costs, and latency requirements
Related reading
- How to change instance type in AWS ECS cluster?
- How to change Node Version in Provision Step in Amplify Console
- How to change password of AWS Cognito User?
- How to change the AWS account using the Elastic Beanstalk CLI
- How to check if a specified key exists in a given S3 bucket using Java
- How to check if AWS CLI SSO is logged in
- How to check if pod security policy is enabled?
- How to check if Python app is running within AWS lambda function?

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.