The True Cost of Self-Hosting File Storage in 2026
A realistic cost breakdown of self-hosting file storage with AWS, GCS, and Backblaze vs. using a managed service — including the hidden costs nobody budgets for.
The Question Every Developer Asks
At some point, every developer building a SaaS product asks the same question: should I roll my own file storage infrastructure, or pay someone else to handle it?
The math seems simple. S3 storage is $0.023 per GB. A CDN costs a few cents per gigabyte of transfer. How expensive could it be?
The answer depends on what you count. If you only look at the cloud provider invoice, self-hosting looks cheap. But if you include the engineering time to set it up, maintain it, and fix it when it breaks at 2 AM on a Saturday — the numbers change significantly.
This post walks through a realistic scenario with real pricing, including the costs that don't show up on your AWS bill. Whether you end up self-hosting or using a managed file storage service, you'll have the full picture.
The Scenario: A Typical SaaS Workload
Let's define a workload that's common for a growing SaaS application:
- 500 GB stored — user uploads, documents, images, assets
- 1 TB egress per month — files served to end users via CDN
- 10 million HTTP requests per month — a mix of GETs, PUTs, and LISTs
- Global audience — users in North America, Europe, and Asia-Pacific
- Mix of public and private files — some assets are public, some require signed URLs
This isn't a toy example. It's roughly what a B2B SaaS with a few thousand active users looks like once they're past the early stage. Not massive, not trivial — just normal.
Now let's price it out across four options.
Option 1: AWS S3 + CloudFront
AWS is the default choice for most teams. Here's the monthly bill:
- S3 storage: 500 GB x $0.023/GB = $11.50
- S3 requests: ~2M PUT/POST + ~8M GET requests = ~$10.00 + ~$3.20 = $13.20
- CloudFront data transfer (first 10 TB): 1,000 GB x $0.085/GB = $85.00
- CloudFront requests: 10M HTTPS requests x $0.01/10K = $10.00
Monthly total: ~$120/month (about $1,440/year)
This doesn't include Route 53 for DNS ($0.50/zone + query charges), ACM certificate management (free but requires configuration), or CloudWatch monitoring if you want visibility into error rates and latency.
AWS gives you the deepest feature set: storage classes, lifecycle policies, S3 event triggers, Lambda@Edge. If you're already in the AWS ecosystem, the marginal complexity is manageable. But if this is your first time wiring S3 to CloudFront, expect 2-4 hours of setup — more if you need signed URLs, CORS, and custom domains.
Option 2: Google Cloud Storage + Cloud CDN
Google Cloud's equivalent stack:
- Cloud Storage (Standard): 500 GB x $0.020/GB = $10.00
- Cloud Storage operations: ~2M Class A + ~8M Class B = ~$10.00 + ~$3.20 = $13.20
- Cloud CDN egress (North America): 1,000 GB x $0.08/GB = $80.00
- Cloud CDN requests: 10M HTTP requests x $0.0075/10K = $7.50
Monthly total: ~$111/month (about $1,330/year)
GCS pricing is marginally cheaper than AWS in some categories. Cloud CDN requires a load balancer ($18/month base) which adds to the cost, bringing the real total closer to $129/month. The setup process involves configuring a backend bucket, setting up a URL map, and provisioning a managed SSL certificate — comparable in complexity to CloudFront.
Option 3: Backblaze B2 + Bunny CDN
The budget-friendly combo that's popular in indie hacker circles:
- B2 storage: 500 GB x $0.006/GB = $3.00
- B2 egress: Free to Bunny CDN via Bandwidth Alliance (egress to Bunny CDN's pull zone is free)
- B2 API calls: ~8M Class B (reads) at $0.004/10K + ~2M Class A (uploads, free) = $3.20
- Bunny CDN (Volume tier): 1,000 GB x $0.01/GB (avg across regions) = $10.00
- Bunny CDN requests: Included in bandwidth pricing
Monthly total: ~$16/month (about $192/year)
This is dramatically cheaper on paper. The Backblaze + Bunny CDN combination, leveraging the Bandwidth Alliance for free egress between them, is hard to beat on raw cost. Trade-offs: B2 provides an S3-compatible API endpoint, but the tooling ecosystem and documentation are less mature than AWS. Bunny CDN has fewer edge locations than CloudFront. For a deeper comparison, see how Backblaze B2 stacks up as a storage backend.
Option 4: files.link (Managed Service)
With a managed service like files.link, you don't assemble the stack — storage, CDN, signed URLs, and an API are bundled:
- Storage + CDN + API: Prepaid credits cover storage, egress, and requests in a single balance
- Estimated monthly cost for this workload: ~$50-80/month depending on usage patterns
Monthly total: ~$50-80/month (about $600-960/year)
The pricing sits between the budget option (B2 + Bunny) and the hyperscalers (AWS, GCS). What you're paying for is the absence of setup and maintenance — no IAM policies, no CDN configuration, no cert rotation, no monitoring dashboards to build. The service runs on CloudFront's 450+ edge network, so delivery performance is equivalent to the AWS option. If you're evaluating this alongside image-heavy services, see how it compares to Cloudinary or read the CDN file hosting overview.
Cloud Provider Cost Comparison
| AWS S3 + CloudFront | GCS + Cloud CDN | B2 + Bunny CDN | files.link | |
|---|---|---|---|---|
| Storage (500 GB) | $11.50 | $10.00 | $3.00 | Included |
| Egress (1 TB) | $85.00 | $80.00 | $10.00 | Included |
| Requests (10M) | $23.20 | $20.70 | $3.20 | Included |
| Other (LB, DNS, etc.) | ~$1-5 | ~$18 | $0 | $0 |
| Monthly total | ~$120 | ~$129 | ~$16 | ~$50-80 |
| Annual total | ~$1,440 | ~$1,548 | ~$192 | ~$600-960 |
| Setup time | 2-4 hours | 2-4 hours | 1-2 hours | 3 minutes |
| Surprise bills possible | Yes | Yes | Unlikely | No (prepaid) |
The Hidden Costs Nobody Budgets For
The table above is what everyone focuses on. But the cloud provider invoice is often the smallest line item. Here's what actually costs you money:
Initial setup: 4-16 hours of engineering time
Even the simplest S3 + CloudFront setup takes a competent developer 2-4 hours. Add signed URLs, CORS configuration for browser uploads, custom domains with SSL, and monitoring — you're looking at 8-16 hours for a production-ready setup. At $75-100/hr (a reasonable fully-loaded rate for a mid-level engineer), that's $600-$1,600 before you serve a single file.
Ongoing maintenance: 2-5 hours per month
Infrastructure doesn't just run itself. Someone needs to:
- Monitor error rates and latency
- Rotate credentials and update IAM policies
- Debug CORS issues when a new client framework changes preflight behavior
- Investigate why CloudFront is serving stale content after a cache invalidation
- Review and optimize cost allocation as usage patterns shift
At 2-5 hours per month, that's $150-$500/month in engineering time — often more than the cloud provider bill itself.
Incident response: unpredictable but inevitable
S3 has 99.99% availability. That sounds great until you do the math: 99.99% uptime allows for about 4.3 minutes of downtime per month. When it happens — and it will — someone needs to diagnose whether the issue is S3, CloudFront, DNS, your application code, or a combination. A single incident can consume 2-8 hours of senior engineering time.
Budget at least $200-$800/month averaged across incidents, SSL emergencies, and the occasional "why are our images broken in Safari" debugging session.
Opportunity cost: the features you didn't ship
This is the hardest cost to quantify but often the most significant. Every hour your team spends on file storage infrastructure is an hour not spent building the features that differentiate your product. For an early-stage company with 1-3 engineers, dedicating 10-20% of engineering bandwidth to infrastructure maintenance is a real drag on velocity.
The Full Picture
When you add engineering costs to cloud provider bills, the comparison shifts:
For self-hosted solutions (using AWS as the example):
- Cloud costs: $120/month
- Initial setup (amortized over 12 months): $50-133/month
- Ongoing maintenance: $150-500/month
- Incident response (averaged): $200-800/month
- Realistic total: $520-1,553/month
For a managed service like files.link:
- Service cost: $50-80/month
- Setup time: Negligible
- Maintenance: Zero
- Incident response: Provider's problem
- Realistic total: $50-80/month
The cheapest cloud option (B2 + Bunny at $16/month) still carries the same engineering overhead, bringing its realistic total to $366-1,449/month.
The cloud provider invoice is a rounding error compared to engineering time.
When Self-Hosting Makes Sense
Self-hosting is the right call in several scenarios — and it's important to be honest about this:
You're operating at massive scale. If you're storing petabytes and serving hundreds of terabytes per month, the per-GB savings of direct cloud access add up to real money — enough to justify a dedicated infrastructure engineer.
You already have a DevOps team. If you have engineers whose job is managing infrastructure, the marginal cost of adding file storage to their portfolio is low. The setup and maintenance hours are already budgeted.
Compliance requires it. Some industries (healthcare, finance, government) have data residency or sovereignty requirements that limit which services you can use. Running your own S3 buckets in specific regions with specific encryption configurations may be non-negotiable.
You need deep AWS/GCP integration. If your architecture depends on S3 event triggers, Lambda@Edge transformations, or GCS's integration with BigQuery — a managed file service can't replace those capabilities.
You want full control over caching behavior. Custom cache keys, Lambda@Edge functions for request/response manipulation, A/B testing at the CDN layer — these require direct CDN access.
When a Managed Service Saves You Money
A managed service is the better choice when:
Your team is small. If you have fewer than 5 engineers, every hour spent on infrastructure is an hour stolen from product development. The math strongly favors paying more per GB to reclaim that time.
File storage isn't your core product. You're building a project management tool, a CMS, a SaaS dashboard — not a storage platform. Infrastructure should be invisible.
You want predictable costs. Prepaid credit models eliminate the risk of surprise bills from traffic spikes. You know what you'll spend before you spend it.
You're moving fast. Early-stage companies and MVPs need to validate ideas, not configure IAM policies. A developer-friendly file storage API gets you from zero to serving files in minutes, not hours.
You don't want to be on-call for storage. When CloudFront returns 503s at midnight, that's your problem. With a managed service, it's theirs.
The Decision Framework
Here's a simple framework for choosing:
Choose self-hosted if:
- Your monthly cloud storage bill exceeds $5,000
- You have at least one dedicated infrastructure/DevOps engineer
- You need cloud-specific features (Lambda triggers, BigQuery integration, etc.)
- Compliance requires direct control over storage infrastructure
Choose a managed service if:
- Your team has fewer than 5 engineers
- You're spending less than $500/month on file storage infrastructure
- You'd rather ship features than configure CDN cache behaviors
- Predictable billing matters more than per-GB optimization
The hybrid approach: Some teams self-host their primary storage for large assets while using a managed service for user-facing uploads that need a simple API and fast CDN delivery. This gives you the cost efficiency of direct S3 access for bulk storage and the developer experience of a managed service for the use cases that touch your application code.
Whatever you choose, make the decision with full cost visibility — not just the cloud provider line item, but the engineering hours that come with it. The cheapest option on paper is rarely the cheapest option in practice.