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 Class | Price/GB/month | Use Case |
|---|---|---|
| S3 Standard | $0.023 | Frequently accessed data |
| S3 Intelligent-Tiering | $0.023 (+ monitoring fee) | Unknown or changing access patterns |
| S3 Standard-IA | $0.0125 | Infrequent access, rapid retrieval |
| S3 One Zone-IA | $0.01 | Infrequent access, non-critical data |
| S3 Glacier Instant Retrieval | $0.004 | Archive with millisecond retrieval |
| S3 Glacier Flexible Retrieval | $0.0036 | Archive with minutes-to-hours retrieval |
| S3 Glacier Deep Archive | $0.00099 | Long-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:
| Tier | Price/GB/month | Retrieval | Use Case |
|---|---|---|---|
| Premium (block blob) | $0.15 | Instant | Low-latency, high-transaction workloads |
| Hot | $0.018 | Instant | Frequently accessed data |
| Cool | $0.01 | Instant (higher retrieval cost) | Infrequent access, 30-day minimum |
| Cold | $0.0045 | Instant (higher retrieval cost) | Rarely accessed, 90-day minimum |
| Archive | $0.00099 | Hours (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:
| Class | Price/GB/month | Retrieval | Minimum Duration |
|---|---|---|---|
| Standard | $0.020 | Instant | None |
| Nearline | $0.010 | Instant (retrieval fee) | 30 days |
| Coldline | $0.004 | Instant (retrieval fee) | 90 days |
| Archive | $0.0012 | Instant (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 Egress | Cloudflare R2 | AWS S3 | Azure Blob | Google 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
| Feature | R2 | S3 | Azure Blob | GCS |
|---|---|---|---|---|
| S3 API compatible | Yes | Native | No (REST API) | Interop XML API |
| Storage classes | 2 (Standard, IA) | 7 | 5 (Premium, Hot, Cool, Cold, Archive) | 4 (Standard, Nearline, Coldline, Archive) |
| Automatic tier management | No | Intelligent-Tiering | Lifecycle management | Autoclass |
| Lifecycle policies | Basic (expiration, IA transition) | Comprehensive | Comprehensive | Comprehensive |
| Versioning | Yes | Yes | Yes | Yes |
| Object Lock (WORM) | No | Yes | Yes (immutable policies) | Yes (retention policies) |
| Server-side encryption | Default (Cloudflare-managed) | SSE-S3, SSE-KMS, SSE-C | Microsoft-managed, customer-managed (Key Vault) | Google-managed, Cloud KMS, CSEK |
| Customer-managed keys | No | Yes (KMS) | Yes (Key Vault) | Yes (Cloud KMS) |
| Replication | Auto-distributed | CRR, SRR | GRS, RA-GRS, GZRS | Multi-region, dual-region |
| Max object size | 5 TB (5 GB single upload) | 5 TB (5 GB single upload) | 4.75 TB (block blob) | 5 TB (5 GB single upload) |
| Multipart upload | Yes (S3-compatible) | Yes | Block/Append blob types | Resumable uploads |
| Event notifications | Queues (beta) | SNS, SQS, Lambda, EventBridge | Event Grid | Pub/Sub, Cloud Functions |
| In-place querying | No | S3 Select, Athena | Azure Synapse | BigQuery federated queries |
| Static website hosting | Via Workers | Built-in | Built-in | Built-in |
| CDN integration | Workers + Cache API | CloudFront (free transfer) | Azure CDN / Front Door | Cloud CDN (free transfer) |
| Hierarchical namespace | No | No | Yes (ADLS Gen2) | No |
| Object tagging | Yes (limited) | Yes (up to 10 per object) | Yes (Blob Index) | Yes (custom metadata) |
| Durability | 99.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
| Provider | Standard | Infrequent / Cool | Cold / Nearline | Archive |
|---|---|---|---|---|
| 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
| Operation | R2 | S3 | Azure 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 |
| DELETE | Free | Free | Free | Free |
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.
| Component | R2 | S3 Standard | Azure Blob Hot | GCS 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.
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 Path | Tool | Approach |
|---|---|---|
| S3 → R2 | Sippy | Incremental, transparent, no downtime |
| S3 → R2 | rclone, aws s3 sync | Batch copy |
| Any → S3 | AWS DataSync, S3 Batch Replication | Batch copy, agent-based |
| Any → Azure | AzCopy, Azure Data Box | Batch copy, offline import |
| Any → GCS | gsutil, Storage Transfer Service | Batch 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
| Dimension | R2 | S3 | Azure Blob | GCS |
|---|---|---|---|---|
| API portability | S3-compatible (high) | Proprietary but de facto standard | Proprietary (low) | S3 interop available |
| Egress cost to leave | $0 | $0.09/GB | $0.087/GB | $0.12/GB |
| Proprietary features used | Workers, Queues | Object Lock, Lambda, S3 Select | ADLS Gen2, Blob Index | BigQuery federation, Autoclass |
| Data gravity | Low (no egress penalty) | High | High | High |
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.