StorageJuly 6, 20267 min read

S3 Egress Fees: Why Downloading Your Own Data Costs So Much

Storage is the cheap line on an object-storage bill. Egress, the charge for data leaving the bucket, is where the money actually goes. Here's how S3 data-transfer fees work, how to calculate your real bill, and why zero-egress storage changes the math.

RThe Runsite Team

You put a few hundred gigabytes of images on object storage, glance at the pricing page, and the numbers look friendly: storage is a couple of dollars a month, basically a rounding error. Then the first real invoice arrives and it's a hundred and something. Nothing about how much you're storing changed. The line that blew up isn't storage at all. It's egress, the charge for data leaving the bucket, and it's the part of the bill nobody shops on. Here's where that number comes from, how to work out your own before the invoice does it for you, and why some storage doesn't charge it at all.

The bill that catches people out

The pricing page wasn't lying to you. Object storage genuinely is cheap to sit on. On AWS S3, standard storage runs about $0.023 per GB per month at the time of writing, so a hundred gigabytes of assets costs you around two dollars and change to keep. That's the number you compare when you're choosing where to put your files, and it's the number that makes object storage look like a solved problem.

The number you don't compare is egress: the fee for moving data out of the provider's network. It doesn't show up when you upload, and it doesn't show up while the files just sit there. It shows up every time someone downloads something. On most metered providers that runs somewhere around $0.09 per GB out to the internet once you're past a small free allowance (roughly the first 100 GB a month on AWS). Individually those are tiny fractions of a cent. The trouble is you're not billed once. You're billed per download, and a popular file gets downloaded a lot.

What egress actually is, and where it hides

Egress is data transfer out: every byte that leaves the provider's network heading somewhere else. The reason it surprises people is that it isn't a single line you can point at on the pricing page. It's a multiplier that quietly attaches itself to things you'd never think of as "downloading." A few of the usual places it hides:

  • Serving assets to users. Every image, video, PDF, or download your app hands to a visitor is egress. One 4 MB hero image on a page that gets a million views a month is four terabytes of transfer out, from a single file.
  • CDN origin pulls. Putting a CDN in front of your bucket helps, but it isn't free either. Every cache miss means the CDN fetches the file from your bucket, and that origin pull is billed as egress. A cold cache, a low hit rate, or short cache lifetimes all quietly raise the number.
  • Cross-region and cross-AZ traffic. Replicating a bucket to a second region for durability, or reading it from a service in a different availability zone, counts as data transfer too. It's egress you're paying to move data around inside the same provider.
  • Moving backups and exports out. Pulling a database dump back down to restore it, shipping logs to an external tool, or handing a data export to a customer all leave the network, so all of them meter.
  • Retries and failed transfers. A download that drops at 90% and restarts still billed you for that 90%. At scale, retries are a line item of their own.

None of these are exotic. They're the normal behavior of a normal app. That's the point: egress isn't a penalty for doing something wrong, it's a charge on the thing storage is for, which is handing files to people.

Reading your real bill

You can estimate your egress before a provider does it for you, and it's worth doing because the answer is often an order of magnitude off from what the storage line suggests. The rough shape of it is two separate sums that get added together:

text
storage cost = gigabytes stored        x  storage rate per GB
egress cost  = gigabytes served out    x  egress rate per GB

monthly bill = storage cost + egress cost

The storage side is easy: it's just how much you keep. The egress side is the one that runs away, because it isn't tied to how much you store, it's tied to how much you serve. Take a small media site that keeps 100 GB of images and video and serves 2 TB of it to visitors over a month. A busy blog with a bit of video is well into that range. Here's what the two lines look like side by side:

text
Object storage bill  —  media site, one month
---------------------------------------------------
Storage      100 GB   x  $0.023/GB   =    $2.30
Egress     1,900 GB   x  $0.09/GB    =  $171.00   <-- the surprise
           (2 TB served, first 100 GB free)
---------------------------------------------------
Total                                =  $173.30
           egress is 99% of the bill

The storage you actually shopped on is $2.30. The bill is $173.30. Everything in the gap is egress, and it scales with traffic, not with how much you store. Double your visitors next month and the storage line doesn't move while the egress line does. This is why the invoice feels disconnected from anything you decided: you sized your storage, but the meter runs on your audience.

Check the rates before you trust the math

Provider egress prices change, vary by destination and region, and drop in tiers as volume climbs. The $0.09/GB and $0.023/GB above are round figures for AWS S3 to the public internet at the time of writing. Use them to understand the shape of the bill, then plug in your own provider's current numbers for a figure you can rely on.

Why expensive egress is also lock-in

There's a second cost to egress that doesn't show up until you try to leave. Your data lives in the bucket, and the only way to move it somewhere else is to download it, which means egress. So the bigger your dataset and the higher the egress rate, the more it costs simply to walk out the door with the data you already own.

Say you've accumulated a terabyte and you want to migrate it to another provider. At around $0.09 per GB that's roughly $90 in transfer just to copy it out, before you've stored a single byte anywhere new, and that's a small dataset. For a serious archive the exit fee runs into real money. Egress isn't only an operating cost, then. It's an exit tax, and a provider that charges a lot for it has quietly made itself expensive to leave. The cheaper it is to pull your data out, the freer you actually are to change your mind.

The zero-egress model

Flip the pricing around and the whole picture calms down. When data transfer out is free, the egress line goes to zero and your bill collapses back to the one thing you can actually predict: the gigabytes you store. That's the model behind zero-egress S3-compatible object storage: downloads, uploads, and transfer of any kind cost nothing, and you pay only for what's on disk, billed at €0.025 per GB a month after 5 GB free.

Run the same media site through it. The 100 GB of assets costs about €2.38 a month to store, and that's the whole bill, whether the site serves 2 TB or 20 TB to visitors. The line that was 99% of the invoice on a metered provider isn't discounted, it's simply gone. Your cost is flat, it scales with your library rather than your traffic, and a spike in popularity is good news instead of a billing event.

The migration worry disappears with it. Because the storage speaks the S3 API, the AWS SDK, boto3, or any S3 client works unchanged: you point the endpoint at the new host and swap the keys, and nothing in your code moves. And since pulling data out is free, there's no exit tax the day you decide to leave. Public buckets are served through a global CDN and private files through time-limited presigned URLs, so the CDN origin pulls and downloads that would have metered elsewhere just don't. If your workload is backups, the same logic makes an off-site copy in your own bucket cheap to write and, more importantly, free to restore when you actually need it.

When egress actually matters, and when it doesn't

It's worth being honest about this, because egress isn't a crisis for everyone. If you're serving a lot of bytes to a lot of people, it's probably the biggest number on your bill and the one most worth designing around:

  • Media and video. Images, audio, and especially video are large and served repeatedly, which is exactly the shape that runs the egress meter hot.
  • Public assets at scale. Anything popular and downloadable: a busy site's static files, a widely used app's downloads, user-generated content with real traffic.
  • Frequent restores or data movement. Backups you pull back often, datasets you shuttle between environments, exports you hand to customers.

And if that's not you, don't let the horror stories push you into over-engineering. A low-traffic internal tool, a private bucket that's written far more than it's read, or an archive that mostly sits untouched will barely register any egress at all. On that kind of workload the difference between metered and free transfer is a few cents, and it isn't worth losing sleep over. The reason to care is the shape of your traffic, not the fact that egress exists.

The short version: storage is the cheap, predictable part, and egress is the part that scales with how much the world uses your files. Work out your own two lines before the invoice does, and if serving data is central to what you're building, store and serve without the bandwidth bill so the only number you're paying for is the one you can plan around.

FAQ

Frequently Asked Questions

Common questions about this service.

Egress is priced per gigabyte of data leaving the provider's network, and unlike storage, which you pay for once, you pay it every single time a file is downloaded. A popular asset served thousands of times a day meters on every request, so the total climbs with your traffic rather than your storage. At roughly $0.09 per GB on AWS at the time of writing, a site serving a couple of terabytes a month can see egress dwarf its storage cost many times over.

Estimate the gigabytes you serve out in a month, subtract any free allowance, and multiply by the provider's egress rate per GB. That's a separate number from your storage cost, and usually a much larger one, since storage is just gigabytes stored times the storage rate. For example, serving 2 TB with 100 GB free at $0.09/GB is 1,900 GB × $0.09 = $171, against maybe $2.30 to store 100 GB. Always confirm the current rate with your provider, since egress pricing changes and varies by region and destination.

Yes. Some providers don't charge for data transfer at all, so downloads, uploads, and transfer of any kind are free and you pay only for the gigabytes you store. Runsite's object storage works this way: it's S3-compatible, so your existing AWS SDK or boto3 code runs unchanged, and it bills a flat €0.025 per GB per month after 5 GB free with zero egress charges. That makes the bill scale with your stored data rather than your traffic, and it removes the exit fee for moving data back out.

Your app deserves to be online

Free to start. Deploy in under a minute. No credit card needed.