Home/Blog/Cloud/Object Storage Face-Off: Cloudflare R2 vs S3 vs Azure Blob vs Google Cloud Storage
Cloud

Object Storage Face-Off: Cloudflare R2 vs S3 vs Azure Blob vs Google Cloud Storage

A deep technical comparison of object storage platforms — Cloudflare R2, AWS S3, Azure Blob Storage, and Google Cloud Storage — covering architecture, egress fees, features, pricing, and migration strategies.

By InventiveHQ Team

Introduction

Object storage is the foundation of modern cloud architecture. Every static asset, backup, data lake, application artifact, and machine learning dataset ultimately lives in an object store. The choice of object storage provider affects not just your storage costs, but your entire architecture — because egress fees determine where you put your compute, which services you use, and whether multi-cloud is economically viable.

For over a decade, AWS S3 has been the de facto standard. Azure Blob Storage and Google Cloud Storage followed with competitive alternatives tightly integrated into their respective ecosystems. Then in 2022, Cloudflare launched R2 with a simple premise: S3-compatible object storage with zero egress fees.

This comparison examines the architectural differences, feature sets, pricing models, and strategic implications of each platform. The honest assessment: R2's zero-egress model is genuinely disruptive for certain workloads, but S3's ecosystem depth and the hyperscalers' advanced storage tiers remain significant advantages for others.

Architecture Deep Dive

Cloudflare R2: S3-Compatible, Zero Egress, Globally Distributed

R2 implements the S3 API, making it a drop-in replacement for most S3 workloads. You change the endpoint URL, and existing S3 SDKs, CLI tools, and libraries work without code changes.

The architectural differentiation is threefold:

Zero egress fees. Data leaving R2 to the internet costs $0. No bandwidth charges, no per-GB fees, no tiered pricing. This is not a promotional offer — it is the permanent pricing model.

Automatic geographic distribution. Unlike S3 where you choose a specific region (us-east-1, eu-west-1), R2 does not require region selection. Data is stored durably and served from Cloudflare's network. For workloads that require data residency, R2 offers jurisdiction hints to constrain data placement to specific geographic areas (EU, for example).

Workers integration. R2 buckets are directly accessible from Cloudflare Workers, meaning you can run compute on the same network as your storage without any data transfer costs. This is Cloudflare's strategic play: make storage free to attract data, then monetize the compute layer that processes that data.

R2 also offers Sippy, an incremental migration feature. Instead of batch-copying data from S3 to R2, Sippy configures R2 to transparently fetch objects from your S3 bucket on cache miss, copying them to R2 as they are accessed. Hot data migrates automatically; cold data stays on S3 until accessed. This eliminates migration downtime and reduces upfront egress costs.

Limitations to acknowledge: R2 has two storage classes (Standard and Infrequent Access) compared to S3's six. There is no deep archive tier. Object Lock (WORM compliance) is not available. S3 Select (querying objects in place) is not supported. The ecosystem of tools that natively integrate with R2 is growing but still smaller than S3's.

AWS S3: The Industry Standard

S3 is the most mature, most feature-rich, and most widely integrated object storage service in existence. Launched in 2006, it has had nearly two decades to accumulate capabilities.

Six storage classes provide granular cost optimization:

Storage ClassPrice/GB/monthUse Case
S3 Standard$0.023Frequently accessed data
S3 Intelligent-Tiering$0.023 (+ monitoring fee)Unknown or changing access patterns
S3 Standard-IA$0.0125Infrequent access, rapid retrieval
S3 One Zone-IA$0.01Infrequent access, non-critical data
S3 Glacier Instant Retrieval$0.004Archive with millisecond retrieval
S3 Glacier Flexible Retrieval$0.0036Archive with minutes-to-hours retrieval
S3 Glacier Deep Archive$0.00099Long-term archive, 12-48 hour retrieval

Prices for us-east-1 as of February 2026.

S3's feature depth is unmatched:

  • Object Lock for WORM (Write Once Read Many) compliance, critical for financial services, healthcare, and legal workloads
  • S3 Select and Glacier Select for querying data in place without full retrieval
  • S3 Object Lambda for transforming data during retrieval (resizing images, redacting PII, decompressing)
  • S3 Access Points for managing multi-application access patterns with distinct permissions
  • S3 Batch Operations for processing billions of objects with a single API call
  • Event notifications to SNS, SQS, Lambda, and EventBridge for reactive architectures
  • Cross-Region Replication (CRR) and Same-Region Replication (SRR) for redundancy and compliance

The downside: egress fees and complexity. S3's pricing has many dimensions (storage class, request type, retrieval tier, data transfer, management features), making cost prediction difficult.

Azure Blob Storage: Enterprise-Oriented with Data Lake Integration

Azure Blob Storage serves as both general-purpose object storage and, with Azure Data Lake Storage Gen2 (ADLS Gen2), a Hadoop-compatible file system for analytics workloads.

Storage tiers:

TierPrice/GB/monthRetrievalUse Case
Premium (block blob)$0.15InstantLow-latency, high-transaction workloads
Hot$0.018InstantFrequently accessed data
Cool$0.01Instant (higher retrieval cost)Infrequent access, 30-day minimum
Cold$0.0045Instant (higher retrieval cost)Rarely accessed, 90-day minimum
Archive$0.00099Hours (rehydration required)Long-term archive

Prices for East US as of February 2026.

ADLS Gen2 adds a hierarchical namespace on top of Blob Storage, providing true directory operations (rename, move) with atomic semantics — something standard object stores cannot do efficiently. This makes Azure Blob uniquely suited for Hadoop, Spark, and Databricks workloads that require POSIX-like file system semantics.

Other notable capabilities:

  • Immutable storage policies for compliance (legal hold and time-based retention)
  • Blob versioning and soft delete with point-in-time restore
  • Blob Index for tagging objects with key-value metadata and querying across tags
  • Azure CDN and Front Door integration for global content delivery

Google Cloud Storage: Unified Multi-Regional with Autoclass

Google Cloud Storage distinguishes itself with multi-regional and dual-regional bucket types that provide high availability and automatic data replication across geographies.

Storage classes:

ClassPrice/GB/monthRetrievalMinimum Duration
Standard$0.020InstantNone
Nearline$0.010Instant (retrieval fee)30 days
Coldline$0.004Instant (retrieval fee)90 days
Archive$0.0012Instant (retrieval fee)365 days

Prices for US multi-regional as of February 2026.

Autoclass is GCS's standout feature: it automatically transitions objects between storage classes based on access patterns. Instead of writing lifecycle policies to guess when objects become "cold," Autoclass monitors actual access and moves objects to the optimal tier. This eliminates the common problem of overpaying for cold data in Standard tier because nobody set up lifecycle rules.

Dual-regional buckets with Turbo Replication provide synchronous replication across two specific regions with an RPO of zero — useful for disaster recovery scenarios where data loss tolerance is measured in seconds, not hours.

GCS is deeply integrated with BigQuery (federated queries directly against GCS objects), Dataflow, and Vertex AI for machine learning pipelines.

The Egress Fee Problem

This is the most important section. Egress fees — the cost of moving data out of a cloud provider — are the invisible force that shapes cloud architecture decisions and creates vendor lock-in.

What Egress Actually Costs

Prices as of February 2026. All prices in USD for North America / US regions.

Monthly EgressCloudflare R2AWS S3Azure BlobGoogle Cloud Storage
1 TB$0$90$87$120
10 TB$0$900$870$1,100
50 TB$0$4,300$4,350$5,000
100 TB$0$8,500$8,700$10,000
500 TB$0$40,000$43,500$40,000

S3 egress: $0.09/GB first 10TB, tiered lower for higher volumes. Azure: $0.087/GB first 10TB. GCS: $0.12/GB first 1TB, $0.11/GB for 1-10TB, tiered lower.

At 100TB/month — a modest volume for a media company, SaaS platform, or content-heavy application — egress costs alone are $8,500-$10,000/month. That is often more than the storage cost itself.

Why Egress Fees Matter Architecturally

Egress fees are not just a billing line item. They shape architectural decisions in subtle but profound ways:

They determine where you put compute. If your data is on S3 and egress costs $0.09/GB, you are economically incentivized to put your compute on AWS too — even if another provider's compute is cheaper or better suited for your workload. Egress fees are an economic moat around the cloud provider's ecosystem.

They make multi-cloud impractical. True multi-cloud (running workloads across providers for resilience or optimization) requires moving data between clouds. At egress rates of $0.09-0.12/GB, cross-cloud data movement becomes a significant cost that discourages diversification.

They punish your users. Every byte served to an end user from S3, Azure Blob, or GCS incurs egress charges. Higher traffic means proportionally higher costs. This creates a perverse incentive where success (more users, more downloads) directly increases your largest variable cost.

They create switching costs. Migrating 100TB from S3 to another provider costs $9,000 in egress alone — before you write a single line of migration code. This is vendor lock-in through pricing, not technology.

Cloudflare's Zero-Egress Argument

Cloudflare has publicly argued that egress fees are not reflections of actual bandwidth costs. Transit pricing on the open market is $1-5 per Mbps/month at scale (roughly $0.001-0.005/GB), an order of magnitude less than what hyperscalers charge for egress. The markup is a business decision, not a cost-of-service necessity.

R2's zero-egress model is Cloudflare's bet that storage should be a commodity and that the value should be captured in compute (Workers), not in holding your data hostage. Whether you agree with the framing or not, the pricing difference is real and significant.

Important Caveats

R2's zero-egress pricing does not eliminate all data transfer costs in every scenario:

  • Your origin still has egress. If your application server is on AWS and writes data to R2, you pay AWS egress for that write. The savings come on the read side — serving data from R2 to users is free.
  • Intra-cloud is free everywhere. S3 to CloudFront is free. Azure Blob to Azure CDN is free. GCS to Cloud CDN is free. If your entire delivery stack is on one provider, CDN egress is not the cost — internet egress from the CDN is.
  • R2's operations pricing is slightly higher. R2 charges $4.50/million PUT operations vs S3's $5.00, but R2's $0.36/million GET operations vs S3's $0.40 are comparable. At very high operation counts, these costs are non-trivial.

Storage Features Comparison

FeatureR2S3Azure BlobGCS
S3 API compatibleYesNativeNo (REST API)Interop XML API
Storage classes2 (Standard, IA)75 (Premium, Hot, Cool, Cold, Archive)4 (Standard, Nearline, Coldline, Archive)
Automatic tier managementNoIntelligent-TieringLifecycle managementAutoclass
Lifecycle policiesBasic (expiration, IA transition)ComprehensiveComprehensiveComprehensive
VersioningYesYesYesYes
Object Lock (WORM)NoYesYes (immutable policies)Yes (retention policies)
Server-side encryptionDefault (Cloudflare-managed)SSE-S3, SSE-KMS, SSE-CMicrosoft-managed, customer-managed (Key Vault)Google-managed, Cloud KMS, CSEK
Customer-managed keysNoYes (KMS)Yes (Key Vault)Yes (Cloud KMS)
ReplicationAuto-distributedCRR, SRRGRS, RA-GRS, GZRSMulti-region, dual-region
Max object size5 TB (5 GB single upload)5 TB (5 GB single upload)4.75 TB (block blob)5 TB (5 GB single upload)
Multipart uploadYes (S3-compatible)YesBlock/Append blob typesResumable uploads
Event notificationsQueues (beta)SNS, SQS, Lambda, EventBridgeEvent GridPub/Sub, Cloud Functions
In-place queryingNoS3 Select, AthenaAzure SynapseBigQuery federated queries
Static website hostingVia WorkersBuilt-inBuilt-inBuilt-in
CDN integrationWorkers + Cache APICloudFront (free transfer)Azure CDN / Front DoorCloud CDN (free transfer)
Hierarchical namespaceNoNoYes (ADLS Gen2)No
Object taggingYes (limited)Yes (up to 10 per object)Yes (Blob Index)Yes (custom metadata)
Durability99.999999999%99.999999999%99.999999999999% (16 nines, RA-GRS)99.999999999%

Where S3 Wins on Features

S3's feature depth is difficult to overstate. Object Lock is mandatory for SEC Rule 17a-4, HIPAA, and other compliance frameworks that require immutable storage. S3 Select reduces data transfer costs by querying objects server-side and returning only matching records. S3 Object Lambda lets you transform data during retrieval — resize images, redact PII, decompress files — without maintaining separate copies.

The ecosystem of tools built on S3 is vast: every data processing framework (Spark, Presto, Trino, Hive), every backup tool (Veeam, Commvault, Rubrik), every data platform (Snowflake, Databricks, Fivetran) supports S3 natively. R2's S3 API compatibility means many of these work, but native integration and testing varies.

Where R2 Wins on Simplicity

R2 has two storage classes. S3 has seven. Azure has five tiers plus Premium. GCS has four plus Autoclass.

For many workloads, this complexity is unnecessary overhead. If you are serving static assets, storing user uploads, or hosting application artifacts, you do not need the distinction between Standard-IA and One Zone-IA, or the decision between Glacier Instant Retrieval and Glacier Flexible Retrieval. R2's simplicity means less configuration, fewer lifecycle rules to maintain, and fewer surprises on your bill.

Pricing Model Comparison

All prices in USD, North America / US regions, as of February 2026.

Storage Cost

ProviderStandardInfrequent / CoolCold / NearlineArchive
R2$0.015/GB$0.01/GB (IA)
S3$0.023/GB$0.0125/GB (Standard-IA)$0.004/GB (Glacier Instant)$0.00099/GB (Deep Archive)
Azure Blob$0.018/GB (Hot)$0.01/GB (Cool)$0.0045/GB (Cold)$0.00099/GB (Archive)
GCS$0.020/GB$0.010/GB (Nearline)$0.004/GB (Coldline)$0.0012/GB (Archive)

R2 is cheapest for standard storage at $0.015/GB. But for cold and archive storage, the hyperscalers offer dramatically lower prices. S3 Glacier Deep Archive at $0.00099/GB is 15x cheaper than R2 Standard for long-term archival data.

Operations Cost

OperationR2S3Azure Blob (Hot)GCS
PUT/POST/LIST per 1M$4.50$5.00$5.40$5.00
GET per 1M$0.36$0.40$0.40$0.40
DELETEFreeFreeFreeFree

Operations pricing is comparable across providers, with R2 slightly cheaper on both writes and reads.

Total Cost of Ownership: Worked Example

Scenario: 10TB stored, 50TB/month egress, 100M GET requests/month, 10M PUT requests/month.

ComponentR2S3 StandardAzure Blob HotGCS Standard
Storage (10TB)$150$230$180$200
PUT operations (10M)$45$50$54$50
GET operations (100M)$36$40$40$40
Egress (50TB)$0$4,300$4,350$5,000
Monthly total$231$4,620$4,624$5,290
Annual total$2,772$55,440$55,488$63,480

At this scale, R2 costs 95% less than the hyperscalers. The storage and operations costs are comparable — the entire difference is egress.

When the Hyperscaler Is Cheaper

The above scenario maximizes R2's advantage (high egress ratio). Consider alternative scenarios:

Heavy write, low read workload (data lake ingestion): If you are writing 100TB/month but reading only 1TB, egress is a small portion of the bill and S3's cheaper archival tiers matter more.

Intra-cloud processing: If your compute reads from storage within the same cloud, egress is free on all providers. The cost comparison then comes down to storage pricing and operations, where R2's advantage is modest.

Compliance-requiring workloads: If you need Object Lock for regulatory compliance, R2 cannot serve that requirement today. The cost of compliance failure far exceeds any storage savings.

Calculate Your Costs

Use the calculator below to estimate costs for your specific workload:

Object Storage Cost Calculator

Compare costs across providers and storage tiers. Retrieval fees are estimated from egress volume.

GB
GB/mo
K/mo
K/mo
Cloudflare R21st
$7.35/mo
$88.20/yearZero egress fees. Free tier: 10 GB storage, 1M class A ops, 10M class B ops.
Azure Blob Storage2nd
$9.99/mo
$119.88/yearHot tier. First 100 GB egress/mo free.
Google Cloud Storage3rd
$10.90/mo
$130.80/yearStandard class. First 100 GB egress/mo free.
AWS S34th
$12.40/mo
$148.80/yearS3 Standard. First 100 GB egress/mo free.

Estimates based on published pricing as of February 2026. Actual costs may vary by region, commitment, and usage patterns.

Migration and Interoperability

S3 API Compatibility Landscape

R2's S3 API compatibility is its most important strategic feature. Because S3 is the de facto standard API for object storage, R2 benefits from an enormous ecosystem of compatible tools. However, compatibility varies:

Works well: boto3 (Python), AWS SDK (with endpoint override), rclone, MinIO Client, Terraform S3 backend, most backup tools with S3 targets.

Partial support: Some tools that use S3 features R2 does not support (Object Lock, S3 Select, certain lifecycle actions) will fail on those specific operations but work for basic CRUD.

Not compatible: Azure Blob Storage uses its own REST API. Google Cloud Storage has an S3-compatible XML API but its native JSON API is more commonly used in GCP tooling.

Migration Tools

Migration PathToolApproach
S3 → R2SippyIncremental, transparent, no downtime
S3 → R2rclone, aws s3 syncBatch copy
Any → S3AWS DataSync, S3 Batch ReplicationBatch copy, agent-based
Any → AzureAzCopy, Azure Data BoxBatch copy, offline import
Any → GCSgsutil, Storage Transfer ServiceBatch copy, scheduled transfers

Sippy deserves emphasis because it solves the biggest practical problem with storage migration: the chicken-and-egg of switching your application to read from R2 before all data is there. With Sippy, R2 acts as a transparent read-through cache for your S3 bucket. On miss, it fetches from S3 and stores in R2. Over time, your hot data migrates automatically. When you are satisfied, you disable Sippy and R2 serves everything directly.

Vendor Lock-In Analysis

DimensionR2S3Azure BlobGCS
API portabilityS3-compatible (high)Proprietary but de facto standardProprietary (low)S3 interop available
Egress cost to leave$0$0.09/GB$0.087/GB$0.12/GB
Proprietary features usedWorkers, QueuesObject Lock, Lambda, S3 SelectADLS Gen2, Blob IndexBigQuery federation, Autoclass
Data gravityLow (no egress penalty)HighHighHigh

R2 has the lowest switching cost in the industry because there are no egress fees to move data out. If you decide R2 is not the right fit, migrating away costs nothing in data transfer. Every other provider charges you to leave.

Decision Framework

Choose Cloudflare R2 When:

  • Egress costs are a significant percentage of your storage bill — R2 eliminates this entirely
  • You serve content to end users — images, downloads, static assets, SaaS file delivery
  • You want multi-cloud flexibility — no egress penalty means you can move data freely
  • You use or plan to use Cloudflare Workers — R2 + Workers provides storage + compute on the same network
  • Your workload is straightforward — store, retrieve, list, delete without needing archive tiers or WORM compliance

Choose AWS S3 When:

  • You need compliance features — Object Lock for SEC 17a-4, HIPAA, SOX immutable storage requirements
  • Your data pipeline is AWS-native — Athena, Redshift Spectrum, EMR, SageMaker integration
  • You need deep archival storage — Glacier Deep Archive at $0.00099/GB is 15x cheaper than R2 for cold data
  • You want maximum ecosystem compatibility — every data tool supports S3 natively
  • Intelligent-Tiering fits your access pattern — automatic cost optimization without lifecycle rules

Choose Azure Blob Storage When:

  • You need a data lake file system — ADLS Gen2's hierarchical namespace is essential for Hadoop, Spark, and Databricks workloads
  • You are in the Azure ecosystem — native integration with Azure Functions, Synapse, Databricks, and AKS
  • Premium block blob performance is required — sub-millisecond latency for high-transaction workloads
  • Enterprise compliance with Azure governance, Azure Policy, and Microsoft Purview integration

Choose Google Cloud Storage When:

  • Your analytics stack is on GCP — BigQuery federated queries directly against GCS objects
  • Autoclass saves you from managing lifecycle policies — automatic tier optimization
  • Dual-regional with Turbo Replication is needed for zero-RPO disaster recovery
  • ML training pipelines on Vertex AI need close integration with training data storage

The Strategic Picture

Object storage pricing tells you more about a cloud provider's strategy than any product announcement.

AWS, Azure, and Google all charge significant egress fees. These fees are the economic glue that holds their ecosystems together. Once your data is on S3, the cheapest place to compute on it is AWS. The cheapest place to serve it is CloudFront. The cheapest place to analyze it is Athena. This is not an accident — it is an economic architecture designed to concentrate workloads within a single provider.

Cloudflare's zero-egress R2 is a deliberate disruption of this model. By making data free to move, Cloudflare is betting that the value of the network lies in compute and security, not in data captivity. If R2 succeeds at scale, it undermines the economic lock-in that underpins hyperscaler margins.

The honest assessment: R2 is the right choice for workloads where data is served externally (websites, APIs, downloads, SaaS applications). The savings are dramatic and real. But for complex data processing pipelines, compliance-heavy workloads, and deep ecosystem integration, the hyperscalers' broader feature sets and tighter service integration remain genuine advantages. The maturity gap is closing but still meaningful.

Understanding this trade-off — simplicity and freedom versus depth and ecosystem — is more useful than any feature comparison table.

Frequently Asked Questions

Find answers to common questions

Yes. R2 implements the S3 API, meaning most S3 SDKs, CLI tools, and libraries work with R2 by changing the endpoint URL. There are some gaps — R2 does not support all S3 features like Object Lock, S3 Select, or certain lifecycle transition classes — but for the majority of S3 workloads (store, retrieve, list, delete), R2 is a drop-in replacement.

At 100TB/month of egress: R2 costs $0, AWS S3 costs approximately $8,500, Azure Blob costs approximately $8,700, and Google Cloud Storage costs approximately $10,000. Egress fees are often the largest line item in cloud storage bills, frequently exceeding the storage cost itself. This is why R2's zero-egress model is so disruptive.

Sippy is Cloudflare's incremental migration feature for R2. Instead of copying all data upfront, Sippy configures R2 to transparently read from your existing S3 bucket on cache miss, copying objects to R2 as they are accessed. Over time, hot data migrates automatically. This eliminates downtime, avoids batch migration jobs, and lets you migrate gradually.

R2 has two storage classes: Standard and Infrequent Access (IA). Standard is $0.015/GB/month. Infrequent Access is $0.01/GB/month with minimum 30-day storage duration and higher retrieval costs. R2 does not offer deep archive tiers comparable to S3 Glacier or Azure Archive. If you need long-term archival storage at $0.001-0.004/GB, the hyperscalers still have an advantage.

Cloudflare's business model monetizes compute (Workers), security (WAF, DDoS, Zero Trust), and platform services rather than bandwidth. Cloudflare has argued publicly that egress fees are artificial markups designed to create vendor lock-in, not reflections of actual bandwidth cost. By eliminating egress fees, R2 removes the economic barrier to multi-cloud architectures and data portability.

R2 automatically distributes data across multiple availability zones within Cloudflare's network for durability. R2 provides 99.999999999% (eleven 9s) annual durability, matching S3 Standard. Unlike S3, you do not choose a region — R2 automatically places data based on access patterns. For data locality requirements (like GDPR), R2 offers jurisdiction hints to keep data in specific regions.

Yes, with some differences. R2 does not have S3's built-in static website hosting feature, but you can serve R2 objects through a custom domain using Cloudflare Workers or by connecting R2 to a Cloudflare-managed domain. Combined with Workers for routing and caching, this approach is more flexible than S3's built-in hosting, though it requires more configuration.

S3 is the most mature choice for data lakes, with native integration with Athena, Redshift Spectrum, EMR, and the broadest ecosystem of data tools. Google Cloud Storage is excellent for BigQuery-centric analytics pipelines. Azure Blob with ADLS Gen2 provides a true hierarchical namespace optimized for analytics. R2 is less suited for heavy analytics workloads due to its limited query-in-place capabilities and smaller ecosystem integration.

All four providers encrypt data at rest by default. S3 offers three options: SSE-S3 (AWS-managed keys), SSE-KMS (customer-managed through AWS KMS), and SSE-C (customer-provided keys). Azure Blob supports Microsoft-managed and customer-managed keys via Azure Key Vault. Google Cloud Storage supports Google-managed keys, Cloud KMS keys, and customer-supplied encryption keys. R2 encrypts all data at rest with Cloudflare-managed encryption.

It depends on the workload. For publicly served content (images, downloads, static assets), R2 is an excellent choice even with AWS compute — you pay AWS egress once to write to R2, then serve unlimited reads from R2 for free. For workloads with heavy internal read/write patterns between compute and storage (like data processing pipelines), keeping storage on the same cloud as compute avoids cross-cloud latency and egress costs.

Is your cloud secure? Find out free.

Get a complimentary cloud security review. We'll identify misconfigurations, excess costs, and security gaps across AWS, GCP, or Azure.