Skip to content
Amazon S3
Sub-page 2 of 8
Cost & billing mechanics · Free

Understanding Request and Egress Economics Before Your Bill Surprises You

Decision drivers
  • Whether content is served directly to end users or only to internal/same-region AWS services
  • PUT-to-GET request ratio for the workload
  • Whether multipart upload is used, and whether abort-incomplete-upload lifecycle rules exist
  • Monthly egress volume relative to the 100 GB free tier and the ~750 GB/month rough breakeven point for adding CloudFront

Production premise

S3 pricing has independent dimensions that don't show up on the same line as "storage" — PUT/COPY/POST/LIST requests are billed roughly 12.5x higher per-request than GET requests, and data transferred out to the internet is billed separately from storage entirely, with the first 100 GB/month free (aggregated across AWS services) and real per-GB rates beyond that.

Failure mode & inflection point

Two distinct traps, not one. First, a public-facing S3 bucket serving files directly to end users pays full internet egress on every byte — a service streaming 100 GB/day can run up hundreds of dollars a month in egress alone, invisible until the bill arrives, because the storage line item looked cheap. Second, and easy to miss entirely: incomplete multipart uploads (an upload that failed partway, or an application that abandoned it) leave their uploaded parts in the bucket, billed as stored bytes indefinitely, until someone explicitly cleans them up — there's no automatic expiration by default.

Production guardrail

Put CloudFront in front of any bucket serving content to end users — the origin fetch from S3 to CloudFront is free regardless of volume, and caching cuts how often that fetch happens at all. This doesn't eliminate egress, it relocates it: CloudFront bills its own transfer to viewers (currently a shade cheaper than S3's direct rate in the US tier), so the honest framing is "cheaper and cached," not "free." CloudFront's November 2025 flat-rate plans — including a $0 tier bundling 100 GB transfer, 1M requests, and WAF — make this an easy default for smaller sites specifically; below roughly 750 GB/month, though, direct S3 can still come out cheaper on its own, since the shared 100 GB free tier covers proportionally more of a small workload's traffic. Separately, set a lifecycle rule to abort incomplete multipart uploads after a set number of days as a matter of course on every bucket that accepts uploads — treat it as a default, not an optimization you'll get to later.