Multi-AZ for high availability quietly turned into a network bill bigger than the compute bill — here’s why.

Hi everyone 👋

This is one of those “hidden landmines” on AWS: things that never throw a clear error, never show up in a StackOverflow top answer, but can quietly make a system flaky or burn thousands of dollars a month. First up: cross-AZ data transfer.

😱 The assumption that gets everyone

Everyone knows data transfer out to the internet costs money. Far fewer people realize that traffic between Availability Zones inside the same Region isn’t free either — a lot of us assume “it’s all internal, so it’s free.”

🔍 What’s actually happening

AWS charges for data transfer between AZs within the same Region — typically $0.01/GB on the way out and $0.01/GB on the way in, so a full round trip costs $0.02/GB.

A very common scenario: an EKS cluster or a fleet of EC2 instances runs microservices spread across AZ-a and AZ-b for high availability. Those services call each other constantly, and a lot of them share one Redis cache or database that happens to sit in AZ-a.

The consequence: thousands of inter-service calls per second quietly generate terabytes of traffic crossing AZ boundaries. By the end of the month, the “Data Transfer” line item is bigger than the compute bill — for traffic that never even left the region.

🔬 A back-of-envelope example

It adds up faster than it sounds. Say 50 backend pods each make 200 requests/second to a shared cache in a different AZ, and each request/response round trip averages 20 KB:

50 pods × 200 req/s × 20 KB ≈ 200 MB/s
200 MB/s × 86,400 s/day ≈ 17 TB/day ≈ ~510 TB/month
510 TB/month × $0.02/GB ≈ ~$10,000/month

That’s purely illustrative math, not a universal number — real traffic is bursty, not constant — but it shows how quickly ordinary inter-service chatter turns into a five-figure line item once you multiply by “per request, every request, all day.”

🎯 Not all cross-AZ traffic is billed the same

A couple of exceptions are worth knowing so you’re not over-correcting:

  • Data transfer over a VPC Peering connection that stays within the same AZ has been free since May 2021 — it’s only the connection crossing AZs that’s billed.
  • Inter-AZ data transfer within the same Region for AWS PrivateLink, Transit Gateway, and Client VPN has been free since April 2022.
  • Replication traffic for Multi-AZ RDS or a Multi-AZ ElastiCache cluster is cross-AZ by design — that cost is the price of the availability guarantee, not a bug to route around. The chatty app-to-app calls are the part actually worth optimizing.

🔬 How to actually measure it, instead of guessing

Before redesigning anything, quantify it:

  • Turn on VPC Flow Logs and look at traffic between subnets in different AZs.
  • In Cost Explorer or your Cost and Usage Report (CUR), filter by usage type for regional data transfer (usage types containing DataTransfer-Regional-Bytes) to see the dollar figure directly, broken out from internet egress.

🛠️ The fix

Design with AZ-awareness as a first-class concern, not an afterthought:

  • In Kubernetes, use Topology Aware Hints to prefer routing traffic to an endpoint in the same AZ as the caller, and only let traffic cross AZs when there’s genuinely no healthy same-AZ target.
  • For stateful dependencies (cache, database) that can’t be same-AZ everywhere, at least measure the cross-AZ volume they generate before assuming it’s negligible.
  • Treat “traffic never left the region, so it’s free” as a myth to actively unlearn, not a safe default.

💡 What we learned

  • High availability and low cost aren’t automatically aligned — spreading services across AZs for resilience has a real, ongoing network cost that scales with request volume, not data size.
  • This cost is invisible until someone actually breaks down the data transfer line item by source/destination — it doesn’t show up as a single alarming line, it’s death by a thousand small charges.
  • Fixing it is an architecture decision (topology-aware routing), not a config toggle — worth baking in from the start rather than retrofitting after a surprise invoice.

📚 References