AWSの複数アカウントのAZ名の対応を調査する

# AZ名と実データセンターの対応はアカウント毎に異なるということ
AWSのアベイラビリティゾーン名（以下AZ名）と実データセンターの対応は実はユーザ毎に異なります。
これは多分使用されるAZが偏ることを防止する為だと思われます（一番上のAZを選ぶユーザが多いと予想される）が、まぁ真相はわかりません(^^;


## AZ名の対応不一致に関わる問題
AZの不一致はアカウント間のデータ転送料金に影響してきます。
同一AZ同士の通信（Availability Zone Data Transfer）は無料ですが、同一リージョンの別AZ間の通信（Regional Data Transfer）は低価格ながら料金が発生するからです。

要はアカウントAの`ap-northeast-1a`とアカウントBの`ap-northeast-1a`の間で通信を行う際は、どちらも`ap-northeast-1a`というAZ名ですが、それぞれのAZ名が本当に同一AZなのかどうかを確認しておかない限りはそのデータ転送が無料なのか有料なのかが不定で困ります。

まぁ、AZ間通信の料金はそんな高くないから神経質になる程のものではないんだけど、知らないままよりは把握してた方が気分が良いし確認手段は持っておいて損はないからね。

あとそこまで神経質になる程ではないだろうけどレイテンシにも影響しますね。

## アカウント間のAZ名対応の確認方法

まず公式にはこれを確認できる画面のようなものはありません。なので自分で何かしらの手段で調べる他ありません。

最初に簡単に思いつくのはグローバルIPのアドレス帯を比べてみたり、アカウント間でtracerouteしてホップ数を調べたりする方法ですが、結構これ面倒くさいです。それに調査のためにインスタンスを起動したり実際に通信を行ってみる必要があるため多少ながらもお金がかかってしまいます。

そこでオススメなのがスポットインスタンスの料金履歴を比較する方法です。アカウントAのあるAZのスポット料金グラフと、アカウントBのあるAZのスポット料金のグラフが一致していればそれは同じAZと断定してよいはずです。というか全インスタンスタイプ×全OSタイプ×全時間変化の履歴が全て一致していれば断定というより完全一致とみなしてよいでしょう。
この手法の良い所はプログラマブルに処理しやすいことと、調査にかかる費用はゼロということです。

# 調査用スクリプトを作った

ここでは1日分のスポットインスタンスの価格履歴情報を使うことで、手っ取り早く、しかも無料で調査する方法をとってみます。 その調査用スクリプトが以下です。

```bash:calc-aws-az-hash.sh
#!/bin/bash
ec2-describe-regions |
while read dummy region dummy; do
  for az in a b c d; do
    history="$(ec2-describe-spot-price-history \
      --region $region \
      -s "$(date -u -d "2 day ago" +%Y-%m-%dT00:00:00)" \
      -e "$(date -u -d "1 day ago" +%Y-%m-%dT00:00:00)" \
      -a $region$az 2>/dev/null | sed -e s/$region$az// | sort
    )"
    if [[ -n $history ]]; then
      echo "$region$az $(sha1sum<<<"$history")"
    fi
  done
done
```

※ 実行の前提として、Access KeyとSecret Access Keyが環境変数`AWS_ACCESS_KEY`と`AWS_SECRET_KEY`で設定されているか、または実行中インスタンスにIAMロールが設定されている必要があります。


## 使い方
上記スクリプトは[Gist](https://gist.github.com/kawaz/6103296)に保存してあるので以下のように実行可能です。

```bash:
curl -L https://gist.github.com/kawaz/6103296/raw/a33282169bff70aa53b09338b6f125fd3185fe8f/calc-aws-az-hash.sh | bash
```
    

これを各アカウントのアクセスキーで実行してやることでAZ毎の1日分の料金表のハッシュ値を一覧できます。この値を複数アカウント間で比べることでAZ名の対応を確認することが出来ます。

※ 直近の1日分を元にハッシュを計算しているので別の日に取得したハッシュ値リストを比べても無意味です。同じ日に複数アカウントで実行して比べてください。

## 実行例

###アカウントAでの出力

    eu-west-1a 17e8315fe5b4aa486ec536ce810e4bf24309ba02  -
    eu-west-1b 12549e7c02ad5b65be4cbc7bb55e2a4a76a58fcd  -
    eu-west-1c f8f899d9a8c4cd31de6e54bca6863526323bd6e8  -
    sa-east-1a 21eff3974acec88e893bbab897db977636892aa1  -
    sa-east-1b 161d52ac3341fcb9a18679216756ad95ab97069e  -
    us-east-1b 316a5a3a7322481e3838a1fa214f7ca642d83035  -
    us-east-1c 3122bb9130554d086ddf0fc8b0c84f6bed89df55  -
    us-east-1d 4872eaa5b1b3c1075a46ffd2cf03ae8af8efcb51  -
    ap-northeast-1a e16e96781d6194cb96c03bd965d6a1a0bd029d2e  -
    ap-northeast-1c f62f5300138346db4f84c33cd86deb11574e5501  -
    us-west-2a 7f5833cfb883ac6839be234ec03d0975985a0b79  -
    us-west-2b 99bcfa3f2e0b8c257846b0af350c173ac7a6b12f  -
    us-west-2c 490c895ae3bca355b1d6b7e58ce7132091ac779a  -
    us-west-1a e9163d61923a35da64a407505d267f8217c9e661  -
    us-west-1c e17e8905b08e7e3d7a3625579f55788567a565db  -
    ap-southeast-1a b8b2a38f9168b62eb2b7d036fd826b1620277531  -
    ap-southeast-1b 16cad4e6d6cc0e6b109fdb67ca1fbebc967fa005  -
    ap-southeast-2a 0b71661f82e3ffa9c517db94d96649e1ae357f67  -
    ap-southeast-2b 349e1da2a79e421387af116c31faf5a737af210d  -

### アカウントBでの出力

    eu-west-1a f8f899d9a8c4cd31de6e54bca6863526323bd6e8  -
    eu-west-1b 17e8315fe5b4aa486ec536ce810e4bf24309ba02  -
    eu-west-1c 12549e7c02ad5b65be4cbc7bb55e2a4a76a58fcd  -
    sa-east-1a 21eff3974acec88e893bbab897db977636892aa1  -
    sa-east-1b 161d52ac3341fcb9a18679216756ad95ab97069e  -
    us-east-1a 3122bb9130554d086ddf0fc8b0c84f6bed89df55  -
    us-east-1b 4872eaa5b1b3c1075a46ffd2cf03ae8af8efcb51  -
    us-east-1d 316a5a3a7322481e3838a1fa214f7ca642d83035  -
    ap-northeast-1a e16e96781d6194cb96c03bd965d6a1a0bd029d2e  -
    ap-northeast-1c f62f5300138346db4f84c33cd86deb11574e5501  -
    us-west-2a 99bcfa3f2e0b8c257846b0af350c173ac7a6b12f  -
    us-west-2b 7f5833cfb883ac6839be234ec03d0975985a0b79  -
    us-west-2c 490c895ae3bca355b1d6b7e58ce7132091ac779a  -
    us-west-1a e17e8905b08e7e3d7a3625579f55788567a565db  -
    us-west-1b e9163d61923a35da64a407505d267f8217c9e661  -
    ap-southeast-1a b8b2a38f9168b62eb2b7d036fd826b1620277531  -
    ap-southeast-1b 16cad4e6d6cc0e6b109fdb67ca1fbebc967fa005  -
    ap-southeast-2a 349e1da2a79e421387af116c31faf5a737af210d  -
    ap-southeast-2b 0b71661f82e3ffa9c517db94d96649e1ae357f67  -

### 判明した対応表

|アカウントA|アカウントB|ハッシュ値|
|:--|:--|:--|
|eu-west-1a|eu-west-1b|              17e8315fe5b4aa486ec536ce810e4bf24309ba02|
|eu-west-1b|eu-west-1c|              12549e7c02ad5b65be4cbc7bb55e2a4a76a58fcd|
|eu-west-1c|eu-west-1a|              f8f899d9a8c4cd31de6e54bca6863526323bd6e8|
|sa-east-1a|sa-east-1a|              21eff3974acec88e893bbab897db977636892aa1|
|sa-east-1b|sa-east-1b|              161d52ac3341fcb9a18679216756ad95ab97069e|
|us-east-1b|us-east-1d|              316a5a3a7322481e3838a1fa214f7ca642d83035|
|**us-east-1c**|**us-east-1a**|              3122bb9130554d086ddf0fc8b0c84f6bed89df55|
|us-east-1d|us-east-1b|              4872eaa5b1b3c1075a46ffd2cf03ae8af8efcb51|
|ap-northeast-1a|ap-northeast-1a|    e16e96781d6194cb96c03bd965d6a1a0bd029d2e|
|ap-northeast-1c|ap-northeast-1c|    f62f5300138346db4f84c33cd86deb11574e5501|
|us-west-2a|us-west-2b|              7f5833cfb883ac6839be234ec03d0975985a0b79|
|us-west-2b|us-west-2a|              99bcfa3f2e0b8c257846b0af350c173ac7a6b12f|
|us-west-2c|us-west-2c|              490c895ae3bca355b1d6b7e58ce7132091ac779a|
|us-west-1a|us-west-1b|              e9163d61923a35da64a407505d267f8217c9e661|
|us-west-1b|us-west-1a|              e17e8905b08e7e3d7a3625579f55788567a565db|
|ap-southeast-1a|ap-southeast-1a|    b8b2a38f9168b62eb2b7d036fd826b1620277531|
|ap-southeast-1b|ap-southeast-1b|    16cad4e6d6cc0e6b109fdb67ca1fbebc967fa005|
|ap-southeast-2a|ap-southeast-2b|    0b71661f82e3ffa9c517db94d96649e1ae357f67|
|ap-southeast-2b|ap-southeast-2a|    349e1da2a79e421387af116c31faf5a737af210d|

※ところでこの例だと **us-east-1** がそうなんですが、アカウント毎にAZ名の対応が違うどころかアカウントによっては同名のAZが無いなんてこともあります。こういう場合は更に別の問題も発生しうるので注意しまましょう。（[こちらの記事](http://qiita.com/kawaz/items/3bfdec221ee1485b7d0c)の注意点参照）