AWS cost · cross-AZ traffic
Cross-AZ data transfer: the $0.01/GB charge draining HA setups
You did the responsible thing and spread your services across Availability Zones. That is the standard advice for staying up when one AZ has a bad day. Nobody mentions the meter it starts. Every request that crosses from one AZ to another costs $0.01/GB, and the reply crossing back costs another $0.01/GB. At a fraction of a cent it feels like nothing - until you have services chatting across AZs millions of times a day, and the total quietly passes $1,000/month. The setup that keeps you online is also billing you to talk to yourself.
Traffic between Availability Zones costs $0.01/GB each way - $0.02 per GB round trip. Only traffic inside a single AZ on private IPs is free. A high-availability setup spread across AZs pays this on every cross-zone request, and a chatty fabric can run $1,000+/month. Keep services that talk to each other in the same AZ, and the charge goes away.
Where does cross-AZ traffic come from?
The usual sources, all billing $0.01/GB each way:
| Source | Cost | Note |
|---|---|---|
| Microservices chatting across AZs | $0.02/GB round trip | the classic leak - services spread for HA, talking constantly |
| RDS Multi-AZ replication | $0.01/GB each way | the standby in another AZ, kept in sync |
| EKS pod-to-pod across AZs | $0.02/GB round trip | pods scheduled without AZ awareness |
| NLB with cross-zone enabled | $0.01/GB each way | off by default - turning it on adds the charge |
Two of those sources have their own breakdowns: RDS Multi-AZ replication and the EKS pod-to-pod chatter that comes with spreading nodes across zones.
Why is cross-AZ traffic so easy to miss?
Because it never appears as its own line. Cross-AZ charges fold into EC2-Other under a usage type ending in DataTransfer-Regional-Bytes, buried alongside EBS and snapshots. There is no “cross-AZ” heading to alarm anyone. It is the same disappearing act the rest of AWS data transfer pulls - scattered charges that no single line adds up for you.
How do I cut cross-AZ data transfer?
Co-locate what talks. Services that chat constantly belong in the same AZ, so their traffic never crosses a $0.01/GB boundary - you keep multi-AZ redundancy at the tier that needs it without paying for chatter at every tier. For stateless targets behind a Network Load Balancer, leaving cross-zone load balancing off keeps requests in-zone. One place this is a quick, safe win is any NLB where cross-zone was switched on without needing to be - this checks the setting, then turns it off:
# is cross-zone load balancing on for this NLB?
aws elbv2 describe-load-balancer-attributes \
--load-balancer-arn <your-nlb-arn> \
--query "Attributes[?Key=='load_balancing.cross_zone.enabled']"
# turn it off (stateless targets only) to keep traffic in-zone
aws elbv2 modify-load-balancer-attributes \
--load-balancer-arn <your-nlb-arn> \
--attributes Key=load_balancing.cross_zone.enabled,Value=falseWant to know how much of your bill is services talking across AZs? Connect your account read-only and see what it is wasting, in real dollars.
The role can only read - Get, Describe, List, nothing else. Read the exact permissions before you deploy it, and delete the stack whenever you want.
Frequently asked questions
How much does cross-AZ data transfer cost on AWS?+
$0.01/GB in each direction between Availability Zones in the same region - so $0.02 per GB for a full round trip. It applies to almost anything that talks across AZs: EC2 to EC2, RDS Multi-AZ replication, ElastiCache, and EKS pod-to-pod traffic.
Why am I being charged for traffic inside my own region?+
Because 'inside the region' is not the same as 'inside the AZ'. Only traffic within a single Availability Zone on private IPs is free. The moment a request crosses to another AZ - which high-availability setups do constantly - it costs $0.01/GB each way.
Does a multi-AZ setup increase data transfer costs?+
Yes. Spreading services across AZs is the right call for availability, but every cross-AZ request now bills $0.01/GB each way. A chatty microservice fabric at moderate scale can quietly run over $1,000/month in cross-AZ charges alone.
Is ALB cross-zone load balancing free?+
Yes. Application Load Balancers always do cross-zone load balancing and AWS does not charge for the cross-AZ traffic between the ALB and its targets. Network Load Balancers are different: cross-zone is off by default, and enabling it adds the $0.01/GB each-way charge.
How do I reduce cross-AZ data transfer costs?+
Keep services that talk to each other in the same AZ (AZ affinity), so their traffic never crosses a boundary. For stateless workloads behind an NLB, leaving cross-zone load balancing off keeps traffic in-zone. And check whether a Multi-AZ database is needed for a non-production workload - Single-AZ removes the replication traffic entirely.
Should I disable cross-zone load balancing to save money?+
On a Network Load Balancer, often yes - for stateless targets, leaving it off keeps traffic in the same AZ and avoids the cross-AZ charge with no real downside. On an ALB you cannot disable it, but ALB cross-zone traffic is not charged, so there is nothing to save there.
Where does cross-AZ traffic show up on my bill?+
It hides inside EC2-Other, usually under a usage type ending in 'DataTransfer-Regional-Bytes'. There is no line that says 'cross-AZ', which is exactly why it goes unnoticed for so long.
Related cost breakdowns
Why your AWS NAT gateway is so expensive - and how to cut it
NAT gateway charges compound: ~$0.045/GB processing plus ~$0.09/GB egress. Most of it is AWS-to-AWS traffic that never needed NAT. Gateway VPC endpoints drop it to $0.
Why your AWS data transfer bill is so high - and how to cut it
Data transfer hides across three charges: $0.09/GB out to the internet, $0.045/GB through a NAT gateway, and $0.01/GB each way between AZs. Here is where it comes from and how to cut it.
Idle load balancers cost ~$16/month each - even with zero traffic
An ALB or NLB with no traffic still bills about $16 to $22/month just to exist. Here is how to find load balancers with no healthy targets and shut them down.
Why AWS is charging you for public IPv4 addresses
Since February 2024 every public IPv4 address costs $0.005/hour (~$3.60/month), attached or idle. Idle Elastic IPs are pure waste. Here is how to find and release them.