How much does AWS data transfer cost between AZs in the same region?

It seems like there should be a straightforward answer to this question.  But there’s nuance and ambiguity I keep running into. As it turns out, AWS’s documentation is wrong—or at least, incredibly misleading.

For data transfer between AZs, AWS says the following: 

And here’s the pricing table between regions:

This table clearly suggests that data transfer is twice as much between regions as it is between different availability zones. (Data still wants to get the hell out of Ohio.)

However, this is incorrect.

As it turns out, they cost the same and the documentation is wrong.

How can it possibly be this hard to figure out?

For a while now, this topic has been the subject of some debate among those of us who obsess about AWS billing (yeah, we’re all a riot at parties). 

Even trying to get clarity on this from AWS is difficult, as the question itself is complex to even articulate. It turns out that finding the handful of people who are able to state a definitive answer is asking for a lot.

After a lengthy discussion with yet another AWS Principal Engineer who didn’t know the answer, I decided to just figure it out myself: Let’s chuck 10GB of data across AZs and regions and see what happens to the bill.

Hurling data for fun (and…no profit?)

I spun up two EC2 instances in a non free-tier account: one in us-west-2a and another in us-west-2b. I told one to listen on a TCP port with trusty netcat: nc -l 7000 > /dev/null

I logged into the other and pelted 10GB of traffic at the unsuspecting instance with good ol’ dd: dd if=/dev/zero bs=1024 count=$[1024*1024 * 10] |nc -q 0 $OTHER_INSTANCE 7000

When the transfer completed, I shut down both instances and waited a day, since the AWS Billing system isn’t exactly real time (little known fact: there’s anywhere between a four-hour and five-day delay, depending on various things). 

For completeness, I spun up two more EC2 instances and repeated this experiment—but this time between two regions (Virginia and Oregon) and in a separate account so as not to deal with bill contamination from the previous experiment.

Results

The following morning, my bill yielded the answers: I was charged exactly 20¢ for 20GB of data transfer in us-west-2.

Wait, what? That should be 10¢, right? Well, not quite:

Data transferred “in” to and “out” from … across Availability Zones … in the same AWS Region is charged at $0.01/GB in each direction.

That last “$0.01/GB in each direction” is the misleading bit. Effectively, cross-AZ data transfer in AWS costs 2¢ per gigabyte and each gigabyte transferred counts as 2GB on the bill: once for sending and once for receiving.

As for the inter-region experiment, the results show I was billed 20¢ on the sending side and nothing on the receiving side, which is exactly what you would expect per the documentation. 

In summary, AWS’s data transfer pricing documentation has thus been misunderstood for a long period of time–and the cheapest data transfer in all of AWS is between Virginia and Ohio.

But I think I’ve finally put this debate to rest. Now, they just need to make this incredibly clear in the documentation; it’s misleading at best today.

One thing is definitely clear, though: AWS owes me 40¢.