Your Media Bill Is 80% Delivery Costs. Most Teams Optimize the Wrong 20%.
Here is a pattern we see in almost every media-heavy application: the team spends hours optimizing image compression, picking the perfect codec, tuning video bitrates. They save 15-20% on storage. Meanwhile, 80% of their media bill is egress and CDN delivery, and nobody has compared providers for that part.
The math is brutal. Store 10TB of media on S3: $230/month. Deliver that media to users at 50TB monthly bandwidth via CloudFront: $4,250/month. The delivery cost is 18x the storage cost. Every percentage point saved on delivery is worth 18x more than the same reduction on storage.
This is why the serverless media landscape has fragmented into specialized platforms. Some optimize storage (R2, B2). Some optimize delivery (Bunny CDN, Fastly). Some bundle everything with transformations (Cloudinary, imgix). Some specialize in video (Mux, api.video). The right choice depends entirely on your media type, access pattern, and whether you need processing or just storage + delivery.
We have optimized media infrastructure for several clients at LeanOps, particularly SaaS platforms and content-heavy applications where media costs were growing 20-30% quarterly. This post compares the real costs of 7 serverless media platforms in 2026, modeled at realistic volumes, so you can pick the one that actually fits your workload.
The 7 Platforms Compared
| Platform | Best For | Storage | Delivery | Transformations |
|---|---|---|---|---|
| AWS S3 + CloudFront | Full AWS ecosystem | $0.023/GB | $0.085/GB | Via Lambda/MediaConvert |
| Cloudflare R2 | Cost-optimized delivery | $0.015/GB | Free | Via Workers (custom) |
| Cloudinary | Image/video transformations | Included | Included | Built-in (resize, format, AI) |
| imgix | High-volume image processing | External | $0.08/GB | $0.0008/transformation |
| Bunny CDN + Storage | Budget media CDN | $0.005/GB | $0.01/GB | Basic (resize, WebP) |
| Mux | Video streaming | $0.007/min | $0.007/min | Encoding + adaptive bitrate |
| Backblaze B2 + CDN | Archival media | $0.006/GB | Free (via CF) | None (external) |
Platform-by-Platform Pricing Breakdown
1. AWS S3 + CloudFront
The default choice for AWS-native applications. Maximum flexibility, maximum ecosystem integration, maximum cost.
| Component | Rate | Notes |
|---|---|---|
| S3 Standard storage | $0.023/GB/month | Media source files |
| S3 PUT requests | $0.005/1,000 | Upload operations |
| S3 GET requests | $0.0004/1,000 | Origin fetches |
| CloudFront delivery (first 10TB) | $0.085/GB | To end users |
| CloudFront delivery (10-50TB) | $0.080/GB | Volume discount |
| CloudFront delivery (50-150TB) | $0.060/GB | Enterprise scale |
| CloudFront to S3 origin | Free | No origin fetch charge |
| Lambda@Edge (if used) | $0.60/M requests + compute | For transformations |
| MediaConvert (video) | $0.015-0.024/min | Encoding/transcoding |
Total cost at 10TB stored, 50TB delivered/month:
- Storage: 10TB x $0.023 x 1,024 = $236
- Delivery: 50TB x $0.080 x 1,024 = $4,096
- Requests (est. 100M): $40
- Total: ~$4,372/month
Strengths: Deepest integration with AWS services, most mature CDN (450+ PoPs), Lambda@Edge for edge compute, fine-grained access control (signed URLs, geo-restrictions), real-time logging.
Weaknesses: Most expensive at scale. CloudFront egress pricing is 8-85x more expensive than alternatives. No built-in image optimization (requires Lambda or third-party).
2. Cloudflare R2
The disruptor. S3-compatible storage with zero egress fees. Game-changing for media delivery.
| Component | Rate | Notes |
|---|---|---|
| Storage | $0.015/GB/month | S3-compatible API |
| Class A operations (writes) | $4.50/M | PUT, POST, LIST |
| Class B operations (reads) | $0.36/M | GET, HEAD |
| Egress/delivery | Free | Zero egress, unlimited |
| Free tier | 10GB storage, 1M class A, 10M class B | Monthly |
| Workers (optional processing) | $0.30/M requests (after 10M free) | Custom logic |
Total cost at 10TB stored, 50TB delivered/month:
- Storage: 10TB x $0.015 x 1,024 = $154
- Operations (est. 100M reads): $36
- Delivery: $0
- Total: ~$190/month
That is a 95% reduction compared to S3 + CloudFront ($4,372 vs $190) for the same workload.
Strengths: Zero egress makes delivery costs predictable and near-zero. S3-compatible API (easy migration from S3). Cloudflare's CDN network (300+ PoPs) included. Workers for edge transformations.
Weaknesses: No built-in image/video transformation pipeline (you build it with Workers). Fewer API features than S3 (no lifecycle policies, no versioning in all regions). Smaller ecosystem of tools and integrations. No native video encoding.
Best for: Static media delivery (images, downloads, video files) where you do not need on-the-fly processing. If you just store and serve, R2 is the obvious winner.
For a full R2 pricing deep-dive, see our Cloudflare R2 pricing guide 2026.
3. Cloudinary
The all-in-one media platform. Storage + delivery + transformations in one service.
| Plan | Monthly Cost | Transformations | Bandwidth | Storage |
|---|---|---|---|---|
| Free | $0 | 25K | 25 GB | 25 GB |
| Plus | $89/month | 225K | 225 GB | 75 GB |
| Advanced | $224/month | 800K | 1 TB | 225 GB |
| Enterprise | Custom | Custom | Custom | Custom |
| Overage (transforms) | ~$0.024/each | Per transformation | ||
| Overage (bandwidth) | ~$0.40/GB | Beyond plan |
Total cost at 10TB stored, 50TB delivered/month, 5M transformations:
- Enterprise plan (custom): approximately $3,000-5,000/month
- Or: Advanced plan + massive overages = $224 + $4,000 bandwidth + $100K transforms = impractical
Strengths: Built-in image optimization (format conversion, responsive breakpoints, AI crop). Video transcoding and adaptive streaming. Automatic format selection (WebP, AVIF, HEIC based on browser). Global CDN included. Easy URL-based transformation API.
Weaknesses: Extremely expensive at high volume. Overage pricing is punitive ($0.40/GB bandwidth beyond plan). Vendor lock-in (proprietary URL structure). Enterprise pricing is opaque. Not cost-effective for simple store-and-serve workloads.
Best for: Applications that need heavy image/video processing (e-commerce product images, user-uploaded content requiring moderation and resizing, media-rich marketing sites). Best when transformation count is moderate (under 1M/month).
4. imgix
Image processing as a service. You bring your own storage, imgix handles transformations and delivery.
| Component | Rate | Notes |
|---|---|---|
| Transformations | $0.0008/each | All processing (resize, format, crop) |
| Bandwidth | $0.08/GB | CDN delivery of processed images |
| Source storage | External (your S3/GCS/R2) | imgix does not store originals |
| Base plans | From $10/month | Includes some volume |
Total cost at 5M transformations/month, 10TB bandwidth:
- Transformations: 5M x $0.0008 = $4,000
- Bandwidth: 10TB x $0.08 x 1,024 = $819
- Total: ~$4,819/month (plus your storage on S3/R2)
Wait, that seems expensive. But compare to Cloudinary:
- 5M transformations on Cloudinary: 5M x $0.024 = $120,000 in overages
imgix is 30x cheaper per transformation than Cloudinary overages. At high volume, imgix wins massively on transformation cost.
Strengths: Cheapest per-transformation cost at scale. Real-time image processing via URL parameters. Works with any storage backend (S3, R2, GCS). Excellent image quality optimization. Fast CDN (Akamai-backed).
Weaknesses: Images only (no video). Requires separate storage (extra cost and complexity). Bandwidth pricing ($0.08/GB) is expensive compared to Bunny or R2. Base plan required on top of usage costs.
Best for: High-volume image-heavy applications (e-commerce catalogs with millions of SKUs, real estate listings, media publishers) where you need millions of transformations at the lowest per-unit cost.
5. Bunny CDN + Bunny Storage
Budget-friendly media CDN with integrated storage. Surprisingly capable for the price.
| Component | Rate | Notes |
|---|---|---|
| Bunny Storage | $0.005/GB/month | Per replication zone |
| Bunny CDN (NA/EU) | $0.01/GB | North America + Europe |
| Bunny CDN (Asia) | $0.03/GB | Asia-Pacific |
| Bunny CDN (SA/AF) | $0.045/GB | South America, Africa |
| Image optimization (Bunny Optimizer) | $9.50/month (unlimited) | Resize, WebP, AVIF |
| Video delivery (Stream) | $0.005/min | Adaptive bitrate included |
| Pull zone | $0 | Unlimited pull zones |
Total cost at 10TB stored (2 zones), 50TB delivered (NA/EU):
- Storage: 10TB x $0.005 x 2 zones x 1,024 = $102
- Delivery: 50TB x $0.01 x 1,024 = $512
- Optimizer: $9.50
- Total: ~$624/month
Comparison:
- S3 + CloudFront: $4,372
- Cloudflare R2: $190
- Bunny: $624
Bunny is between R2 and S3, but includes built-in image optimization and video streaming that R2 does not.
Strengths: Incredible price-to-performance ratio. Built-in image optimization ($9.50/month flat for unlimited). Video streaming with adaptive bitrate. Integrated storage with multi-zone replication. Simple, predictable pricing.
Weaknesses: Smaller CDN network (114 PoPs vs CloudFront 450+ or Cloudflare 300+). Less ecosystem tooling. No S3-compatible API (proprietary API). Less suitable for highly custom media pipelines.
Best for: Content-heavy websites, blogs, SaaS platforms that need affordable media delivery with basic image optimization. Excellent for startups and mid-size companies that find CloudFront too expensive but need more than raw R2 storage.
6. Mux (Video Specific)
The video platform for developers. Encoding, storage, streaming, and analytics in one API.
| Component | Rate | Notes |
|---|---|---|
| Video encoding | $0.015/min | Per minute of source video |
| Video storage | $0.007/min/month | Per minute stored |
| Video delivery | $0.007/min delivered | Adaptive bitrate streaming |
| Live streaming | $0.007/min (delivery) + $0.012/min (live encoding) | Real-time |
| Analytics (Mux Data) | From $0 (basic) to custom | Viewer insights |
| Free tier | None (pay-per-use from first minute) | No minimum |
Total cost for 100-hour video library, 10,000 hours monthly views:
- Encoding (one-time per video): 6,000 min x $0.015 = $90 (amortized)
- Storage: 6,000 min x $0.007 = $42/month
- Delivery: 600,000 min x $0.007 = $4,200/month
- Total: ~$4,242/month
Self-hosted alternative (S3 + CloudFront + MediaConvert):
- S3 storage (multiple bitrates, 5x source): 500GB x $0.023 = $12
- MediaConvert encoding (one-time): 6,000 min x $0.024 = $144
- CloudFront delivery (10TB estimated): 10TB x $0.080 x 1,024 = $819
- Total: ~$975/month (but requires building the entire adaptive bitrate pipeline)
Mux costs 4x more than DIY. The question is whether your engineering time to build and maintain a video pipeline (HLS packaging, adaptive bitrate, thumbnail generation, player SDK) is worth $3,000/month.
Strengths: Complete video platform (encoding, storage, delivery, player, analytics). Adaptive bitrate streaming out of the box. Excellent developer API. No infrastructure to manage. Automatic quality optimization.
Weaknesses: Expensive at scale ($0.007/min delivered adds up). No image support. Vendor lock-in (proprietary encoding). No free tier.
Best for: Developer-focused video platforms (SaaS with video features, educational platforms, streaming services) where engineering time is more expensive than Mux's premium. Not cost-effective for simple video hosting without streaming requirements.
7. Backblaze B2 + Cloudflare CDN
The budget king. Cheapest possible media storage with free delivery through Cloudflare's Bandwidth Alliance.
| Component | Rate | Notes |
|---|---|---|
| B2 storage | $0.006/GB/month | Per GB stored |
| B2 egress (to Cloudflare) | Free | Bandwidth Alliance partner |
| B2 egress (to internet) | $0.01/GB | Non-Cloudflare destinations |
| Cloudflare CDN | Free (included with any plan) | Free plan includes CDN |
| B2 downloads | Free (first 2,500/day) | Then $0.004/10K |
| Cloudflare Workers (optional) | $0.30/M requests | Image resizing, etc. |
Total cost at 10TB stored, 50TB delivered/month (via Cloudflare):
- Storage: 10TB x $0.006 x 1,024 = $61
- Egress to Cloudflare: $0 (Bandwidth Alliance)
- Cloudflare CDN: $0 (free tier)
- Total: ~$61/month
This is 98.6% cheaper than S3 + CloudFront ($4,372 vs $61). No, that is not a typo.
Strengths: Cheapest total cost for static media delivery. Free egress to Cloudflare (Bandwidth Alliance). Simple, predictable pricing. Decent S3-compatible API.
Weaknesses: No built-in transformations (requires external processing). Cloudflare free plan has limits on cache control. Less performant than premium CDNs for dynamic content. B2 does not support all S3 API features. Limited regions (US/EU only for primary storage).
Best for: Media archives, podcast hosting, large file distribution, backup/restore scenarios, and any workload where media is written once and served many times without transformation.
For more on B2 pricing, see our Backblaze B2 pricing guide 2026.
Cost Comparison Matrix: 10TB Stored, 50TB Delivered Monthly
| Platform | Storage Cost | Delivery Cost | Transform Cost | Total/Month |
|---|---|---|---|---|
| Backblaze B2 + Cloudflare | $61 | $0 | $0 | $61 |
| Cloudflare R2 | $154 | $0 | $0 | $190 |
| Bunny CDN + Storage | $102 | $512 | $10 | $624 |
| imgix (+ R2 storage) | $154 | $819 | Varies | $973+ |
| S3 + CloudFront | $236 | $4,096 | $0 | $4,372 |
| Cloudinary (Enterprise) | Included | Included | Included | ~$4,000-5,000 |
| Mux (video only) | $42 | $4,200 | Included | $4,242 |
The difference between cheapest (B2 + Cloudflare at $61) and most expensive (S3 + CloudFront at $4,372) is 71x. That is not a small optimization. That is a fundamental architecture decision.
Decision Framework: Which Platform for Which Media Type
Static Images (No Processing Needed)
Websites serving pre-optimized images (already resized, already in WebP/AVIF format):
- Cheapest: Backblaze B2 + Cloudflare ($0.006/GB stored, free delivery)
- Best balance: Cloudflare R2 ($0.015/GB stored, free delivery, S3 API)
- Avoid: Cloudinary, imgix (paying for transformation capability you do not use)
Dynamic Images (Resize, Crop, Format Conversion)
E-commerce, user-generated content, responsive images:
- High volume (1M+ transforms): imgix ($0.0008/transform) + R2/S3 storage
- Moderate volume (<500K transforms): Cloudinary (convenient all-in-one)
- Budget option: Bunny Optimizer ($9.50/month flat) + Bunny Storage
- DIY option: R2 + Cloudflare Workers (custom, requires development)
Video Streaming (Adaptive Bitrate)
Platforms with video content requiring HLS/DASH delivery:
- Developer-friendly: Mux ($0.007/min delivered, zero infra)
- Budget streaming: Bunny Stream ($0.005/min delivered)
- DIY (cheapest): S3 + MediaConvert + CloudFront (complex but 3-4x cheaper than Mux)
- Avoid: Storing raw video on R2 and hoping browsers handle it (they will not)
Mixed Media (Images + Video + Downloads)
SaaS platforms with various asset types:
- Best overall value: Cloudflare R2 (storage) + Workers (image transforms) + external video
- Simple setup: Bunny CDN + Storage + Optimizer + Stream
- Enterprise: S3 + CloudFront + MediaConvert + Lambda@Edge (most control, most cost)
Migration Strategies: Moving From S3 + CloudFront
If you are currently on S3 + CloudFront and want to reduce costs, here are the migration paths ordered by effort:
Low Effort: Add Cloudflare CDN in Front of CloudFront
Put a Cloudflare proxy in front of your CloudFront distribution. Cloudflare caches at their edge (300+ PoPs) and reduces CloudFront egress. Does not require moving data.
Savings: 20-40% on delivery (Cloudflare absorbs cache hits) Effort: DNS change + Cloudflare setup (1-2 hours)
Medium Effort: Move Storage to R2, Keep CloudFront
Migrate static assets from S3 to R2. Set CloudFront to use R2 as origin. Eliminates S3 costs but keeps CloudFront delivery.
Savings: 35% on storage ($0.015 vs $0.023/GB) Effort: Data migration + origin config change (1-2 days)
High Effort: Full Migration to R2 + Cloudflare CDN
Move everything to R2. Use Cloudflare's CDN (included free) instead of CloudFront. Eliminate both S3 and CloudFront.
Savings: 80-95% total cost reduction Effort: Data migration + CDN reconfiguration + testing (1-2 weeks) Risk: Losing CloudFront-specific features (Lambda@Edge, signed URLs, real-time logs)
Migration Calculator: S3+CloudFront to R2
Everyone knows R2 is cheaper. The question teams actually ask: "What does it cost to get there, and how fast do we break even?" Here is the full math including the one-time migration cost that most comparisons ignore.
The Hidden Migration Cost: S3 Egress
AWS charges you $0.09/GB to move your own data out of S3. This is the "exit fee" that makes AWS sticky. But at the savings R2 delivers, this cost pays for itself in days, not months.
Full Migration Cost Model: 10TB Workload
One-time migration costs:
| Component | Calculation | Cost |
|---|---|---|
| S3 egress (10TB out) | 10,240 GB x $0.09/GB | $921.60 |
| S3 GET requests (10M objects) | 10M x $0.0004/1K | $4.00 |
| R2 PUT requests (10M objects) | 10M x $4.50/M | $45.00 |
| Engineering time (est. 20 hours) | Internal cost | $0 (sunk) |
| Total one-time cost | $970.60 |
Monthly cost comparison (post-migration):
| Line Item | S3 + CloudFront (before) | R2 (after) | Monthly Savings |
|---|---|---|---|
| Storage (10TB) | $236 | $154 | $82 |
| Delivery (50TB egress) | $4,096 | $0 | $4,096 |
| API operations | $40 | $36 | $4 |
| Total | $4,372 | $190 | $4,182 |
Break-even calculation:
- One-time migration cost: $970.60
- Monthly savings: $4,182
- Break-even: 5.6 days
You read that right. The migration pays for itself in under a week. After that, you save $4,182 every single month -- $50,184 per year.
Migration Timeline by Data Volume
| Data Volume | S3 Egress Cost | Migration Time* | Monthly Savings | Break-Even |
|---|---|---|---|---|
| 1TB | $92 | 2-4 hours | $418 | 5.3 days |
| 5TB | $461 | 8-12 hours | $2,091 | 5.3 days |
| 10TB | $922 | 1-2 days | $4,182 | 5.3 days |
| 25TB | $2,304 | 3-5 days | $10,455 | 5.3 days |
| 50TB | $4,608 | 5-10 days | $20,910 | 5.3 days |
| 100TB | $9,216 | 10-20 days | $41,820 | 5.3 days |
*Migration time assumes 1Gbps sustained transfer using rclone with 32 parallel transfers.
Notice the pattern: break-even is consistently ~5 days regardless of data volume, because both the migration cost and the savings scale linearly with volume.
Step-by-Step Migration Process
Phase 1: Parallel Write (Day 1-2)
- Configure your application to write new objects to both S3 and R2 simultaneously
- This ensures no data loss during migration and allows instant rollback
- R2 cost during dual-write: negligible ($4.50/M PUTs)
Phase 2: Bulk Copy (Day 2-7)
- Use
rclone syncfrom S3 to R2 with parallel transfers:rclone sync s3:my-bucket r2:my-bucket --transfers 32 --checkers 64 --s3-chunk-size 64M - Monitor progress:
rclone check s3:my-bucket r2:my-bucket - S3 egress will spike (this is the one-time cost)
Phase 3: Switch Reads (Day 7-8)
- Update CDN origin from S3/CloudFront to R2
- If using custom domain: update Cloudflare CNAME to R2 bucket
- Monitor error rates -- roll back if any 4xx/5xx spike
Phase 4: Stop S3 Writes + Decommission (Day 14-30)
- After 7 days of clean R2-only reads, stop dual-writes
- Keep S3 bucket for 30 days as safety net (cost: $236/month for 10TB)
- Delete S3 data after confirming all objects served correctly from R2
- Remove CloudFront distribution
Phase 5: Verify Savings (Day 30+)
- Compare AWS bill vs Cloudflare bill
- Expected: AWS drops by 95%+ (only residual costs from Phase 4 retention)
- Ongoing monthly cost: ~$190 vs previous ~$4,372
What Can Go Wrong (And Fixes)
| Risk | Likelihood | Mitigation |
|---|---|---|
| S3 features used that R2 lacks (versioning, lifecycle) | Medium | Audit S3 configuration before migration; replicate needed features with Workers |
| Lambda triggers on S3 uploads break | High if used | Rewrite as R2 event notifications + Workers |
| Signed URL format differences | Medium | R2 supports S3-compatible presigned URLs; test your SDK |
| Cache invalidation during cutover | Low | Use cache-busting version strings or purge Cloudflare cache |
| Replication/durability concerns | Low | R2 replicates across multiple facilities; add B2 backup if needed |
Platform Selection Matrix by Use Case
Knowing which platform wins for YOUR specific use case saves weeks of research. Here are the 6 most common media workloads with the optimal platform and real monthly costs at 10TB scale.
Use Case 1: User Uploads (SaaS File Storage)
Pattern: Users upload documents, images, and files. Files are downloaded by the same user or shared with collaborators. Write-heavy with moderate reads.
| Platform | Monthly Cost (10TB stored, 5TB delivered) | Why |
|---|---|---|
| Cloudflare R2 | $154 storage + $0 egress + $18 ops = $172 | Zero egress, S3-compatible API, Workers for processing |
| AWS S3 + CloudFront | $236 + $425 + $5 = $666 | Only if you need Lambda triggers on upload |
| Backblaze B2 + CF | $61 + $0 + $3 = $64 | Cheapest, but fewer regions and no compute integration |
| Bunny CDN + Storage | $102 + $51 = $153 | Good, but proprietary API (not S3-compatible) |
Winner: Cloudflare R2 -- best balance of cost, compatibility, and ecosystem (Workers for thumbnails, virus scanning, etc.)
Use Case 2: Video Streaming Platform
Pattern: Content creators upload video. Viewers stream at various quality levels. Requires transcoding, adaptive bitrate, and analytics.
| Platform | Monthly Cost (1,000 hours stored, 50K hours delivered) | Why |
|---|---|---|
| Mux | $420 storage + $21,000 delivery = $21,420 | Full platform, zero infra work, but expensive at scale |
| Bunny Stream | $250 storage + $15,000 delivery = $15,250 | Cheaper, includes adaptive bitrate |
| S3 + MediaConvert + CF | $12 + $144 encoding + $4,096 CDN = $4,252 | Cheapest but requires building entire pipeline |
| R2 + Workers + HLS.js | $154 + $0 egress + encoding cost = ~$500 | Cheapest delivery, but you build everything |
Winner: S3 + MediaConvert + CloudFront for cost-conscious teams with engineering capacity. Mux for teams that value dev time over infrastructure cost.
Use Case 3: Image CDN (E-commerce, Media)
Pattern: Millions of product/editorial images served in multiple sizes. Needs resize, format conversion, and global low-latency delivery.
| Platform | Monthly Cost (10TB images, 50TB delivery, 10M transforms) | Why |
|---|---|---|
| R2 + Workers (image resize) | $154 + $0 + $3 Workers = $157 | Cheapest by far, requires building transform Worker |
| Cloudflare Images | $50 storage + $500 delivery = $550 | Managed, simple, no dev work |
| imgix + R2 storage | $154 + $8,000 transforms + $4,096 bandwidth = $12,250 | Best quality transforms, expensive at scale |
| Cloudinary Enterprise | Custom, typically $4,000-8,000 | All-in-one, most features, most expensive |
Winner: R2 + Workers if you have engineering capacity. Cloudflare Images for managed simplicity. Avoid imgix/Cloudinary at this scale unless you need specific AI features.
Use Case 4: Backup and Disaster Recovery
Pattern: Large datasets backed up daily/weekly. Rarely accessed. 90+ day retention. Restores are emergency-only.
| Platform | Monthly Cost (10TB stored, 100GB monthly test restore) | Why |
|---|---|---|
| Backblaze B2 | $61 + $0 (via CF) = $61 | Cheapest, works with Veeam/rclone natively |
| Wasabi | $69.90 + $0 = $69.90 | Close second, zero API costs, 90-day minimum aligns with backup retention |
| AWS S3 Glacier IR | $40 + $1 retrieval = $41 | Cheapest if restores are truly rare (retrieval fees add up) |
| Cloudflare R2 | $154 + $0 = $154 | Overkill -- paying for egress benefit you do not use |
Winner: Backblaze B2 for general backup. S3 Glacier IR if restores are once-a-year events and you are already on AWS.
Use Case 5: ML Training Data Storage
Pattern: Large datasets (images, text, audio) stored centrally. Multiple training jobs read entire datasets repeatedly. Very high egress-to-storage ratio.
| Platform | Monthly Cost (10TB stored, 100TB read during training) | Why |
|---|---|---|
| Cloudflare R2 | $154 + $0 egress + $36 ops = $190 | Zero egress is critical when reading 10x your storage |
| AWS S3 (same region as compute) | $236 + $0 (same-region) = $236 | Free if compute is in same region; otherwise $9,000+ |
| Backblaze B2 + CF | $61 + $0 = $61 | Cheapest, but latency from B2 to GPU cluster may be problematic |
| AWS S3 Express One Zone | $160 + $0 (same AZ) = $160 | Fastest (single-digit ms), but data tied to one AZ |
Winner: AWS S3 in same region if your GPU cluster is on AWS (free intra-region transfer). Cloudflare R2 if compute is multi-cloud or on Cloudflare Workers AI. Avoid cross-region S3 egress at all costs.
Use Case 6: Static Site Assets (Marketing, Docs)
Pattern: Pre-built static site with images, CSS, JS, fonts. Moderate traffic, assets rarely change. Performance and global latency matter.
| Platform | Monthly Cost (50GB stored, 5TB delivered) | Why |
|---|---|---|
| Cloudflare R2 + Pages | $0.77 + $0 + $0 = $0.77 | R2 free tier (10GB) + Pages for hosting; practically free |
| Bunny CDN + Storage | $0.26 + $51 = $51.26 | Budget CDN, good performance |
| AWS S3 + CloudFront | $1.15 + $425 = $426 | Wildly overpriced for this use case |
| Netlify/Vercel (built-in CDN) | $0 (free tier) to $20/mo | Simplest, included with hosting platform |
Winner: Cloudflare R2 + Pages for near-zero cost with excellent performance. Or simply use your hosting platform's built-in CDN (Netlify, Vercel, Cloudflare Pages) if assets are bundled with the site.
Summary Matrix
| Use Case | Best Platform | Monthly Cost (10TB) | Runner-Up | Avoid |
|---|---|---|---|---|
| User uploads (SaaS) | Cloudflare R2 | $172 | B2 + CF ($64) | S3+CF ($666) |
| Video streaming | S3 + MediaConvert + CF | $4,252 | Bunny Stream | Mux at scale ($21K+) |
| Image CDN | R2 + Workers | $157 | CF Images ($550) | Cloudinary ($4K+) |
| Backup/DR | Backblaze B2 | $61 | Wasabi ($70) | R2 ($154, overkill) |
| ML training data | S3 same-region or R2 | $190-236 | B2 ($61, if latency OK) | S3 cross-region ($9K+) |
| Static site assets | R2 + Pages | <$1 | Bundled CDN ($0-20) | S3+CF ($426, absurd) |
The Bottom Line
Media storage and delivery is the area where we see the largest cost reduction potential in a single architecture change. Switching from S3 + CloudFront to R2 or B2 + Cloudflare CDN can cut media infrastructure costs by 80-95% with minimal functionality trade-off for static assets.
The key insight: optimize delivery first, storage second. A 50% storage reduction saves pennies per GB. Eliminating egress fees saves dollars per GB. At 50TB monthly delivery, the difference between $0.085/GB (CloudFront) and $0 (R2) is $4,000+ per month.
If your media infrastructure costs are growing faster than your user base, our team at LeanOps specializes in media delivery cost optimization. We have migrated several clients from S3+CloudFront to R2-based architectures and typically cut media costs by 70-90% within 30 days. Get a free Cloud Waste Assessment to see how much you could save.
Further reading:



