AWS S3
Default Storage Class
Cloud Storage
Amazon Web Services
Storage Management

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.

Practice system design

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:

bash
aws s3 cp report.csv s3://my-bucket/reports/report.csv \
  --storage-class STANDARD_IA

With boto3 in Python:

python
1import boto3
2
3s3 = boto3.client('s3')
4
5s3.upload_file(
6    'report.csv',
7    'my-bucket',
8    'reports/report.csv',
9    ExtraArgs={'StorageClass': 'STANDARD_IA'}
10)

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.

json
1{
2  "Rules": [
3    {
4      "ID": "move-logs-after-30-days",
5      "Status": "Enabled",
6      "Filter": {
7        "Prefix": "logs/"
8      },
9      "Transitions": [
10        {
11          "Days": 30,
12          "StorageClass": "STANDARD_IA"
13        }
14      ]
15    }
16  ]
17}

Apply it with the CLI:

bash
aws s3api put-bucket-lifecycle-configuration \
  --bucket my-bucket \
  --lifecycle-configuration file://lifecycle.json

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.

bash
aws s3 cp archive.json s3://my-bucket/archive/archive.json \
  --storage-class INTELLIGENT_TIERING

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:

  1. write to STANDARD
  2. observe access patterns
  3. 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 STANDARD unless the uploader specifies another class
  • To change the effective default, set StorageClass during upload in the CLI or SDK
  • Use lifecycle rules when you want objects to transition after creation
  • 'INTELLIGENT_TIERING is itself a storage class, not merely a lifecycle option'
  • Choose storage classes based on access patterns, retrieval costs, and latency requirements

Related reading
Course
Beginner
27 lessons
10 hours
System Design Fundamentals

Build a strong foundation in designing scalable, reliable distributed systems.

View the course
Track 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.

Practice system design

All Rights Reserved.