The S3 API Standard

Amazon S3 defined the object storage API. Now dozens of services implement the same API — change the endpoint URL and your existing code works. This compatibility means you're never locked into one vendor. AWS SDK, boto3, and every S3 client library work with compatible services.

Cloudflare R2: Zero Egress

R2's killer feature: zero egress fees. AWS S3 charges $0.09/GB for data transfer out — for media-heavy sites, egress costs dwarf storage costs. R2 eliminates this entirely. It's S3-compatible, integrates with Cloudflare Workers for edge processing, and has competitive storage pricing. The main tradeoff: fewer features than S3 (no lifecycle policies for versioning, limited event notifications).

Backblaze B2: Budget Champion

B2 storage costs $0.005/GB/month — 1/4 of S3. Free egress to Cloudflare (via their bandwidth alliance), Fastly, and Bunny CDN. S3-compatible API. Best for backups, archives, and media storage where you need a CDN in front. The tradeoff: single region, fewer durability guarantees than S3's 11 nines.

MinIO: Self-Hosted S3

MinIO runs S3-compatible storage on your own infrastructure — bare metal, VMs, or Kubernetes. Perfect for private cloud, data sovereignty requirements, or development environments. It's open-source, performant, and supports erasure coding for durability. Run MinIO in Docker for local development that mirrors production S3.

AWS S3: The Standard

S3 has the most features: intelligent tiering, lifecycle policies, event notifications, access points, Object Lambda, and 11 nines of durability. If you're already in AWS, the ecosystem integration is unmatched. But egress costs add up fast — a 10TB/month media site pays $900/month in egress alone.

Migration Guide

Migrating between S3-compatible services is straightforward: use rclone sync or aws s3 sync with custom endpoints. Update your SDK configuration to point to the new endpoint. Test with a small subset first. For zero-downtime migration, set up dual writes during the transition period.

Conclusion

For read-heavy workloads: R2 (zero egress). For budget storage: B2. For self-hosted: MinIO. For maximum features: S3. The S3 API compatibility means you can start with one and switch later without rewriting code. Choose based on your egress patterns and budget.