AWS Transit Gateway外接集約構成のルーティングはAZを意識する

2019.10.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、ゲストの大瀧です。
AWS Transit GatewayはVPCの相互接続をVPCピアリング接続のメッシュ型からハブアンドスポーク型に進化させる、VPCの比較的新しい機能です。外接集約構成というのはインターネットなどAWSの外部への接続をTransit Gateway経由で特定のVPCに集約し、集中管理する構成を指します。

我ながら難解なタイトルを付けたと自覚していますが、本記事ではそんな外接集約構成におけるTransit Gateway(以下TGW)の興味深い挙動を見つけたのでシェアします。

Transit Gatewayで2つのVPCの相互接続

まずは、前提となるVPCの相互接続構成からおさらいします。
2つのVPC(VPC-AとVPC-B)をTGWで相互接続する場合、TGWを介すルーティングとして以下を設定します。

  • VPC-A
    • VPCサブネットのルートテーブルでVPC-B宛てをTGWに指定
  • TGW
    • TGWルートテーブルでVPC-A宛てをVPC-Aに設定
    • TGWルートテーブルでVPC-B宛てをVPC-Bに設定
  • VPC-B
    • VPCサブネットのルートテーブルでVPC-A宛てをTGWに指定

TGWルートテーブルでPropagationsを有効にすれば、TGWのルーティング2つを自動設定にすることができますね。また、VPCを複数AZ(アベイラビリティゾーン)で構成する場合、TGWアタッチメントの設定で各AZごとに1つのサブネットを選択する必要があります。

Transit Gatewayで外接を集約するVPCを構成

ここからが今回の本題です。複数のVPCからインターネット接続など外接を集約する構成で、これらのルーティングがどうなるかを考えます。複数のVPC(VPC-A、VPC-B、VPC-C...)に加えて外接を集約するVPC(VPC-X)をTGWに接続、各VPCからのデフォルトルート(0.0.0.0/0)をVPC-XにあるNAT Gatewayに向ける構成です。

先ほどの相互接続をベースとし、デフォルトルートをVPC-Xに向ける設定を追加すると...

  • VPC-A
    • VPCサブネットのルートテーブルでデフォルトルートをTGWに指定 -①
  • TGW
    • TGWルートテーブルでVPC-A宛てをVPC-Aに設定
    • TGWルートテーブルでデフォルトルートをVPC-Xに設定 -②
  • VPC-X(外接集約)
    • VPCサブネットのルートテーブルでVPC-A宛てをTGWに指定
    • TGWアタッチメントで選択するVPCサブネットのルートテーブルでデフォルトルートをNAT Gatewayに指定-③
    • NAT GatewayのVPCサブネットのルートテーブルでデフォルトルートをIGWに指定 -④

(単純化のため、VPC-BとVPC-Cの設定は省略)

VPC-Xの設定が込み入ってきました。図に示すと以下の感じです。丸数字の通りにトラフィックがルーティングされていきます。

理屈としてはこんな感じなのですが、設定していてひとつ疑問が出てきました。②で VPC-X全体 を指定しているのに対して③を設定しているのは VPCサブネット であり、TGWアタッチメントではAZごとにサブネットを選んでいるので、複数AZ構成ではアタッチメントに紐付くVPCサブネットが複数あるわけです。 どのVPCサブネットのルートテーブルが利用されるのでしょうか?

どうやら、 送信元(VPC-A)のVPCサブネットが所属するAZと同じAZのVPCサブネット のルーティングテーブルが採用されることがわかりました。例えば、AZ IDapne1-az2のVPCサブネットから送出されるトラフィックはTGW通過後、同じapne1-az2にアタッチされているVPC-XのVPCサブネットのルートテーブルによりNAT Gatewayにルーティングされます。

検証としては、TGWにAZ IDapne1-az2apne1-az4のVPCサブネットをアタッチし、apne1-az4のVPCサブネットのみNAT Gatewayに向けるルーティングを設定してみました。すると、VPC-AのAZ IDapne1-az2にあるVPCサブネットからNAT Gatewayには通信できませんでした。

構成を変えずにVPC-AのAZ IDapne1-az4のVPCサブネットから試してみると、こちらはNAT Gatewayに通信できました。

TGWでアタッチするVPCサブネットのルーティングテーブルは同じ設定にすることが多いと思いますが、一方で送信元のVPCのAZと集約するVPCのAZの関連性に気づかず、集約するVPCにアタッチするAZが少なくて特定AZからNAT Gatewayへの通信ができない、といったトラブルになりそうです。NAT Gatewayに限らず、vRXのようなEC2ベースのVPN接続を集約する場合も同様のトラブルが考えられます。

まとめ

どう構成するのが良いでしょうか。TGWに接続する全てのVPCの構成が把握できるのであれば、各VPCで使用する全てのAZを集約するVPCへのアタッチメントに含めるべきですし、クロスアカウントなどTGWに接続してくるVPCのAZの把握が難しい環境であれば、集約するVPCで選択できる全てのAZをアタッチメントに含めるのが良いでしょう。

ちなみにNAT Gatewayを配置するAZは今回の設定とは関係ありません(集約するVPCのVPCサブネットのルートテーブルに従う)ので、全てのAZを選択する必要はありません。

参考URL