AWS Transit Gatewayを試してみた

# 背景・目的
以前、[AWS Transit Gatewayを整理してみた](https://qiita.com/zumax/items/52828a4dd06cbd9fcf63)で、Transigt Gatewayの基本的な知識やユースケース等を整理しました。
今回は、実際に触って試してみたいと思います。

# まとめ
今回は、下記のような環境で試してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/28ebdc4e-f022-fbac-8379-854391673fc5.png)

下記の順番で作成しました。

1. ネットワークの作成
1. EC2の作成
1. VPCeの作成
1. Transit Gatewayの作成
1. VPCをTransit Gatewayに接続
1. トランジットゲートウェイと VPC の間にルートを追加
1. セキュリティグループを修正

# 概要
よろしければ、[AWS Transit Gatewayを整理してみた](https://qiita.com/zumax/items/52828a4dd06cbd9fcf63)や、下記のAWSのドキュメントをご覧ください。

https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/what-is-transit-gateway.html



# 実践
## 前準備
:::note info
前準備で用意した環境を2つ作成します。
:::

### ネットワークの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9291a2ff-ed9c-167c-0518-7d98b4089aee.png)

#### VPCを作成する
1. VPC（Private Subnet１つ）を作成します

### EC2の作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9273a98c-234e-3efb-ec64-e04f50c48d14.png)

#### IAMロールを作成する
SessionManagerを使ってEC2にログインするため、IAMロールを準備します

1. IAMに移動し、ロールを作成をクリックします
1. 信頼されたエンティティタイプに、「AWSのサービス」、ユースケースには、「EC2」を選択し、「次へ」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/958ff291-df9f-5822-f31b-66afcabef06a.png" width=600 />

1. ポリシー「AmazonSSMManagedInstanceCore」を選択し、「次へ」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9709ec9d-e408-d444-e1d1-f487f78fdabd.png)
1. ロール名を入力し「ロールを作成」をクリックします


#### EC2インスタンスを起動する
1. EC2に移動します
1. インスタンスの起動をクリックします
1. VPC、SG等を指定し起動します（キーペアは不要です）
1. 起動したら、セキュリティ＞IAMロールの変更で、作成したIAMロールをアタッチします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/671b936b-53c3-26be-889e-e57d54a0a8b1.png)
1. セキュリティグループで、ポート443で、自身のサブネットのCIDRを設定します

### VPCeの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/73b2e775-2c17-ed5e-9704-eb03c787f003.png)

#### VPCe用のSGを作成する
1. EC2に移動します
1. ナビゲーションペインで、「セキュリティグループ」をクリックします
1. 「セキュリティグループを作成」をクリックします
1. 用意したVPCを選択し、インバウンドルールには、443でEC2インスタンスに設定したセキュリティグループを指定します

#### VPCeを作成する
1. VPCに移動します
1. ナビゲーションペインで、「エンドポイント」をクリックします
1. 「エンドポイントの作成」をクリックします
1. 下記の3つのVPCeを作成します。セキュリティグループには既に作成したVPCeのセキュリティグループをアタッチします
    - com.amazonaws.{region}.ec2
    - com.amazonaws.{region}.ssmmessages
    - com.amazonaws.{region}.ec2messages

### 接続する
1. EC2に移動します
1. EC2を選択し、「インスタンスに接続を」クリックします
1. セッションマネージャータブを選択し、「接続」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5bcd8482-862e-bda5-2e2c-f3fd481a7a6e.png)
1. ログインできました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ad5c3490-461d-5d94-0f8a-7cd803ebaea0.png)

## VPC間の疎通
接続できないことを事前に確認するため、Transit GWの作成前にVPC間の通信を試します。

### VPC A → VPC B
1. VPC A → VPC Bにpingを実行します。やはり失敗しています
    ```
    sh-5.2$ ping -c 3 10.1.135.197
    PING 10.1.135.197 (10.1.135.197) 56(84) bytes of data.
    
    --- 10.1.135.197 ping statistics ---
    3 packets transmitted, 0 received, 100% packet loss, time 2059ms
    
    sh-5.2$
    ```

### VPC B → VPC A
1. VPC B → VPC Aにpingを実行します。やはり失敗しています
    ```
    sh-5.2$ ping -c 3 10.0.138.37
    PING 10.0.138.37 (10.0.138.37) 56(84) bytes of data.
    
    --- 10.0.138.37 ping statistics ---
    3 packets transmitted, 0 received, 100% packet loss, time 2062ms
    
    sh-5.2$ 
    ```

## Transit Gatewayの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/86cc3f15-4afc-14e7-04df-a05cb0973f52.png)

[トランジットゲートウェイの開始方法](https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/tgw-getting-started.html)を基に試します。


1. VPCに移動します
1. ナビゲーションペインの「Transit Gateway」をクリックします
1. 「Transit Gatewayを作成」をクリックします
1. 下記を入力し、「Transit Gatewayを作成」をクリックします
    - 名前タグ
    - Amazon側のASN
        - 16 ビット ASN の場合、範囲は 64512 〜 65534
        - 32 ビット ASN の場合、範囲は 4200000000 〜 4294967294

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/38c7e90f-ed78-02f8-f37e-fcb90bb24908.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e9172649-996f-0f3e-b946-50afeeb2bac7.png)

## VPCをTransit Gatewayに接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/00b60bdb-f0d8-b7bd-d1d8-ab438c93fe69.png)


:::note info 
2つのアタッチメントを作成します
:::

1. VPCに移動します
1. ナビゲーションペインの「Transit Gateway アタッチメント」をクリックします
1. 「Transit Gateway アタッチメントを作成」をクリックします
1. 下記を入力し、「Transit Gateway アタッチメントを作成」をクリックします
    - 名前：任意
    - TransitGateway ID:作成したTransit Gatewayを選択
    - アタッチメントタイプ：VPC
    - VPCアタッチメント
        - VPC IDとサブネット:作成したVPCとサブネット
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/30c7da66-7dc0-8e06-cccb-e6e604789141.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/df9bf7f2-6d36-b3f5-b9f7-9290002462d6.png)

1. しばらくすると、状態「Available」、関連付けの状態が「Associated」になります
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a27f9a06-251d-483c-8cc2-0e6eaf2a4801.png)



## トランジットゲートウェイと VPC の間にルートを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/03075f86-0797-2420-c7cd-c112ab61452a.png)

:::note info 
それぞれのVPCのルートテーブルを修正します
:::

1. VPCに移動します
1. ナビゲーションペインの「ルートテーブル」をクリックします
1. VPCのルートテーブルを選択します
1. 「ルートを編集」をクリックします
1. 「ルート追加」をクリックし下記を入力し、「変更を保存」をクリックします
    - 送信先： 送信先のVPCのCIDR
    - ターゲット：Transit Gateway
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d7dbd293-50eb-95e2-3373-8e31883bec26.png)


## セキュリティグループを修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/27dca55b-f03c-08a0-9799-55a5f5c18b6c.png)


::: note info 
それぞれのEC2のセキュリティグループを修正します
:::

1. EC2に移動します
1. 対象のセキュリティグループを選択し、インバウンド編集ルールを修正します
1. カスタムICMPと反対のVPCを選択し、「ルールを保存」


## テスト
### VPC A → VPC B
1. VPC AのEC2にログインします
1. pingで疎通します。繋がりました！
    ```
    sh-5.2$ ping -c 3 10.1.135.197
    PING 10.1.135.197 (10.1.135.197) 56(84) bytes of data.
    64 bytes from 10.1.135.197: icmp_seq=1 ttl=126 time=0.838 ms
    64 bytes from 10.1.135.197: icmp_seq=2 ttl=126 time=0.648 ms
    64 bytes from 10.1.135.197: icmp_seq=3 ttl=126 time=0.626 ms
    
    --- 10.1.135.197 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2074ms
    rtt min/avg/max/mdev = 0.626/0.704/0.838/0.095 ms
    sh-5.2$
    ```

### VPC B → VPC A
1. VPC BのEC2にログインします
1. pingで疎通します。繋がりました！
    ```
    sh-5.2$ ping -c 3 10.0.138.37
    PING 10.0.138.37 (10.0.138.37) 56(84) bytes of data.
    64 bytes from 10.0.138.37: icmp_seq=1 ttl=126 time=0.752 ms
    64 bytes from 10.0.138.37: icmp_seq=2 ttl=126 time=0.709 ms
    64 bytes from 10.0.138.37: icmp_seq=3 ttl=126 time=0.618 ms
    
    --- 10.0.138.37 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2046ms
    rtt min/avg/max/mdev = 0.618/0.693/0.752/0.055 ms
    sh-5.2$
    ```

# 考察
今回、Transit Gatewayを触ってみました。次回は、リージョン間、アカウント間での接続を試して見たいと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/tgw-getting-started.html

https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/what-is-transit-gateway.html

https://repost.aws/knowledge-center/ec2-systems-manager-vpc-endpoints

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-prerequisites.html