DEV Community

Cover image for S3-Compatible Storage Explained: The De Facto Standard for Object Storage in 2026
Ethan Carter
Ethan Carter

Posted on

S3-Compatible Storage Explained: The De Facto Standard for Object Storage in 2026

"S3-compatible" is one of those phrases that gets thrown around so much that people nod along without checking whether everyone means the same thing. Here's what it actually means, why it became the de facto standard, and what changes when you pick one implementation over another.

What "S3-Compatible" Actually Means

S3 compatibility means implementing Amazon's S3 REST API as a protocol — not as an AWS service you pay for. Specifically, it means supporting:

The shared data model:

  • Bucket — A flat namespace container (user-uploads, backups)
  • Object — Key-value pair inside a bucket (backups/2026-07-24.db.gz)
  • Key — Unique identifier for each object
  • Access Key / Secret Key — Credential pair for auth

The core operations (what "compatible" guarantees):

PUT    /bucket/key          → Upload
GET    /bucket/key          → Download
DELETE /bucket/key          → Remove
HEAD   /bucket/key          → Check existence + metadata
LIST   /bucket?prefix=      → Enumerate objects
PUT    /bucket              → Create bucket
DELETE /bucket              → Remove empty bucket
Enter fullscreen mode Exit fullscreen mode

If a system implements these seven operations with Signature V4 auth, the AWS CLI, boto3, rclone, and most S3 SDKs work out of the box.

What It Does NOT Guarantee

Feature AWS S3 Typical Compatible System
Infinite scalability Yes Limited by your hardware
11 nines durability Claimed Varies by erasure coding config
200+ API endpoints Full spec Core 20–50 endpoints
Glacier tiering Native Rarely implemented
Event notifications (→ Lambda) Yes Almost never

S3 compatibility is a spectrum, not a binary. Core CRUD is reliable. Everything else needs per-implementation verification.

Why S3 Won (And Not Swift, Or NFS)

Four reasons:

  1. First-mover advantage. AWS launched S3 in 2006 — years before OpenStack Swift (2012) or Ceph's mature S3 frontend. Thousands of apps hardcoded boto3.client('s3') before competitors existed.

  2. SDK ecosystem moat. Every language has an official AWS SDK. Using them against a compatible endpoint requires changing exactly two lines: endpoint_url and region.

  3. Lock-in prevention became the selling point. Ironically, Amazon's proprietary protocol became the anti-lock-in standard because it meant you could move between providers without touching application code.

  4. The MinIO effect. From 2014–2025, MinIO proved high-fidelity S3 could run on commodity hardware. Even after their community-model shifts in late 2025, the installed base of S3-aware applications is so large that any new object storage project not speaking S3 is a non-starter.

(Parallel with HTTP: Berners-Lee didn't design it to be universal transport — network effects made it one.)

Who Offers S3-Compatible Storage in 2026

Cloud-Native (Pay Per Operation)

Provider Price/GB/mo Egress Best For
Amazon S3 $0.023 $0.09/GB Already in AWS
Wasabi $0.0069 $0 S3 drop-in replacement
Backblaze B2 $0.006 $0.01/GB Cheapest cloud DR target

Self-Hosted Open Source

Project License Lang Min Nodes Standout Weakness
RustFS Apache 2.0 Rust 1 Write throughput 2+× MinIO; 95MB idle memory Younger ecosystem
MinIO AGPLv3 Go 1 Largest user base; richest feature parity Community edition in maintenance mode
Ceph (RGW) LGPLv2.1 C++ 3 Unified storage; exabyte-proven Operational complexity
SeaweedFS Apache 2.0 Go 1 Lightweight; edge-friendly ~60% S3 API coverage
Garage AGPLv3 Rust 3 Geo-distributed-first Small community

How to Choose: 5 Questions

Don't start from products. Start from constraints:

1. Are you staying in AWS? Yes → stick with S3 unless egress costs are killing you. No → self-hosted becomes compelling immediately.

2. What's your scale?

  • < 10 TB → RustFS or SeaweedFS (single node)
  • 10–500 TB → RustFS or MinIO (distributed)
  • 500 TB – 50 PB → Ceph RGW (enterprise scale)

3. License tolerance? Embedding in closed-source product → avoid AGPLv3. Zero licensing anxiety → Apache 2.0 only (RustFS, SeaweedFS).

4. Workload pattern? Sequential large writes → RustFS. Mixed random I/O → MinIO or Ceph. Edge/IoT → SeaweedFS.

5. Who operates it? Solo dev → lightweight option. Dedicated SRE team → Ceph. Want managed → Wasabi/B2.

Try It Yourself (RustFS Example)

# Single-node Docker deploy (official command — sourced from https://github.com/rustfs/rustfs README, NOT EXECUTED IN CI)
docker run -d -p 9000:9000 -p 9001:9001 -v $(pwd)/data:/data -v $(pwd)/logs:/logs rustfs/rustfs:latest

# AWS CLI — only endpoint URL changes
aws --endpoint-url http://localhost:9000 s3 mb s3://my-bucket
aws --endpoint-url http://localhost:9000 s3 cp README.md s3://my-bucket/
aws --endpoint-url http://localhost:9000 s3 ls s3://my-bucket/
Enter fullscreen mode Exit fullscreen mode

Python code (identical to AWS S3 usage):

import boto3

s3 = boto3.client(
    's3',
    endpoint_url='http://localhost:9000',  # ← Only this line differs
    aws_access_key_id='rustfsadmin',
    aws_secret_access_key='rustfsadmin',
)

s3.create_bucket(Bucket='ml-datasets')
s3.put_object(Bucket='ml-datasets', Key='model.pt', Body=open('model.pt', 'rb'))
Enter fullscreen mode Exit fullscreen mode

Your code doesn't know or care whether it's talking to us-east-1 or localhost:9000. That's the whole point.

Where It Breaks Down (Production Gotchas)

  1. Response headers differ. Apps parsing x-amz-request-id will break on non-AWS systems.
  2. Error codes aren't identical. Catch on HTTP status code, not error string.
  3. Multipart upload behavior varies. Part size limits, abort-cleanup timing are implementation-defined.
  4. Event notifications are mostly absent. No self-hosted system fires S3 events to serverless functions natively.
  5. Performance isn't portable. P99 GET on local RustFS (~20ms LAN) vs AWS S3 (~100ms same region) vs geo-Ceph (~300ms).

None are deal-breakers for most teams — but know them before you go to production.

Feature Matrix Quick Reference

Feature RustFS MinIO Ceph RGW SeaweedFS Wasabi
Core CRUD
Versioning
SSE (SSE-S3/SSE-C)
Object Lock
Lifecycle policies
Event notifications
Single-node N/A
License Apache 2.0 AGPLv3 LGPLv2.1 Apache 2.0 Proprietary

Accurate as of July 2026. Check official docs for latest status.

Bottom Line

S3 compatibility in 2026 is what SQL was to databases in the 1990s: the interface that survived because alternatives couldn't overcome switching costs of the installed base. It's not perfect — but for 90% of teams, picking any S3-compatible system and moving on is the right call.

The decision isn't whether to use S3-compatible storage — it's which one. And that comes down to license tolerance, scale, workload pattern, and who pages at 3 AM when a disk fails.

For teams evaluating self-hosted object storage — especially those moving away from MinIO's community edition — RustFS offers Apache 2.0 licensing, single-node-to-cluster scaling, and throughput leading the open-source field. Not right for every workload, but deserves a spot on your shortlist.

FAQ

What does "S3-compatible" actually mean?

It means a storage system implements Amazon's Simple Storage Service (S3) REST API — the same bucket/object model, the same authentication (Signature V4), and the same core operations (PUT, GET, DELETE, List). If your code works with AWS S3, it works with any S3-compatible system after changing the endpoint URL and credentials. That's the whole point.

Is S3 compatibility truly universal, or are there gaps?

Core operations (CRUD on objects, bucket lifecycle, presigned URLs) are nearly universal. But advanced features vary: Object Lock / legal hold is supported by MinIO, RustFS, and Wasabi but missing from SeaweedFS. Cross-region replication exists in Ceph RGW and cloud providers but not in most lightweight options. Always test your specific feature set against your target system's API docs before committing.

Can I use AWS CLI with S3-compatible storage?

Yes. Set AWS_ENDPOINT_URL to your server's address and configure access keys. Example: aws --endpoint-url http://localhost:9000 s3 ls. Most S3-compatible systems also work with rclone, Cyberduck, s3cmd, and language SDKs (boto3, aws-sdk-go, @aws-sdk/javascript) without modification.

Which S3-compatible storage is fastest?

It depends entirely on the workload profile. For sequential large-object PUT throughput, RustFS leads at 2.1–2.3x over MinIO in our benchmarks (4 KiB – 10 MiB range). For small random GET operations, MinIO still holds an edge in mixed workloads. Cloud S3 has the lowest operational latency if you're already in AWS. Benchmark your own workload — published numbers reflect the tester's configuration, not yours.

Do I need to pay Amazon to use S3-compatible storage?

No. S3 is an API protocol, not a service you buy from Amazon. Self-hosted S3-compatible systems like RustFS, Ceph, and SeaweedFS are free and open-source (check each project's license). You pay only for your own infrastructure — servers, disks, network. Cloud S3-compatible options like Wasabi and Backblaze B2 charge their own rates, independent of AWS.


Feedback? GitHub Issues

Top comments (0)