Transit Gatewayを利用したVPCをアカウント間で跨いで疎通確認

# 概要
仕事でTransit GatewayをPoC環境で構築する機会があって思ったより、やることがあったので記事にしてみました。また、構築して通信を分析できるサービスも教わったので使って、経路も確認しました。

# Transit Gatewayとは
- VPC間の接続をまとめることができるサービス
- VPC間のハブの役割になるイメージ
- 異なるリージョン間での通信はTransit Gatewayが２つ必要
- 異なるアカウントでリージョンが同じならTransit Gatewayを共有が必要
[Amazon VPC Transit Gateway とは](https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/what-is-transit-gateway.html)
## メリット
- 複数のVPCを1つのTransit Gatewayに接続して、ハブ＆スポーク型のネットワークを簡単に構築可能
![ハブアンドスポーク.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/9ecfc3ca-aed7-2273-b61a-f0ad49fbe528.png)
- Transit Gatewayルートテーブルを使うので、ルート情報を一元管理できる

# Reachability Analyzerとは
- VPC内の通信を分析できるサービス
- どこで、通信が遮られているかがわかる
- 1回分析あたり、0.10$
[Reachability Analyzer](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/reachability-analyzer.html)

# 実演
実際に、アカウントAにTransit Gateway本体を作成して、それをアカウントBと共有して、同一リージョンで通信ができるかを確認する。
以下が構成図です。
![Transitgateway.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/f34308e7-96dc-e725-c59c-1a09f79518b7.png)

※Transit Gatewayの共有は省きます。
## 実際の流れ
1. アカウントA、BでVPCの作成
1. アカウントAでTransit Gatewayの作成
1. アカウントBにTransit Gateway共有（RAMの共有は一部省きます）
1. アカウントA、Bでアタッチメントの作成し、アカウントAで承諾
1. アカウントAでTransit Gatewayルートテーブルを作成（Transit Gateway本体はアカウントAにある）
1. アカウントA、BでVPCのパブリックサブネットのルートテーブル編集
1. アカウントA、BでEC2インスタンスを作成
1. Reachability Analyzerで疎通確認

## やってみた

### アカウントA、BでVPCの作成
アカウントA、BそれぞれにVPCを作成していきます。その際にVPCのCIDRブロックが被ってしまうと通信が混乱するためCIDRブロックを被らせないようにしましょう。
1. アカウントAのVPC(CIDRを10.0.0.0/16に設定)
AZに関しては検証用なのでシングルにする(アカウントBも同様)。
![アカウントAのVPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/9dbdc263-bfd4-04eb-7bac-821b98ff4383.png)

1. アカウントBのVPC(CIDRを172.0.0.0/16に設定)
![アカウントBのVPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/01da595d-e734-38a8-8cf7-8e0d8791be98.png)


### アカウントAでTransit Gatewayの作成
Transit Gateway本体を作成していきます。のちにアカウントBと共有します。
1. アカウントAでTransit Gatewayを作成する。
名前を「AccountA-tgw」にして作成をする。デフォルトルートテーブルに関しては別途作成していきたいので、チェックを外しました。
![アカウントAでTransit Gateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/d4afe56c-1252-c84a-e1fc-f9ea921d3003.png)
作成してしばらくすると状態が「Available」になります。これで、Transit Gateway本体の完成です。
![アカウントAでTransit Gateway完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/2470c894-695e-97ab-7c68-9819207fe9fb.png)

### アカウントBにTransit Gateway共有（RAMの共有は一部省きます）
1. 作成したTransit GatewayをアカウントBに共有するためアカウントAでResource Access Managerのコンソール画面へ移動し、「自分が共有」のリソースの共有でリソースの共有の作成をする
 ![RAMコンソール画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/82791ff7-2940-b075-ac09-aa4715b645a4.png)
1. 共有するリソースタイプと共有するリソースを選択します![共有するリソースタイプと共有するリソースを選択します.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/cb42a275-08b2-336d-66c6-8051533d8577.png)
1. アクセス許可の画面に移りますので、次に進みます![アクセス許可の画面に移りますので、次に進みます.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/5d8de7a7-6347-7e5b-2ed3-b7c7da41847c.png)
1. プリンシパルオプションの画面に移ります。今回は組織内のアカウントに許可するので、「自分の組織内のみを許可」を選択します。プリンシパルタイプでは今回は一つのアカウントのみですので、「AWSアカウント」を選択して共有先のAWSアカウントIDを入力します![プリンシパルオプション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/ae4b0a35-1d11-0c88-bdbb-2eb3897c3769.png)
1. 確認画面へ移るので、確認して「リソース共有を作成」をクリックします

### アカウントA、Bでアタッチメントの作成し、アカウントAで承諾
1. アカウントAでTransit Gatewayアタッチメントを作成します。VPCやサブネットを選択する場面がありますが、最初に作成したVPCを、サブネットはプライベートサブネットを選択してください![アカウントAでTransit Gatewayアタッチメントを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/58eac70c-b408-53c6-0f8f-6b452f8dc8a8.png)

1. アカウントBでアカウントAのTransit Gatewayが共有されているかを確認する
![アカウントAでTransitGatewayアタッチメントを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/3a29699c-a1c3-3fb3-4510-aef15d21887d.png)

1. アカウントAのTransit Gatewayが共有されていることを確認出来たら、アカウントAと同様にTransit Gatewayアタッチメントを作成します
1. アカウントAのTransit Gatewayアタッチメント画面でアカウントBで作成されたアタッチメントが表示されるのため、承諾する![アカウントAのTransit Gatewayアタッチメント画面でアカウントBで作成されたアタッチメントが表示されるのため、承諾する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/70adc2fa-c71c-41c9-a823-40a6212f8856.png)
※このアタッチメントのNameタグが空白なので、記入したほうがわかりやすい
1. アカウントBで状態が「Available」になっているのを確認する
![アカウントBアタッチメントの状態.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/b2ba52d2-bb41-38cd-237b-937e0a6bb903.png)

### アカウントAでTransit Gatewayルートテーブルを作成、ルートテーブルの編集
Transit Gatewayとアタッチメントを介してVPC間が通信できるようにルートテーブルを作成する。作成後に関連付けやルートの設定を行う。
1. ルートテーブルの作成をする際に今回の作業で作成したTransit GatewayIDを選択する![Transit Gatewayルートテーブルの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/f4821737-6650-b4a8-0fcb-6436e9a42f84.png)
1. 作成したルートテーブルを選択して「関連付け」で今回作成した、２つのアタッチメントを関連付ける（同時に２つのアタッチメントを関連付けることはできません。）![関連付け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/5580b77c-1325-44e3-be4b-5eb18625b1e1.png)
1. 伝番を作成します。そうすることで、自動的にルートに通信の方向がアタッチメントに行くように登録されます（2と同様、同時に作成はできない）![伝番.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/fa664b97-a586-32df-d6e1-9a5790926058.png)
1. 伝番の作成で各アタッチメントを登録したのち「ルート」に経路が登録されていることを確認![伝番からのルート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/f3ced3dd-2ebe-5e83-838b-c135dae2bad2.png)
上の画像を見る限り、登録されていますね！

### アカウントA、BでVPCのパブリックサブネットのルートテーブル編集
VPCを作成した際に一緒に作成された、パブリックサブネットのルートテーブルを編集して通信がTransit Gatewayに向くようにします。
以下のように各アカウントにルート情報を追加します。

- アカウントＡ
<table>
  <thead>
    <tr>
      <th>送信先</th> <th>ターゲット</th>
    </tr>
  </thead>
  <tr>
    <td> 172.0.0.0/16 </td> <td>Transit GatewayID</td>
  </tr>
</table>

- アカウントB
<table>
  <thead>
    <tr>
      <th>送信先</th> <th>ターゲット</th>
    </tr>
  </thead>
  <tr>
    <td> 172.0.0.0/16 </td> <td>Transit GatewayID</td>
  </tr>
</table>
 
### アカウントA、BでEC2インスタンスを作成
疎通確認の対象として、各アカウントにEC2インスタンスを立てます。インスタンスの作成の手順は省きますが、セキュリティーグループのインバウンドルールを以下のように設定してください。
- アカウントＡ
<table>
  <thead>
    <tr>
      <th>タイプ</th> <th>ソース</th>
    </tr>
  </thead>
  <tr>
    <td> すべてのTCP </td> <td>172.0.0.0/16</td>
  </tr>
</table>

- アカウントB
<table>
  <thead>
    <tr>
      <th>送信先</th> <th>ターゲット</th>
    </tr>
  </thead>
  <tr>
    <td> すべてのTCP </td> <td>10.0.0.0/16</td>
  </tr>
</table>

### Reachability Analyzerで疎通確認
疎通確認を行います。SSMのSessionManagerを使ってPingを使って疎通確認はできますが、Reachability Analyzerを使うことで通らなかった際に、どこで通信が遮られているかがわかるのでそちらを使っていきます。
1. VPCのコンソール画面から「Network Manager」に移ります。![ネットワークマネージャー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/51430b72-c82f-296e-c1c8-afe9995cac05.png)
VPCのコンソール画面を下にスクロールすると見えてきます。迷いますね...
1. Reachability Analyzerを使う前に「設定」で「信頼されたアクセス」を有効にしていない場合、有効にしてください
※既に有効の場合は飛ばします。
![Reachability設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/346328f3-4c9d-53db-ee2e-1cc507def395.png)
有効の確認![有効の確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/d43d8cba-803f-10b7-4b57-eb264f4b6840.png)
1. Reachability Analyzerを選択して「パスの作成と分析」をしていきます。まずはアカウントBからアカウントAに通信ができるかを確認します
![アカウントBからアカウントAに通信ができるかを確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/42ce8428-44ae-d6d8-2589-1b0eb5fc184e.png)
1. 分析結果の確認をしていきます
![エラーを吐いた分析結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/96f6ce54-d5d9-e372-1198-a67b9e4e22c3.png)
到達できませんでしたね…
しかし、原因を教えてくれます！
![エラーを吐いた分析結果の原因.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/1a19ae93-d75e-338f-3054-3de45242a194.png)
セキュリティーグループに原因があるみたいですので、見てみます。
![アカウントAのセキュリティーグループが原因.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/4ba56ffb-2a5f-cba7-22a5-fd53ffbce126.png)
インバウンドルールのソースが「10.0.0.0/16」になっていますね。「172.0.0.0/16」に直して再度分析します。
1. 再分析をする
![再分析.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/af1a92d3-826e-9d4b-6fb9-d2b7a9f65a6b.png)
無事にできていますね。
経路も見てみましょう！
![to-AccountA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659733/a1020fb7-3faf-6944-a7ef-402a31cc4483.png)
Transit Gatewayを通って通信がされていることが確認できました！
アカウントAからアカウントBに対しても確認してみてください（ここでは割愛します。）

# 感じたこと
- Transit Gatewayは資格試験でよく見かけたことがあるが、こうして実際に構築すると各コンポーネントの理解が足りないと感じた
- Reachability Analyzerは一方通この通信のみの分析なので往復分として2回やる必要がありそう

# 参考文献
以下を参考にして学習しました。
ありがとうございます。
[AWS Resource Access Managerを使用して、複数アカウントでAWS Transit Gatewayを共有して通信する方法](https://blog.serverworks.co.jp/ram-transit-gateway-routing)
[AWS Transit Gatewayを使用してEC2同士のクロスアカウント通信を行う](https://blog.mmmcorp.co.jp/2024/05/30/aws-transit-gateway-practice/)
[Transit Gatewayを設定して、同一リージョン内の複数VPC間でEC2インスタンス同士の通信を行ってみた](https://dev.classmethod.jp/articles/transit-gateway-ec2-connection/)
[VPC Reachability Analyzerを使ってみてわかった便利さと意外なハマりどころ](https://speakerdeck.com/handy/vpc-reachability-analyzerwoshi-tutemitewakatutabian-li-satoyi-wai-nahamaridokoro?slide=33)