Object storage pricing has two very different parts. Storage is charged for data sitting still, and it is cheap. Data transfer out, or egress, is charged every time a file leaves for the internet, and on a busy bucket it quickly becomes the biggest line on the bill.
The published prices
- Amazon S3 Standard (US East): $0.023 per GB-month to store. Transfer to the internet is free for the first 100 GB a month, then $0.09 per GB for the first 10 TB, falling in tiers to $0.05 per GB above 150 TB.
- Cloudflare R2: $0.015 per GB-month, with the first 10 GB free, and no egress fees.
- Requests: S3 charges $5 per million writes and $0.40 per million reads. R2 charges $4.50 and $0.36, after 1 million writes and 10 million reads free each month.
A bucket that serves files
Store 1,000 GB and serve 5,000 GB a month, with 1 million writes and 10 million reads:
S3
1,000 GB × $0.023 + egress $441.00 + requests $9.00equals$473.00
R2
(1,000 − 10) GB × $0.015 + requests $0.00 + egress $0equals$14.85
Saving
|$473.00 − $14.85|equals$458.15
Of the $473 S3 bill, $441 is data transfer. Storage itself is only $23. R2 costs $14.85 for the same workload, because the transfer line disappears.
When S3 is still the right choice
- Data that is rarely read, such as backups and archives, where egress barely appears.
- Workloads that stay inside AWS: transfer to services in the same region doesn't count as internet egress.
- When you need S3 features or storage classes that R2 doesn't offer.
Tip: Putting a CDN in front of storage reduces how often files are read from the bucket. With S3 behind CloudFront, transfer is billed at CloudFront's rates instead, so compare those too.