Why is AWS so expensive?
Because AWS charges for almost everything that moves: data leaving, data crossing between zones, data passing through a NAT gateway, every public IPv4 address, every log line. Each charge is small. Together they make AWS one of the most expensive ways to run a small or mid-size app. Here's where the money goes, what real teams have paid, three worked examples including a webinar app, and what to use instead.
Prices are AWS list prices for US East (N. Virginia), checked in October 2026 against AWS's, Hetzner's, DigitalOcean's and Cloudflare's own pages. Sources are linked inline and listed at the end.
The short version
- Moving data is the expensive part. Sending data to the internet costs $0.09 per GB after the first 100 GB. A NAT gateway adds $0.045 per GB, and even traffic between two zones in the same region costs $0.01 per GB each way. A Hetzner dedicated server comes with unlimited traffic.
- The recommended setup costs money before your first user. A load balancer, two NAT gateways, a Multi-AZ database, IPv4 addresses and logs come to about $420 a month for an app that a $39 DigitalOcean setup can run.
- Video is where it hurts most. A webinar app streaming 100 TB a month pays about $7,900 a month in AWS bandwidth alone. On DigitalOcean the whole video setup costs about $940.
- AWS is Amazon's profit engine. It earned a 39.4% operating margin in Q2 2026, about 60% of Amazon's operating profit. Its prices reflect what customers will pay, not what bandwidth costs.
- In fairness, AWS has improved: free data transfer when you leave (2024), no more charges for unauthorized S3 requests (2024), flat-rate CloudFront plans (2025), and up to 72% off compute if you commit for one or three years.
1. AWS is Amazon's profit engine
In the second quarter of 2026, AWS made $42.2 billion in revenue and $16.6 billion in operating income, a 39.4% margin (Quartz, analysis). That was about 60% of all of Amazon's operating profit, from less than a quarter of its revenue. Nobody prices a business like that at cost.
The companies that have done the math in public tell the same story:
- 37signals (Basecamp, HEY) spent $3.2 million a year on cloud in 2022. After moving most of it onto its own hardware, it expects to save well over $10 million over five years. Its S3 storage alone cost about $1.5 million a year; it expects the 18 petabytes of storage it bought to replace it to cost under $200,000 a year (DHH, DCD).
- Ahrefs compared its own data center in Singapore with an equivalent AWS setup: about $40 million in colocation over two and a half years for 850 servers, against roughly $448 million on AWS (Ahrefs).
- Dropbox moved its file storage off S3 to its own system and reported $74.6 million in savings over the next two years (S-1 filing, 2018).
In 2021, a16z estimated that running workloads yourself often costs a third to half as much as the cloud, and that cloud costs were weighing on about $100 billion of market value across 50 large public software companies (The Cost of Cloud). Not everyone agrees. Corey Quinn, who cuts AWS bills for a living, replied that Dropbox was an outlier with one huge, predictable workload, and that for most companies engineering time is scarcer than money. That's fair, and it's why this guide is about small and mid-size apps, where the choice isn't "build a data center", it's "rent a $40 server instead of a $400 architecture".
2. Moving data is the expensive part
Storing data and running servers on AWS is pricey but comparable to other clouds. Moving data is where AWS stands apart:
| What moves | AWS charge (US East) |
|---|---|
| Data out to the internet (first 10 TB a month, after 100 GB free) | $0.09 / GB |
| Data through a NAT gateway, on top of the above | $0.045 / GB, plus $0.045 / hour |
| Between two availability zones in the same region | $0.01 / GB each way |
| Between regions | about $0.02 / GB |
| Through CloudFront, pay as you go (after 1 TB free) | $0.085 / GB |
| Each public IPv4 address, since February 2024 | $0.005 / hour (about $3.65 a month) |
Sources: EC2 data transfer, VPC and NAT gateway, IPv4 charge. Internet egress gets cheaper above 10 TB: $0.085, then $0.07, then $0.05 per GB.
Here's what sending 10 TB a month costs in different places:
| Sending 10 TB a month from | Cost |
|---|---|
| AWS, straight from EC2 or S3 | $891 |
| AWS, from a server behind a NAT gateway | $1,341 |
| AWS CloudFront, pay as you go | $765 |
| Cloudflare Realtime (live video) | $450 |
| DigitalOcean droplets (2–5 TB included per droplet and pooled, then 1¢ per GB) | $0–$100 |
| Hetzner dedicated server, 1 Gbit/s port | $0 (unlimited) |
| Cloudflare CDN or R2 for files and web pages | $0 |
Cloudflare, a competitor with an obvious interest, estimated in 2021 that AWS charges US customers around 80 times its own cost for this bandwidth (AWS's Egregious Egress). Whatever the exact markup, the gap with everyone else is real and has lasted for years.
The NAT gateway
AWS's standard advice is to put your servers in private subnets, which reach the internet through a managed NAT gateway. Each one costs about $33 a month to exist, plus $0.045 for every gigabyte that passes through it, in either direction. That includes traffic to AWS's own services: a server in a private subnet reading from S3 in the same region pays NAT fees unless you add a free "gateway endpoint". Corey Quinn's verdict is in the title of his post: the AWS Managed NAT Gateway is unpleasant and not recommended.
What AWS has fixed
AWS has moved on some of this. Since November 2025, CloudFront offers flat-rate plans: $15 a month for 50 TB and 10 million requests, $200 for 50 TB and 125 million requests. Going over doesn't cost more, but AWS may serve you from fewer or more distant locations. It helps most when your content already lives in AWS: data from S3 or EC2 to CloudFront is free, while sending the same data to any other CDN costs $0.09 per GB. And since March 2024, customers who leave AWS can ask for their final data transfer to be free (Data Center Knowledge). When 37signals moved its storage out, AWS waived an egress bill of about $250,000.
3. The architecture tax: paying before your first user
AWS's reference architectures, and most tutorials, give even a small app the same shape: a load balancer in front, containers or servers in private subnets, a NAT gateway in each availability zone, and a database replicated across two zones. Every piece is reasonable on its own. Together they cost several hundred dollars a month before anyone signs up:
- Application Load Balancer: $0.0225 an hour plus capacity units, about $22 a month for a quiet app.
- Two NAT gateways: about $66 a month, plus traffic.
- A Multi-AZ database: doubles the instance and storage price for a standby you never query. A small PostgreSQL database (2 vCPU, 4 GB) with 100 GB comes to about $118 a month.
- Public IPv4 addresses: about $3.65 each per month, and a load balancer across two zones uses two.
- Logs: $0.50 per GB ingested into CloudWatch, which adds up quickly with verbose apps.
- A staging environment usually copies most of this, and Business Support+ costs 9% of the bill, at least $29 a month (support pricing).
Case study 1 below adds it up: about $420 a month, for an app that runs comfortably on a $24 server with a $15 managed database.
4. Complexity is a cost too
AWS bills are hundreds of line items across dozens of services, each with its own units. Nobody can predict them well, which is why an entire industry of consultants and tools exists just to read them. That complexity costs money in two ways: the hours your team spends understanding the bill, and the charges nobody noticed until the invoice arrived.
There's also no hard spending cap. AWS Budgets can alert you and run a few actions, like applying a restrictive IAM policy or stopping specific EC2 or RDS instances. But nothing stops your whole account's spending at a number you choose. AWS's stance, as Hacker News commenters put it when discussing a $1,000 mistake, is that it would rather let you overspend and forgive it afterwards than take your production down.
5. When bills explode
| When | What happened | Bill |
|---|---|---|
| Apr 2024 | An engineer's new, empty, private S3 bucket received about 100 million unauthorized write requests in one day, because its name matched a default in a popular open-source tool's configuration. Every rejected request was billed (The Register). Two weeks later AWS stopped charging for unauthorized requests from outside your account. | $1,300 |
| Nov 2025 | Geocodio's servers synced about 20 TB to S3 in the same region in one day. The traffic went through a NAT gateway instead of a free VPC endpoint, so every gigabyte was billed $0.045 (write-up). AWS refunded it. | $907 in one day |
| 2025 | 37signals moved its storage off S3. The data transfer out to do it was billed at about $250,000, which AWS waived under its 2024 policy for departing customers (DCD). | $250,000, waived |
These are the documented ones. Day to day, most AWS overspend is quieter: a NAT gateway in a forgotten test account, logs nobody reads with no expiry set, an idle load balancer, unattached disks and old snapshots. None of it makes the news. All of it shows up on the invoice every month.
6. What developers say
- A $1k AWS mistake (Hacker News, November 2025, 339 points). Commenters asked again for hard spending caps, and pointed out that the free S3 endpoint should be set up by default when a VPC is created.
- AWS to begin charging for public IPv4 addresses (July 2023), the discussion when AWS started charging for addresses that had been free.
- fck-nat, an open-source replacement for the NAT gateway that runs on one small instance (project), and Switch to VPC endpoints from NAT gateways (2022), both about avoiding NAT fees.
- The big cloud exit FAQ by David Heinemeier Hansson, on why 37signals left and what it actually costs to run your own hardware.
7. Three hypothetical case studies
These are made-up apps with realistic usage, priced at list prices in October 2026. AWS is US East, on demand, with no free-tier credits. Excluded everywhere: your time, email, monitoring tools and anything that would cost the same on every platform. Every assumption is listed so you can check the math or rerun it with your own numbers.
A note on Hetzner. Hetzner raised its prices in 2026 and, as of this writing, lists its cloud servers as unavailable because of a hardware shortage. Its dedicated servers can still be ordered, at the new prices: an AX42 (8 cores, 64 GB) is €97.30 or $117.10 a month plus a one-off setup fee, with unlimited traffic on its 1 Gbit/s port (prices, traffic). DigitalOcean is the alternative you can order today: droplets include 2–5 TB of transfer each, pooled across your account, and extra transfer is 1¢ per GB.
Case 1: a standard SaaS web app
- A web app and API built the textbook way: two containers on Fargate (1 vCPU, 2 GB each) behind a load balancer, in private subnets with a NAT gateway in each of two zones.
- PostgreSQL on RDS (db.t4g.medium: 2 vCPU, 4 GB), Multi-AZ, with 100 GB of storage.
- 1 TB of traffic out a month, 300 GB through the NAT gateways, 50 GB of logs, 100 GB in S3, 10 secrets.
| AWS line item | Per month |
|---|---|
| RDS instance, Multi-AZ | $94.90 |
| Data transfer out (1 TB) | $81.00 |
| Two NAT gateways + 300 GB processed | $79.20 |
| Fargate (2 tasks, around the clock) | $72.08 |
| CloudWatch Logs (50 GB) | $26.50 |
| RDS storage, Multi-AZ (100 GB) | $23.00 |
| Application Load Balancer | $22.27 |
| Public IPv4 addresses (4) | $14.60 |
| Secrets Manager, S3, Route 53 | $7.20 |
| Total | $421 / month |
- DigitalOcean: about $39 a month. A 2 vCPU / 4 GB droplet ($24, with 4 TB of transfer) and a managed PostgreSQL database ($15.15). Add a standby node if you need failover.
- Hetzner: about $13 a month for one cloud server (4 vCPU, 8 GB) running both, if you can order one.
AWS: $421. DigitalOcean: $39. That's about 11 times more, before a staging copy or a support plan. Reserving the database for a year cuts that line by 28%, which barely moves the total.
Case 2: a webinar app
This is where AWS's bandwidth prices hurt most. Live, interactive webinars run on WebRTC: an SFU (selective forwarding unit) server receives the presenter's video and sends a copy to every attendee. Every one of those copies is data leaving your servers.
- Interactive webinars with Q&A and attendees brought on stage, using an open-source SFU such as LiveKit or mediasoup on your own servers, or a managed service.
- 150 attendees per webinar on average, one hour each. Each attendee receives about 1.5 Mbps (720p presenter video, audio and screen share): about 0.675 GB per attendee-hour.
- Launch: 100 webinars a month, 15,000 attendee-hours, about 10 TB out. Peak of 4 webinars at once (0.9 Gbit/s). 2 media servers.
- Growth: 1,000 webinars a month, 150,000 attendee-hours, about 101 TB out. Peak of 30 at once (6.75 Gbit/s). 8 servers on AWS (c7g.xlarge), 9 on Hetzner and DigitalOcean (one per ~1 Gbit/s of peak).
- Recordings of about 1 GB per webinar, stored in S3 on AWS and in Cloudflare R2 elsewhere. The app itself (sign-ups, scheduling, chat) is excluded: it costs about the same everywhere.
| Video setup | Launch (10 TB) | Growth (101 TB) |
|---|---|---|
| AWS: EC2 servers running your own SFU | $1,123 | $8,778 |
| …of which bandwidth out | $902 | $7,879 |
| AWS: IVS Real-Time, managed ($0.072 to $0.056 per participant-hour) | $1,057 | $9,416 |
| AWS: Chime SDK, managed ($0.0017 per attendee-minute) | $1,540 | $15,402 |
| Cloudflare Realtime SFU, managed ($0.05 per GB after 1 TB) | $456 | $5,013 |
| Hetzner: AX42 dedicated servers, unlimited traffic | $240 | $1,087 |
| DigitalOcean: 4 vCPU / 8 GB droplets ($48, 5 TB each) | $97 | $940 |
Hetzner also charges a one-off setup fee per server: about $118 at launch and $531 at growth. Managed-service prices are from AWS's IVS and Chime SDK pages and Cloudflare's Realtime page; EC2 is c7g.xlarge at $0.145 an hour.
On AWS, bandwidth is 80% of the launch bill and 90% at growth. Paying AWS to manage the video doesn't help: IVS and the Chime SDK price per participant-hour at about the same level, or higher. At growth, the difference between AWS and DigitalOcean is about $7,800 a month, roughly $94,000 a year, for the same webinars.
The cheapest option here isn't Hetzner. DigitalOcean's 5 TB per droplet plus 1¢ per extra gigabyte beats Hetzner's flat €97 servers at both sizes, now that Hetzner's 2026 price rises have landed. Either way, the gap with AWS is about 5 to 12 times.
The one cheap path on AWS
If your webinars are one-way broadcasts and a 10 to 30 second delay is fine, you can skip WebRTC: encode the stream to HLS video segments and serve them through CloudFront. At launch, 15,000 viewer-hours is about 10 TB and 27 million requests, which fits CloudFront's $200 flat-rate plan. With one encoding server that's about $310 a month. You lose live interaction, and at the growth size you'd pass the plan's 50 TB allowance.
Case 3: a serverless API with steady traffic
- An API on API Gateway (HTTP API), Lambda and DynamoDB: 100 million requests a month, about 38 a second on average.
- Each request runs 50 ms at 512 MB, reads two DynamoDB items and writes one every fifth request (200M reads, 20M writes), logs about 1 KB and returns 5 KB.
| AWS line item | Per month |
|---|---|
| API Gateway, HTTP API (100M requests) | $100.00 |
| CloudWatch Logs (100 GB) | $53.00 |
| Data transfer out (500 GB) | $36.00 |
| Lambda compute (after the always-free tier) | $35.00 |
| DynamoDB reads (200M) | $25.00 |
| Lambda requests | $19.80 |
| DynamoDB writes (20M) | $12.50 |
| Total | $281 / month |
With a REST API instead of an HTTP API, API Gateway alone is $350 and the total is $531.
- DigitalOcean: $48 a month. One 4 vCPU / 8 GB droplet runs the same API and its database at 38 requests a second with room to spare.
- Hetzner: about $13 a month for a similar cloud server, if you can get one.
- Cloudflare Workers: about $41 a month, plus your database.
AWS: $281 to $531. A single server: $13 to $48. That's 6 to 11 times more than DigitalOcean. At low or very spiky traffic the picture flips: at 1 million requests a month, Lambda's always-free tier makes this nearly free.
All three side by side
| App | AWS | DigitalOcean | Hetzner |
|---|---|---|---|
| Standard SaaS app | $421 | $39 | $13* |
| Webinar app, launch (10 TB) | $1,123 | $97 | $240 |
| Webinar app, growth (101 TB) | $8,778 | $940 | $1,087 |
| Serverless API, 100M requests | $281 | $48 | $13* |
* Hetzner cloud servers, currently listed as unavailable to order.
The server columns leave out your time: a few hours to set up and an hour or two a month to keep up. In every case here, the gap pays for that many times over.
8. Do you still need AWS's managed services in the AI era?
A big part of an AWS bill is paying Amazon to run things for you: databases (RDS), caches (ElastiCache), search (OpenSearch), queues and clusters. That made sense when running a database meant hiring someone who knew how. It makes less sense now.
- The setup is cheap to write. Terraform or Ansible, a hardened server config, Postgres with streaming replication, nightly backups to object storage, monitoring and alerts: this is exactly the boilerplate that coding agents like Claude Code, Codex and Cursor produce well, and review is faster than writing it from scratch.
- Deploys are solved. Open-source tools like Coolify and Kamal give you push-to-deploy on your own servers.
- Managed doesn't have to mean AWS. DigitalOcean's managed PostgreSQL starts at $15.15 a month. Neon, Supabase and others offer managed Postgres too.
What AI doesn't replace
Someone still has to own the data. Backups only count if you've restored one. Security patches have to be applied, disks fill up, and a database failover at 3 a.m. needs a person who understands what happened. For a production database, paying someone to manage it is often still right. It just doesn't have to cost AWS's Multi-AZ prices. AI writes the runbook; it doesn't carry the pager.
9. When AWS is the right choice
- Compliance and customers. If your customers or auditors require AWS, its certifications or its region list, that settles it.
- You use what only AWS has. Deep use of its managed AI, data and analytics services can be worth the platform cost.
- Very spiky or near-zero traffic. Lambda's always-free tier and per-request billing can beat any server that sits idle.
- Credits. Startup credits can cover the first year or two. Just plan for the bill that arrives when they run out.
- Your team knows it well and runs it with discipline: commitments for steady load (up to 72% off with Savings Plans), Graviton instances, no NAT gateway surprises.
10. What to use instead, by type of project
| Project | Use | Why |
|---|---|---|
| Standard web app or SaaS | A VPS (DigitalOcean, Hetzner, OVHcloud) plus managed Postgres, deployed with Coolify or Kamal | Case 1: about a tenth of the AWS bill. |
| Live video, webinars, calls | Your own SFU on servers with included or unlimited traffic, or Cloudflare Realtime if you want it managed | Case 2: bandwidth is the whole bill. |
| Downloads, media files, recordings | Cloudflare R2, with free egress | You pay for storage, not for every download. |
| Steady-traffic APIs | A VPS, or Cloudflare Workers | Case 3: per-request billing loses under constant load. |
| Static sites and docs | Cloudflare Pages or GitHub Pages | Free. |
| Spiky or near-zero traffic | Lambda, or Cloudflare Workers | Free tiers and scale-to-zero win here. |
| Must stay on AWS | AWS, with the checklist below | Most AWS bills have easy savings in them. |
Hosting a Next.js app on Vercel? That's AWS underneath too, with another margin on top. See why Vercel is so expensive.
11. If you stay: how to cut your AWS bill
- Add free gateway endpoints for S3 and DynamoDB so that traffic to them stops going through your NAT gateway.
- Question every NAT gateway. Use one for non-production environments, or a small NAT instance like fck-nat, and give public-facing servers public subnets where it's safe.
- Put CloudFront in front of S3 and your load balancer, and check whether a flat-rate plan covers your traffic. Watch the request allowance.
- Keep chatty services in one zone where you can accept the risk, since cross-zone traffic is billed both ways.
- Release unused Elastic IPs and use IPv6 where you can.
- Set a retention period on every CloudWatch log group, and move logs you rarely query to the Infrequent Access class at $0.25 per GB.
- Move to Graviton (Fargate on Arm is about 20% cheaper) and commit to steady usage with Savings Plans or reservations.
- Delete what nobody uses: unattached disks, old snapshots, idle load balancers, forgotten test accounts. Turn staging off at night.
- Turn on AWS Budgets alerts and Cost Anomaly Detection today, so the next surprise is an email rather than an invoice.
- If you leave, ask AWS support for the free data transfer out before you move.
Want someone to do this for you? I've spent 15 years on infrastructure at companies like events.com, remo.co, bayut.com and dubizzle. Send me your AWS invoice or Cost Explorer export. Within 48 hours you'll get a free written teardown with every saving priced in dollars, whether you stay on AWS or move. If you want me to make the changes, you pay only once the bill drops.
Sources
- Amazon Q2 2026 results: Quartz, earnings analysis
- AWS pricing: EC2 and data transfer, VPC and NAT gateway, Fargate, Elastic Load Balancing, RDS for PostgreSQL, API Gateway, Lambda, DynamoDB, CloudWatch, Support, Savings Plans
- AWS video pricing: IVS, Chime SDK; instance prices from Vantage (c7g.xlarge) and Vantage (db.t4g.medium)
- AWS: Public IPv4 address charge (2023), S3 stops charging for unauthorized requests (May 2024), Budgets actions
- CloudFront flat-rate plans: Duckbill's guide (February 2026)
- Free egress when leaving: Data Center Knowledge (March 2024)
- Cloudflare: AWS's Egregious Egress (July 2021), Realtime SFU pricing
- Hetzner: 2026 price adjustment, dedicated server traffic, IPv4 pricing
- DigitalOcean: Droplets, bandwidth billing, managed databases
- 37signals: We stand to save $7m over five years, The big cloud exit FAQ, DCD on the S3 exit, DCD on 2024 savings
- How Ahrefs saved US$400M by not going to the cloud (March 2023); Dropbox S-1 (2018)
- a16z: The Cost of Cloud, a Trillion Dollar Paradox (2021); Corey Quinn: reply, The AWS Managed NAT Gateway is unpleasant and not recommended
- Incidents: The Register on the S3 bucket bill (May 2024), Geocodio: the $1,000 AWS mistake (November 2025)
- Hacker News: A $1k AWS mistake, AWS to begin charging for public IPv4, fck-nat, Switch to VPC endpoints from NAT gateways
- Tools: LiveKit, mediasoup, fck-nat, Coolify, Kamal