Cloud cost engineering

AWS vs GCP vs Azure: what the headline pricing pages don't tell you

Every hyperscaler buries 4-5 line items off the headline pricing page. Here is what actually shows up on the invoice — egress, IOPS, NAT, snapshots — with numbers from real workloads.

cloudprice editorial ~3 min read

The marketing pricing pages for AWS, GCP, and Azure all do the same trick: they put the cheapest, smallest, on-demand Linux instance in the biggest font and call it a day. A t3.micro at $0.0104/hour. An e2-micro at $0.0084/hour. A B1s at $0.0104/hour. Looks like a $7-8/month VM, right?

Wrong. After running production on all three for the last several years, here are the line items that aren't on the headline pricing page but absolutely show up on your invoice.

1. The data transfer (egress) line

This is the big one. None of the three hyperscaler pricing landing pages put egress next to the compute price, but on any meaningful workload it dwarfs everything else.

  • AWS: $0.09/GB after the first 100 GB/month free tier. A modest 2 TB/month of egress = $171/month. That's more than the cost of a c6i.large running 24/7.
  • GCP: $0.12/GB to the internet for the first 1 TB, dropping to $0.11 after that. Better tiered pricing once you cross 10 TB, but the entry rate is actually higher than AWS.
  • Azure: $0.087/GB after 100 GB free. Slightly cheaper than AWS at the low end, basically the same at scale.

Compare that to Hetzner's 20 TB included egress per VM or DigitalOcean's 1-10 TB included per droplet and the hyperscaler pricing models look almost adversarial. We cover this in detail in the egress trap.

2. Storage IOPS, throughput, and snapshots

The instance pricing page shows you the cost of the VM. It does not show you the cost of the disk attached to it.

On AWS, a gp3 EBS volume is $0.08/GB-month, plus $0.005/provisioned IOPS-month above 3000 baseline, plus $0.04/MB/s throughput-month above 125 MB/s baseline. A 500 GB gp3 with 6000 IOPS and 250 MB/s ends up at ~$60/month — and that's just the disk, not the snapshots. io2 Block Express can run $1000+/month for a single database volume.

GCP's pd-balanced sits at $0.10/GB-month, and Hyperdisk Balanced is $0.11/GB-month plus separate IOPS and throughput charges. Azure Premium SSD v2 has cleaner pricing on paper but the per-IOPS line is brutal: $0.005/IOPS-month, same as AWS.

Snapshots are billed separately on all three, typically $0.05/GB-month, and most teams accidentally keep months of incrementals.

3. NAT, load balancers, and the network plumbing

AWS NAT Gateway: $0.045/hour ($33/month) per AZ, plus $0.045/GB processed. Run a private-subnet workload across three AZs for HA and you're paying $100/month for NAT before a single byte moves.

Application Load Balancer is $16.20/month base plus LCU consumption ($0.008/LCU-hour). A modest production ALB lands around $25-50/month. Network Load Balancer is similar. Azure Load Balancer and GCP Cloud Load Balancing are in the same ballpark.

None of this shows on the compute pricing page.

4. The "free tier that isn't free"

AWS lists CloudWatch Logs as "$0.50/GB ingested". Sounds fine, until your app starts logging and you discover you're ingesting 50 GB/day. That's $750/month for log storage you'll mostly never query.

GCP Cloud Logging is "free up to 50 GB/project/month, then $0.50/GB". Better, but the per-project quota tricks teams that consolidate to one project.

Azure Monitor Logs is $2.30/GB ingested on the pay-as-you-go tier. Easily the most expensive of the three for log volume.

5. The committed-use math nobody does

AWS Savings Plans, GCP CUDs, and Azure Reserved Instances all advertise 30-70% savings. Read the fine print:

  • AWS Compute Savings Plans cover EC2, Fargate, and Lambda, but only at the published Savings Plan rate (which is usually 27-30% off, not the headline 72%).
  • GCP CUDs require committed spend regardless of usage. If you over-commit, you're paying for capacity you don't use.
  • Azure RIs are tied to instance family AND region. Move a workload from East US to West Europe and the RI doesn't apply.

The real average effective discount across a typical year is around 25-35%, not the headline number.

What to do about it

Build your own price model — don't trust the pricing page. We built cloudprice exactly because every comparison spreadsheet I'd ever seen had stale numbers and missed at least one of the categories above. Open the head-to-head comparisons for whichever pair you're evaluating and treat the headline hourly rate as the floor, not the price.

For a worked example with all line items, see AWS Well-Architected cost-optimization pillar or the FinOps Foundation framework. Both correctly say: list price is a starting point, not the answer.

Try it yourself
Compare list prices across all seven providers, side by side. Live snapshot updated regularly.