AWS S3 is the default answer to "where should I put my files." It works, it scales to any size, and you never think about it until the bill arrives. At 5TB of storage plus serious data transfer out, that bill can hit $200-400/month — and it only grows from there.
MinIO is the self-hosted alternative that speaks S3 fluently. Same API, same SDKs, same tools. But instead of paying Amazon, you run it on your own hardware or a VPS. Free software, your infrastructure, your bill.
This comparison walks through when that trade-off is worth it — and when it is not.
What AWS S3 Actually Is
S3 (Simple Storage Service) launched in 2006 and became the template for how object storage works. Virtually every cloud app knows the S3 API. It handles durability (11 nines — 99.999999999%), availability, geographic replication, lifecycle policies, access control, versioning, event notifications, and integrations with the rest of AWS. The pricing model is pay-per-use: you pay for what you store, what you transfer, and what you request.
AWS S3 Standard pricing (us-east-1):
- ▸Storage: $0.023/GB/month (first 50TB), ~$23.55/TB/month
- ▸Data transfer OUT to internet: $0.09/GB (first 10TB), $0.085/GB (next 40TB)
- ▸PUT/POST/LIST requests: $0.005 per 1,000
- ▸GET requests: $0.0004 per 1,000
- ▸Cross-region replication: $0.02/GB transferred
There is a free tier (5GB storage, 20,000 GET requests, 2,000 PUT requests) for the first 12 months.
The math gets uncomfortable at scale. 10TB stored is $235/month in storage fees alone. Add 5TB/month outbound transfer and you are at $685/month — before CloudFront, Glacier transitions, or intelligent tiering complexity.
What MinIO Actually Is
MinIO is an open-source object storage server written in Go. It implements the S3 API thoroughly enough that the AWS SDK points at it with a URL change, no code modifications needed. Released in 2014, it has around 50,000 GitHub stars and is widely used for on-premises and Kubernetes deployments.
Key technical facts:
- ▸Runs as a single binary
- ▸Distributed mode across multiple nodes with erasure coding
- ▸Encryption at rest and in transit
- ▸Bucket versioning, lifecycle policies, event notifications
- ▸Kubernetes-native (Operator available)
- ▸AGPLv3 license since 2021 (was Apache 2.0)
- ▸Performance: can saturate 25GbE on commodity hardware
MinIO pricing:
- ▸Community: Free, AGPLv3 license
- ▸SUBNET Standard: ~$10,000/year flat, unlimited capacity, 24/7 support, diagnostic tooling
- ▸SUBNET Enterprise: ~$20,000/year, adds panic button response, architecture review
For internal infrastructure that you do not distribute to end-users, the AGPL license is typically not a problem. The commercial license requirement kicks in when you embed MinIO in a product you sell.
Software cost for most self-hosters: $0.
The Real Costs Side by Side
S3 costs are variable. MinIO costs are mostly fixed. That difference is why the break-even analysis matters.
AWS S3 monthly cost examples:
| Storage | Transfer Out | Monthly Bill |
|---|---|---|
| 100GB | 50GB | ~$7 |
| 1TB | 200GB | ~$42 |
| 5TB | 1TB | ~$208 |
| 10TB | 5TB | ~$685 |
| 50TB | 10TB | ~$2,075 |
Transfer out costs dominate at scale. A media company serving video directly from S3 can hit $5,000+/month before touching storage fees.
MinIO monthly cost examples (self-hosted):
| Setup | Storage Capacity | Monthly Cost |
|---|---|---|
| Hetzner VPS + 2TB volume | ~1.8TB usable | ~$30 |
| Hetzner AX41 dedicated | 4TB RAID | ~$55 |
| OVH dedicated server | 16TB usable | ~$120 |
| 3-node cluster | 30TB+ with EC | ~$300 |
Bandwidth on dedicated server plans is usually included (unmetered or 20TB+/month), a major factor when S3 egress costs are exactly what you are trying to escape.
Break-even analysis:
At 100GB with light transfer, S3 wins. The $7/month bill is hard to beat against any self-hosted option.
At 1-2TB, it depends on your transfer patterns. Storage alone is $23-47/month, which a cheap VPS can match, but factor in your time and a $30/month server and the gap narrows considerably.
At 5TB+, MinIO typically wins on cost. The $208+/month S3 bill exceeds most reasonable self-hosted setups.
At 10TB, the gap is significant: S3 at $235/month storage-only vs MinIO at $55-80/month all-in.
At 50TB+, the math is not close. AWS S3 is $1,150/month in storage fees alone.
Feature Comparison
S3 API Compatibility
MinIO's S3 API compatibility is thorough. AWS SDKs work with an endpoint URL swap. The AWS CLI works. Terraform's AWS provider works. Most tools that speak S3. Restic, Rclone, Velero, Loki, Thanos, the MinIO Client (mc), work against MinIO without modification.
Edge cases exist: some AWS-specific features (S3 Object Lambda, S3 Select, notification targets like SNS/SQS, Glacier storage classes) have no MinIO equivalent. For the core API. PUT, GET, DELETE, multipart upload, presigned URLs, bucket operations, compatibility is reliable.
Durability and Redundancy
AWS S3 Standard: 11 nines durability (99.999999999%). Objects stored across at least 3 availability zones. Zero configuration required.
MinIO: durability depends on your setup. Single-node MinIO is as durable as your underlying disk, no more, no less. Distributed MinIO with erasure coding (minimum 4 drives) can survive losing half the drives in a set without data loss. A proper 3-node cluster with EC:4 is genuinely durable, but you have to build and maintain it.
Single-node MinIO for critical data without external backups is a risk. MinIO as a backup target, with replication to a second location, is a common and safe pattern.
Performance
MinIO is faster than S3 for on-premises workloads. S3 has throttling, network latency, and per-prefix rate limits. MinIO on local hardware can saturate your NIC. For ML training pipelines reading large files from local storage, MinIO is noticeably faster than pulling from S3.
For serving files to end users on the internet, S3 with CloudFront wins. AWS has global edge presence that a self-hosted MinIO server does not.
Operations Overhead
S3: zero. No servers to patch, no capacity to plan, no disks to replace. This is a real cost that is easy to undercount when doing break-even math.
MinIO: some. Single-node on a managed VPS is low maintenance. Distributed clusters require more: hardware management, capacity planning, upgrade testing, monitoring, backup verification. Estimate 1-4 hours/month for a small setup, more for production clusters with SLA requirements.
Access Control
S3: IAM policies, bucket policies, ACLs, Object Lock, VPC endpoints, KMS integration. Mature and well-documented, integrated with the rest of AWS.
MinIO: IAM-compatible API, TLS, encryption at rest. For S3 API clients, the access key/secret key model works identically. There is no native AWS KMS integration unless you bring your own KMS. For teams already deep in AWS, S3's IAM integration is cleaner.
Migration: Moving from S3 to MinIO
If you have existing S3 data and want to migrate, the process is straightforward:
- Deploy MinIO, single binary, Docker, or Kubernetes Operator
- Mirror with MinIO Client.
mc mirror s3/mybucket myminio/mybucket - Update your S3 endpoint, one config change in most AWS SDK clients
- Verify, run both in parallel, compare checksums with
mc diff - Cut over, update config, stop mirroring
Rclone is an alternative for the migration step: rclone sync s3:mybucket minio:mybucket. Both tools handle large datasets and support resuming interrupted transfers.
The AGPL License Question
MinIO's move from Apache 2.0 to AGPL v3 in 2021 caused real friction. The practical breakdown:
- ▸Running MinIO for your own internal infrastructure (backups, ML data, app storage): AGPL is fine
- ▸Building a product you distribute that embeds MinIO: you must open-source under AGPL or buy a commercial license
For the typical break-even scenario, a company with 10TB of internal data looking to cut S3 costs. AGPL is a non-issue. For a SaaS product wanting to offer MinIO-backed storage to customers, contact MinIO's commercial team.
The 2021 license change surprised existing commercial users who were counting on Apache 2.0 permissiveness. Worth checking your use case against the AGPL terms before committing.
Who Should Use What
Use AWS S3 when:
- ▸You are under 1-2TB with light transfer
- ▸You need maximum durability with zero operational work
- ▸You are tightly integrated with other AWS services (EC2, Lambda, CloudFront, Athena)
- ▸Your team has no sysadmin capacity
- ▸You need compliance certifications MinIO cannot provide out of the box (HIPAA BAA, SOC 2 Type II as a managed service)
- ▸You are building a product that embeds storage and cannot take on self-hosting risk
Use MinIO when:
- ▸You are over 5TB and the S3 bill has your attention
- ▸You want S3-compatible storage inside your own network for compliance reasons
- ▸You are running ML pipelines and need faster local access to training data
- ▸You already have dedicated servers with spare disk capacity
- ▸You want to reduce AWS vendor lock-in for internal workloads
The hybrid approach that works well: Use S3 for public assets, user-facing data, and anything benefiting from CloudFront. Use MinIO for internal workloads, backups, ML training data, build artifacts, log archives, where data stays inside your network and egress fees would otherwise compound.
Bottom Line
AWS S3 is the right answer for small storage needs, teams without ops capacity, or workloads needing tight AWS service integration. Pay-per-use with zero administration is genuinely valuable.
MinIO earns its place at 5TB+, particularly when you have a server already or need storage within your own network. The S3 API compatibility is thorough enough that migration is low-risk. The operational burden for a simple deployment is modest.
The cost math at 10TB with meaningful transfer is stark: AWS S3 runs $400-700/month in many workloads; MinIO on an $80/month dedicated server runs $80/month. Three months of savings covers a year of server costs with room left over.
Do the break-even math for your specific storage volume, transfer patterns, and ops capacity. For internal infrastructure at meaningful scale, the numbers usually favor MinIO.