Transit Gateway の AZ間通信において、同じAZを使って通信するという仕様(レイテンシ重視のため)があります。
この仕様により、同一AZを跨いだ場合と異なるAZへの場合の通信は下記のようになります。

  • 同一AZを跨いだ通信の場合

VPC A のEC2からの通信は同一AZのTransit GatewayのENI → TransitGateway → VPC B の同一AZのTransit GatewayのENI → VPC B のEC2 という流れとなります。(戻りも同様の流れ)

  • 異なるAZへの通信の場合

一方で異なるAZへの通信場合、VPC B の同一AZのTransit GatewayのENI までの通信は同一AZ通信と同じ流れとなりますが、
戻りの通信も「同じAZを使って通信する」ことになるため、行きと戻りが異なる非対称ルーティングとなります。

AWSドキュメントにも非対称ルーティングとなる内容の記載があります。

■AWS Transit Gatewayトラフィックフローと非対称ルーティング

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/inline-traffic-inspection-third-party-appliances/transit-gateway-asymmetric-routing.html

基本的には、存在するサブネット(AZ)すべてに対してTransit Gatewayを紐づける形となりあまり問題にはならないとか思いますが、通信可能なパターン・不可のパターンをそれぞれ下記にまとめました。

  • 送信元に同一AZが存在しない場合

送信元の同一AZにTransit GatewayのENIが存在しないため、通信不可となります。

  • 送信先に同一AZが存在しない場合
    送信先の同一AZにTransit GatewayのENIが存在しないため通信不可。と思いきやTransitGatewayがよしなに振り分けてくれるようで、通信可能となります。
    (送信先に同一AZが存在しない場合は存在するAZのENI”いずれか”に出力され通信できる。)

存在するAZのENI“いずれか”に出力される。という事で複数AZが存在する場合は都度送信先AZが変わる事になります。

下記の構成の場合、行きの通信は、VPC B の AZ-dとなりますが、戻りの通信は、VPC A の AZ-a , AZ-cの”いずれか“となります。
送信先AZにてルートテーブル情報が異なる場合、通信毎に挙動が異なるといった事も起こり得るので注意が必要です。

まとめ

という事でまとめですが、Transit Gateway の VPC間接続を設計する際は以下内容を意識しましょう。

  • 異なるAZへの通信は非対称ルーティングとなる。
  • 送信先に同一AZが存在しない場合もTransit Gatewayがよしなに通信を振り分けてくれる。よって通信させるVPCのサブネット(AZ)構成をあわせる必要はない。
  • よしなに通信を振り分けてくれるが採用されるルートテーブルの情報も意識しよう。
  • 送信元に同一AZが存在しない場合は通信できなくなるので、基本的には、存在するサブネット(AZ)すべてにTransit Gatewayを紐づけるようにしましょう。