AWSネットワーク通信の罠！シングル・マルチAZ間の非対称ルーティングとTGWアプライアンスモードの実践ガイド

## 概要
本記事では、AWS環境においてシングルAZとマルチAZ間の通信で発生する非対称ルーティングの問題について解説します。特に、Transit Gateway（TGW）のアプライアンスモード機能を活用した解決策に焦点を当て、実装方法やベストプラクティスを紹介します。複雑なネットワーク構成を持つAWS環境を運用する際に直面する可能性のある通信の問題を理解し、効率的に解決するための知識を得ることができます。

## 目次
1. はじめに
2. AWSのAZ間通信の基礎知識
3. 非対称ルーティングとは
4. Transit Gateway (TGW) の役割
5. TGWアプライアンスモードとは
6. 実装例：非対称ルーティング問題の解決
7. ベストプラクティスと注意点
8. 終わりに

## 1. はじめに

クラウド環境の設計において、可用性と信頼性を確保するためにマルチAZ構成を採用することは一般的なプラクティスです。しかし、AWS環境でのシングルAZとマルチAZ間の通信では、意図せずに非対称ルーティングが発生し、予期せぬネットワーク問題を引き起こす可能性があります。

AWSの公式ドキュメント[1]によると、特にセキュリティアプライアンスを使用する環境では、トラフィックが往路と復路で異なる経路を通ることによって通信の問題が発生することがあります。この問題を解決するために、Transit Gateway（TGW）のアプライアンスモードという機能が提供されています。

本記事は、AWSクラウド環境でのネットワーク設計に関わるエンジニア、特にマルチAZ構成やセキュリティアプライアンスを利用している方々を対象としています。非対称ルーティングの問題を理解し、TGWアプライアンスモードを活用して解決する方法について解説します。

## 2. AWSのAZ間通信の基礎知識

### AZ（アベイラビリティゾーン）の概要と役割

AWSのアベイラビリティゾーン（AZ）は、同一リージョン内の独立した物理的なデータセンターで、それぞれが冗長な電源、ネットワーク、冷却設備を持っています。AWSの公式ドキュメント[2]によれば、この設計により、単一障害点の排除と高可用性の実現が可能になっています。

各AZは物理的に分離されていますが、低レイテンシーで高スループットのネットワークで接続されているため、リージョン内のAZ間通信は比較的高速です。

### シングルAZとマルチAZ構成の比較

シングルAZ構成とマルチAZ構成の主な違いを表で示します：

| 特性 | シングルAZ構成 | マルチAZ構成 |
|------|---------------|-------------|
| 可用性 | 低（単一障害点あり） | 高（冗長性あり） |
| コスト | 低い | 高い（複数AZにリソースを配置） |
| データ転送料金 | AZ内のみ（無料） | AZ間通信が発生（有料） |
| 通信レイテンシー | 低い | AZ間では若干高い |
| 障害耐性 | AZ障害に弱い | AZ障害に強い |
| 実装複雑性 | 単純 | 複雑（ルーティング設計が必要） |

AWSの公式料金表[3]によると、同一リージョン内のAZ間データ転送には料金が発生するため、コスト面でもマルチAZ構成は考慮が必要です。

### AZ間通信の仕組みと特性

AWS環境におけるAZ間通信は、AWS内部のバックボーンネットワークを介して行われます。これにより、パブリックインターネットを経由せずに高速な通信が可能になります。

しかし、マルチAZ構成では複数の経路が存在するため、トラフィックのフローが複雑になり、特にVPC間接続を行う場合や、TGWを使用する場合に非対称ルーティングが発生しやすくなります。

## 3. 非対称ルーティングとは

### 非対称ルーティングの定義と基本概念

非対称ルーティングとは、ネットワークパケットが送信元から宛先へ向かう経路（往路）と、宛先から送信元へ戻る経路（復路）が異なる状態を指します。

通常のネットワーク通信では、対称ルーティングが望ましいとされています。特に、ステートフルインスペクションを行うファイアウォールなどのセキュリティアプライアンスを使用する環境では、往復のパケットが同じアプライアンスを通過する必要があります。

クラウド環境の大規模なネットワークでは、非対称ルーティングが発生しやすく、特に複雑なトポロジでは意図せず発生することがあります。

### AWS環境での非対称ルーティングが発生するシナリオ

AWS環境で非対称ルーティングが発生する主なシナリオには以下のようなものがあります：

1. 複数のAZにまたがるセキュリティアプライアンス構成
2. マルチVPC環境でのTGW利用時
3. 異なるタイプのVPC接続（VPCピアリング、TGW、VPN接続など）の混在
4. 非対称なルートテーブル設定

特に、セキュリティアプライアンス（ファイアウォールやIDS/IPSなど）を導入した環境では、AWSの公式ドキュメント[5]が指摘するように、トラフィックが往路と復路で異なるアプライアンスインスタンスを通過すると、予期せぬ通信障害が発生します。

### 非対称ルーティングによって起こる問題

非対称ルーティングによって発生する主な問題は以下の通りです：

1. **ステートフルファイアウォールでの接続切断**: ステートフルインスペクションを行うファイアウォールでは、往路と復路のパケットが同じファイアウォールインスタンスを通過しないと、復路のパケットが「未確立の接続」として遮断される

2. **パケット損失とタイムアウト**: 経路の非対称性により、一部のパケットが正しく到達しない、または遅延が大きくなり、アプリケーションのタイムアウトが発生する

3. **トラブルシューティングの複雑化**: 通信経路が非対称であるため、問題の切り分けや原因特定が困難になる

4. **セキュリティ監視の不整合**: 往路と復路で異なるセキュリティ機器を通過するため、通信の全体像を把握できなくなる

このような問題を解決するためにTGWのアプライアンスモードが推奨されています。

## 4. Transit Gateway (TGW) の役割

### Transit Gatewayの基本機能と特徴

AWS Transit Gateway（TGW）は、複数のVPCやオンプレミスネットワークを接続するためのハブアンドスポーク型のネットワークサービスです。AWSの公式ドキュメント[6]によると、TGWは以下の特徴を持ちます：

- 複数のVPCの集中管理
- リージョン内での高可用性
- スケーラブルなネットワーク接続
- シンプルなルーティング管理
- オンプレミス接続との統合

TGWを使用することで、フルメッシュ型のVPCピアリング接続に比べて、接続管理の複雑さを大幅に低減できます。

### TGWの標準ルーティング動作

標準的なTGWのルーティング動作では、トラフィックは最も具体的なルート（longest match,最もプレフィックス長が長い宛先IPアドレスを優先）に従ってルーティングされます。AWSの公式ドキュメント[7]では、TGWのルーティング動作について次のように説明されています：

1. 各アタッチメント（VPCなど）からのトラフィックは、TGWルートテーブルに従ってルーティングされる
2. デフォルトでは、トラフィックは最も効率的な経路で宛先に到達する
3. 複数のAZにまたがる場合、TGWは送信元と同じAZの出口を優先する

この標準的な動作は効率的ですが、ファイアウォールなどのセキュリティアプライアンスを導入した環境では、非対称ルーティングを引き起こす可能性があります。

### マルチVPC・マルチAZ環境でのTGWの重要性

複雑なAWS環境、特に複数のVPCやAZにまたがる構成では、TGWは以下の点で重要な役割を果たします：

1. **接続の簡素化**: N個のVPC間の接続数をN×(N-1)/2から最大でN個まで削減
2. **一元的なルーティング管理**: 集中管理により、ルーティングポリシーの一貫性を確保
3. **スケーラビリティ**: VPCの増加に伴うネットワーク構成の変更を最小限に抑制
4. **セキュリティ**: 集中型のセキュリティ検査ポイントを確立可能

しかし、このようなマルチVPC・マルチAZ環境では、TGWのデフォルト動作により非対称ルーティングが発生しやすくなります。この問題に対処するために、次のセクションで説明するTGWアプライアンスモードが必要になるのです。

## 5. TGWアプライアンスモードとは

### アプライアンスモードの概要と目的

TGWのアプライアンスモードは、セキュリティアプライアンスを使用する環境で非対称ルーティングの問題を解決するために設計された機能です。AWSの公式ドキュメント[9]によると、このモードは特にステートフルインスペクションを行うファイアウォールアプライアンスを使用する場合に有用です。

アプライアンスモードの主な目的は、トラフィックの往路と復路が同じAZのアプライアンスを通過するようにルーティングを制御することです。これにより、ステートフルインスペクションの整合性が保たれ、通信の信頼性が向上します。

### アプライアンスモードの動作原理

TGWアプライアンスモードが有効な場合、トラフィックの動作は以下のように変化します：

**通常モード（デフォルト）：**
- 送信元から宛先へのトラフィック（往路）は送信元と同じAZのTGWアタッチメントを使用
- 宛先から送信元へのトラフィック（復路）は宛先と同じAZのTGWアタッチメントを使用
- 結果として異なるAZのアタッチメントが使用される可能性がある

**アプライアンスモード：**
- 送信元から宛先へのトラフィック（往路）は送信元と同じAZのTGWアタッチメントを使用
- 宛先から送信元へのトラフィック（復路）も送信元と同じAZのTGWアタッチメントを使用
- 結果として往復で同じAZのアタッチメントが使用される

AWSのホワイトペーパー[8]では、この動作によりステートフルインスペクションの整合性が保証され、通信の安定性が向上すると説明されています。

### アプライアンスモードの設定方法

TGWアプライアンスモードは、VPCアタッチメントレベルで設定します。AWS CLIまたはマネジメントコンソールから設定可能です。

AWS CLIを使用した設定方法：

```bash
aws ec2 create-transit-gateway-vpc-attachment \
  --transit-gateway-id tgw-12345678901234567 \
  --vpc-id vpc-12345678901234567 \
  --subnet-ids subnet-12345678901234567 subnet-23456789012345678 \
  --options ApplianceModeSupport=enable

# 既存のアタッチメントを更新する場合
aws ec2 modify-transit-gateway-vpc-attachment \
  --transit-gateway-attachment-id tgw-attach-12345678901234567 \
  --options ApplianceModeSupport=enable
```

AWSマネジメントコンソールでの設定手順：

1. VPCダッシュボードにアクセス
2. 左側のナビゲーションペインから「Transit Gateway Attachments」を選択
3. 対象のアタッチメントを選択し、「Actions」ドロップダウンから「Modify」を選択
4. 「Appliance Mode Support」を「Enable」に設定
5. 「Modify attachment」をクリック

AWSの公式ドキュメント[9]では、セキュリティアプライアンスを使用する場合は、関連するすべてのVPCアタッチメントでアプライアンスモードを有効にすることが推奨されています。

## 6. 実装例：非対称ルーティング問題の解決

### サンプルアーキテクチャの紹介

以下に、非対称ルーティングの問題が発生する典型的なシナリオと、TGWアプライアンスモードによる解決策を示すサンプルアーキテクチャを紹介します。

このアーキテクチャは以下の要素で構成されています：

1. **中央セキュリティVPC**: ファイアウォールアプライアンスが配置され、すべてのVPC間トラフィックを検査
2. **アプリケーションVPC**: 複数のAZにまたがるアプリケーションサーバーが配置
3. **データベースVPC**: 複数のAZにまたがるデータベースサーバーが配置
4. **Transit Gateway**: すべてのVPCを接続するハブとして機能

### TGWアプライアンスモードの設定手順

このシナリオでTGWアプライアンスモードを設定する手順は以下の通りです：

1. **セキュリティVPCのTGWアタッチメント設定**:
```bash
aws ec2 modify-transit-gateway-vpc-attachment \
  --transit-gateway-attachment-id tgw-attach-security-vpc \
  --options ApplianceModeSupport=enable
```

2. **アプリケーションVPCのTGWアタッチメント設定**:
```bash
aws ec2 modify-transit-gateway-vpc-attachment \
  --transit-gateway-attachment-id tgw-attach-app-vpc \
  --options ApplianceModeSupport=enable
```

3. **データベースVPCのTGWアタッチメント設定**:
```bash
aws ec2 modify-transit-gateway-vpc-attachment \
  --transit-gateway-attachment-id tgw-attach-db-vpc \
  --options ApplianceModeSupport=enable
```

4. **TGWルートテーブルの確認**:
すべてのトラフィックがセキュリティVPCを経由するように適切なルートが設定されていることを確認します。

すべてのVPCアタッチメントでアプライアンスモードを有効にすることで、最適な結果が得られるとされています。

### 設定前後の通信フローの変化

アプライアンスモード設定前後の通信フローの変化を見てみましょう：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071751/dd90b792-3970-4a7e-a4b2-32eb48210d27.png)

青が行きの通信、赤が戻りの通信です。上記の図では、アプリのみがマルチAZ構成で、RDSやFirewallがシングルAZの場合を想定しています。アプラインスモード設定前では、AZ-aのアプリからの通信の場合でも、RDSやFirewallがAZ-cにしかないため、そちらにルーティングします。ここで、問題になるのがアプリへの戻りの通信です。RDSやFirewallがAZ-cを通っているので、通常ではアプリもAZ-cの方へ通信がいきます。これを、AZ-aの方にルーティングするのがアプライアンスモードです。

**設定前**:
1. アプリケーションVPC（AZ-a）からデータベースVPC（AZ-c）へのリクエスト：
   - アプリケーションVPC（AZ-a） → セキュリティVPC（AZ-c）のファイアウォール → データベースVPC（AZ-c）
2. データベースVPC（AZ-c）からアプリケーションVPC（AZ-c）への応答：
   - データベースVPC（AZ-c） → セキュリティVPC（AZ-c）のファイアウォール → アプリケーションVPC（AZ-a）
3. 結果：往路と復路で異なるファイアウォールインスタンスを通過するため、復路のパケットが遮断される

**設定後**:
1. アプリケーションVPC（AZ-a）からデータベースVPC（AZ-c）へのリクエスト：
   - アプリケーションVPC（AZ-a） → セキュリティVPC（AZ-c）のファイアウォール → データベースVPC（AZ-c）
2. データベースVPC（AZ-c）からアプリケーションVPC（AZ-c）への応答：
   - データベースVPC（AZ-c） → セキュリティVPC（AZ-a）のファイアウォール → アプリケーションVPC（AZ-a）
3. 結果：往路と復路で同じファイアウォールインスタンスを通過するため、通信が正常に行われる

この設定変更により、パケット損失やタイムアウトなどの問題が解消され、アプリケーションの安定性が向上すると報告されています。

## 7. ベストプラクティスと注意点

### TGWアプライアンスモード使用時の注意点

TGWアプライアンスモードを使用する際の主な注意点は以下の通りです：

1. **AZ間トラフィックの増加**: アプライアンスモードにより、AZ間のトラフィックが増加する可能性があります。AWSの公式ドキュメント[10]によると、これにより追加のデータ転送コストが発生する場合があります。

2. **フェイルオーバー動作の変化**: アプライアンスモードは、アプライアンスが存在するAZが停止した場合のフェイルオーバー動作に影響します。適切な冗長構成を検討する必要があります。

3. **すべてのアタッチメントでの一貫した設定**: 最適な結果を得るためには、関連するすべてのVPCアタッチメントでアプライアンスモードを有効にすることが推奨されています。

4. **TGWルートテーブルとの整合性**: アプライアンスモードは、適切なTGWルートテーブル設定と組み合わせて使用する必要があります。

### セキュリティグループやNACLの設定ポイント

セキュリティアプライアンスを使用する環境では、以下のセキュリティグループとNACLの設定ポイントに注意が必要です：

1. **セキュリティグループの双方向許可**: アプライアンスモードを使用しても、セキュリティグループで双方向の通信を許可する必要があります。

2. **NACLの考慮**: NACLはステートレスであるため、双方向の明示的なルールが必要です。特にアプライアンスモードを使用する場合は、すべてのトラフィックフローを考慮したNACLルールを設定してください。

3. **ファイアウォールルールの整合性**: 複数のAZにまたがるファイアウォールアプライアンスを使用する場合、すべてのインスタンスで一貫したルールセットを維持することが重要です。

### コスト最適化のためのポイント

TGWアプライアンスモードを使用する際のコスト最適化ポイントは以下の通りです：

1. **AZ間データ転送料金の考慮**: AWSの料金表[11]によると、リージョン内のAZ間データ転送には料金が発生します。アプライアンスモードによりAZ間トラフィックが増加する可能性があるため、コスト計算に含める必要があります。

2. **TGW処理料金**: TGWの処理量に応じた料金が発生します。アプライアンスモードによりトラフィックパターンが変化する可能性があるため、影響を評価してください。

3. **適用範囲の最適化**: すべてのVPC接続ではなく、セキュリティアプライアンスを通過する必要のある接続のみにアプライアンスモードを適用することで、コストを最適化できる場合があります。

## 8. 終わりに

### まとめと重要ポイントの復習

本記事では、AWS環境でのシングルAZとマルチAZ間の通信で発生する非対称ルーティングの問題と、TGWのアプライアンスモードを使用した解決策について解説しました。

重要なポイントを振り返ると：

1. 非対称ルーティングは、特にセキュリティアプライアンスを使用する環境で問題を引き起こす可能性がある
2. TGWのアプライアンスモードは、往路と復路のトラフィックが同じAZのアタッチメントを通過するようにルーティングを制御する
3. アプライアンスモードを使用する場合は、関連するすべてのVPCアタッチメントで一貫して設定することが重要
4. AZ間のデータ転送料金やセキュリティ設定にも注意が必要

### 次のステップと関連する学習リソース

この記事で学んだ内容をさらに深めるためのステップとして、以下のリソースを活用することをお勧めします：

1. **AWS公式ドキュメント**: Transit GatewayとVPCネットワーキングに関する詳細なドキュメントを参照してください。

2. **AWS Well-Architected Framework**: セキュリティとコスト最適化のベストプラクティスについて学ぶことができます。

3. **AWSネットワーキングワークショップ**: AWSが提供するハンズオンワークショップで実践的なスキルを身につけることができます。

4. **AWS Advanced Networking Specialty認定**: ネットワークに特化した認定を取得することで、知識とスキルを証明できます。

本記事が、AWS環境での非対称ルーティングの問題解決とTGWアプライアンスモードの理解に役立つことを願っています。

## 参考文献・参考サイト

[1] AWS公式ドキュメント, "Transit Gateway Appliance Mode", https://docs.aws.amazon.com/vpc/latest/tgw/transit-gateway-appliance-scenario.html

[2] AWS公式ドキュメント, "Availability Zones", https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html

[3] AWS料金表, "Amazon EC2 データ転送料金", https://aws.amazon.com/ec2/pricing/on-demand/

[4] AWS公式ドキュメント, "Transit Gateway Design Best Practices", https://docs.aws.amazon.com/vpc/latest/tgw/tgw-best-design-practices.html

[5] AWS公式ドキュメント, "Amazon VPC Transit Gateway の仕組み", https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/how-transit-gateways-work.html

[6] AWS公式ドキュメント, "Amazon VPC Transit Gateway とは", https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/what-is-transit-gateway.html

[7] AWS公式ドキュメント, "Amazon VPC Transit Gateway の仕組み", https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/how-transit-gateways-work.html#transit-gateway-appliance-scenario

[8] AWS, "Building a Scalable and Secure Multi-VPC AWS Network Infrastructure", AWS Whitepaper

[9] AWS公式ドキュメント, "Amazon VPC Transit Gateway の Amazon VPC アタッチメント", https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/tgw-vpc-attachments.html

[10] AWS公式ドキュメント, "Transit Gateway Pricing", https://aws.amazon.com/transit-gateway/pricing/

[11] AWS料金表, "AWS Transit Gateway の料金", https://aws.amazon.com/jp/transit-gateway/pricing/