Tigris myths vs facts for storage teams choosing MinIO or AWS S3
Tigris offers 5.3x faster performance than S3 for small object reads and eliminates the $0.09 per GB egress tax. While providing high throughput for multi-cloud workloads, users face challenges with replication lag and eventual consistency for cross-region reads.
Egress taxes and small object speed
I see storage teams ditching Amazon S3 because they hate the $0.09 per GB egress tax that hits after the first 100 GB. If you store 1 TB and serve 5 TB monthly, S3 costs $473 while Tigris costs $30. This price gap exists because Tigris eliminates the egress fees that AWS charges when data leaves their building. While Cloudflare R2 and Backblaze B2 provide lower storage prices, Tigris targets multi-cloud workloads by replicating objects automatically to where they are accessed. Tigris delivers 5.3x faster performance than S3 for small object reads and 20x the throughput of Cloudflare R2. In multi-cloud environments using platforms like CoreWeave or Lambda Labs, Tigris provides 4x the throughput of S3.
MinIO often outperforms S3 in local Kubernetes environments, especially when scaling up to 64 threads. In ClickHouse benchmarks, MinIO consistently outperformed native S3 across all queries. AWS S3 maintains 31 geographic regions and 99 availability zones, providing massive scale. However, Tigris operates with data centers in Virginia, Chicago, and San Jose, with deployments in London, Frankfurt, and Singapore coming online. While AWS S3 scales with multiple prefixes, Tigris manages routing through a single endpoint, t3.storage.dev.
| Metric | Tigris | AWS S3 | Cloudflare R2 | Backblaze B2 |
|---|---|---|---|---|
| Storage Price (per GB) | $0.02 | $0.023 | Lower than $0.02 | $0.007 |
| Egress Fee (per GB) | $0.00 | $0.09 | $0.00 | Varies |
| Max Object Size | 5 TB | Not specified | Not specified | Not specified |
The reality of replication lag and errors
The replication lag creates significant problems for file-heavy services. One team reported that uploaded files remained missing for up to 4 hours after request. They even had to migrate their entire production infrastructure to a different geographic location to mitigate these delays. These issues caused a flood of customer support tickets during critical periods. This level of lag constitutes a SEV1 issue for many applications.
A developer using Fly.io reported that the shadow bucket feature unexpectedly duplicated all stored data into Tigris, which caused massive egress fees and a high S3 bill. Tigris also returned 500 Internal Error and invalid argument errors during sequential uploads. A fault-injection test by Antithesis discovered a cache-coherence bug where a deleted object came back from an edge cache. I find these operational quirks hard to ignore when planning production workloads.
Reliability remains a concern for those who rely on strong read-after-write consistency everywhere. Tigris uses eventual consistency for cross-region reads in its Global and Dual-region buckets. One user noted that adding a CNAME to a bucket caused errors when trying to add a team member via the UI. How do the various caching configurations interact with each other in ways not covered by the current documentation?
Migration paths and S3 compatibility
Tigris maintains over 90% S3 API compatibility, so applications using MinIO or S3 typically require only an endpoint and credential change. The migration process from MinIO to Tigris works through a shadow bucket feature that fetches objects from your existing cluster on demand and caches them for future access to ensure zero downtime. You can also enable write-through mode, which syncs new writes back to your MinIO bucket to keep both systems in sync. This allows you to take as long as necessary before you complete the cutover.
Tigris provides fine-grained access policies with IP-based restrictions, time-based access conditions, and per-key policy attachments. The service maintains SOC 2 Type II compliance and will sign HIPAA BAAs for customers. If you use the Fly CLI, running the fly storage create command in an app directory automatically sets environment variables and triggers a re-deployment. This behavior can cause downtime if you are not careful. Tigris has no limit on the number of buckets or storage requests per organization. The maximum size for a single object is 5TB. You should evaluate if these edge cases suit your scale.