Object Storage Comparison: AWS S3 vs Azure Blob vs GCP vs Cloudflare R2 (2026)

notes
A comparison table on a screen showing cloud storage pricing and feature columns

Object storage is the unexciting infrastructure that everything depends on. Static assets, backups, data lake files, user uploads, build artifacts — if it is a file and it needs to persist, it probably ends up in an object storage bucket. The four major options in 2026 are AWS S3, Azure Blob Storage, Google Cloud Storage, and Cloudflare R2.

This note compares them on the dimensions that actually matter for day-to-day development decisions.

Pricing: Where the Differences Are Real

Object storage pricing has three components: storage (per GB/month), operations (per request), and egress (per GB transferred out). The first two are similar across providers. The third is where the real differences live.

Storage costs (standard tier, approximate):

  • S3: $0.023/GB/month
  • Azure Blob (Hot): $0.018/GB/month
  • GCS (Standard): $0.020/GB/month
  • R2: $0.015/GB/month

Egress costs (the important number):

  • S3: $0.09/GB (first 10TB/month)
  • Azure Blob: $0.087/GB
  • GCS: $0.12/GB
  • R2: $0.00/GB (zero egress fees)

R2’s zero-egress pricing is its headline feature, and for use cases with heavy read traffic (serving images, distributing build artifacts, public datasets), it changes the economics dramatically. A site serving 10TB/month of images saves roughly $900/month by switching from S3 to R2. For small sites, the savings are proportionally smaller but still meaningful.

The catch: R2 charges for operations ($0.36 per million Class A writes, $0.36 per million Class B reads). For workloads with very high request counts and small object sizes, the per-operation cost can offset the egress savings.

S3-Compatibility and Ecosystem

S3’s API is the de facto standard. Every object storage service — including Azure Blob, GCS, and R2 — offers S3-compatible APIs to varying degrees.

R2 is the most compatible. It implements the S3 API closely enough that most applications can switch by changing the endpoint URL. The migration path is genuinely low-friction for standard use cases.

GCS has an S3 interoperability mode, but some advanced S3 features (bucket policies, certain lifecycle configurations) do not map cleanly. Azure Blob’s S3 compatibility is limited; it has its own REST API and SDK that work differently.

The ecosystem matters because every backup tool, data pipeline, and deployment script assumes S3. If your stack is built on S3 assumptions, switching to a provider with high S3 compatibility (R2 or Backblaze B2) is easier than switching to one with its own API (Azure Blob).

Performance Characteristics

For most developer use cases, the performance differences between object storage providers are negligible. They all serve small objects in 50-200ms from the nearest region, and they all scale to massive throughput for large files.

The meaningful performance differences:

First-byte latency for cold reads: S3 and GCS are slightly faster than R2 for objects that are not in cache. R2’s edge cache improves repeat reads significantly, but first-access cold reads add 10-30ms compared to S3 in the same region.

Multipart upload throughput: S3 and GCS have the most optimized multipart upload paths. For uploading large files (100GB+), they handle parallelization and retry logic more gracefully.

List operations: Listing objects in buckets with millions of items is slow on all providers, but S3’s list-objects-v2 is the most optimized. If your workload involves frequent bucket listing (data pipelines, sync operations), test this specifically.

Feature Comparison

FeatureS3Azure BlobGCSR2
VersioningYesYesYesYes
Lifecycle policiesYesYesYesYes
Event notificationsYes (SNS/SQS/Lambda)Yes (Event Grid)Yes (Pub/Sub/Functions)Yes (Workers)
Static website hostingYesYesYesYes (via Worker)
Access tiers (hot/cold/archive)4 tiers3 tiers4 tiers2 tiers
Replication (cross-region)YesYesYesAutomatic (edge)
Object lock (WORM)YesYesYesYes

S3 has the richest feature set. Azure Blob and GCS are close. R2 covers the essentials and adds features regularly, but advanced use cases (complex lifecycle policies, cross-region replication control) may require workarounds.

When to Choose What

Choose S3 if you are already on AWS, need the deepest feature set, or require specific compliance certifications. The ecosystem integration (Lambda triggers, CloudFront, IAM policies) is unmatched.

Choose Azure Blob if you are a Microsoft shop running Azure infrastructure. The integration with Azure Functions, Azure CDN, and Azure AD is the primary value. Switching from S3 for Azure Blob’s own merits rarely makes sense.

Choose GCS if your workload is data or ML focused. BigQuery, Dataflow, and Vertex AI all integrate natively with GCS. The data pipeline ecosystem on GCP assumes GCS.

Choose R2 if egress costs are a significant line item, you want S3 compatibility without AWS lock-in, or you are already using Cloudflare for CDN and want the integration with Workers. R2 pairs well with edge computing patterns that serve content globally.

For blob storage patterns in MySQL, remember: the database stores the pointer, the object store holds the bytes. The choice of object store does not change that architecture.

The Migration Reality

Switching object storage providers is mechanically simple (copy files, update endpoint) and operationally painful (update IAM policies, adjust monitoring, validate every integration). The biggest cost is not the data transfer — it is the engineering time to verify that everything still works.

If you are starting fresh, the decision matters. If you are already deployed, the switching cost is real. Do not migrate unless the cost savings or feature requirements justify the engineering investment.