AWS マルチアカウントVPCをTransit Gatewayで接続する
要件
今回は異なるAWSアカウント上に構築したVPC同士をTransit Gateway(以下TGW)で接続し
VPC間でEC2インスタンス同士が疎通確認を行えるようにします。
構築の目標は以下の通りです。
- 異なるAWSアカウント上に重複しないCIDR範囲を持つVPCを1つずつ構築する
- 各VPCはインターネットへのルートを持たない
- TGWはRAMを使用して共有する
- TGWを作成するAWSアカウントのVPCをHub-Vpc、TGWの共有先のVPCをClient‐VPCをVpcとする
- EC2インスタンス同士がPingで疎通確認を行えるようにする
設計
TGW共有元アカウント(Hubアカウント)
Hub-vpc
| 項目 | 設定値 |
|---|---|
| IPv4 CIDR | 10.0.0.0/16 |
Hub-subnet-private1-ap-northeast-1a
| 項目 | 設定値 |
|---|---|
| VPC | Hub-vpc |
| IPv4 CIDR | 10.0.0.0/24 |
| AZ | ap-northeast-1a |
Hub-subnet-private2-ap-northeast-1c
| 項目 | 設定値 |
|---|---|
| VPC | Hub-vpc |
| IPv4 CIDR | 10.0.1.0/24 |
| AZ | ap-northeast-1c |
Hub-rtb-private1-ap-northeast-1a
| 項目 | 設定値 |
|---|---|
| サブネットの関連付け | Hub-subnet-private1-ap-northeast-1a |
| ルート | ターゲット |
|---|---|
| 10.0.0.0/16 | local |
| 10.1.0.0/16 | Transit-Gateway |
Hub-rtb-private2-ap-northeast-1c
| 項目 | 設定値 |
|---|---|
| サブネットの関連付け | Hub-subnet-private2-ap-northeast-1c |
| ルート | ターゲット |
|---|---|
| 10.0.0.0/16 | local |
| 10.1.0.0/16 | Transit-Gateway |
Transit-Gateway
| 項目 | 設定値 |
|---|---|
| 名前 | Transit-Gateway |
| ASN | 64513 |
| デフォルトルートテーブルの関連付け | 無効 |
| デフォルトルートテーブル伝搬 | 無効 |
tgw-rtb
| 項目 | 設定値 |
|---|---|
| Transit Gateway ID | (Transit-Gateway) |
| 関連付け | tgw-attachment-hub |
| tgw-attachment-client | |
| 伝搬 | tgw-attachment-hub |
| tgw-attachment-client |
tgw-attachment-hub
| 項目 | 設定値 |
|---|---|
| Transit Gateway ID | (Transit-Gateway) |
| VPC ID | (Hub-vpc) |
Resource Access Manager
| 項目 | 設定値 |
|---|---|
| 名前 | Hub-TGW |
| 共有リソース | transit-gateway |
| マネージド側アクセス許可 | arn:aws:ram::aws:permission/AWSRAMDefaultPermissionTransitGateway |
| 共有プリンシパル | 共有先アカウントのID |
EC2インスタンス
| 項目 | 設定値 |
|---|---|
| 名前 | Hub-EC2 |
| AMI | Amazon Linux 2023 |
| インスタンスタイプ | t3.micro |
| キーペア | なし |
| VPC | Hub-vpc |
| サブネット | Hub-subnet-private1-ap-northeast-1a |
| セキュリティグループ | Hub-EC2 |
セキュリティグループ
| 項目 | 設定値 |
|---|---|
| セキュリティグループ名 | Hub-EC2 |
| VPC | Hub-vpc |
インバウンドルール
| タイプ | ソース |
|---|---|
| すべてのICMP-IPv4 | 10.1.0.0/16 |
TGW共有先アカウント(Clientアカウント)
Client-vpc
| 項目 | 設定値 |
|---|---|
| IPv4 CIDR | 10.1.0.0/16 |
Client-subnet-private1-ap-northeast-1a
| 項目 | 設定値 |
|---|---|
| VPC | Client-vpc |
| IPv4 CIDR | 10.1.0.0/24 |
| AZ | ap-northeast-1a |
Client-subnet-private2-ap-northeast-1c
| 項目 | 設定値 |
|---|---|
| VPC | Client-vpc |
| IPv4 CIDR | 10.1.1.0/24 |
| AZ | ap-northeast-1c |
Client-rtb-private1-ap-northeast-1a
| 項目 | 設定値 |
|---|---|
| サブネットの関連付け | Client-subnet-private1-ap-northeast-1a |
| ルート | ターゲット |
|---|---|
| 10.1.0.0/16 | local |
| 10.0.0.0/16 | Transit-Gateway |
Client-rtb-private2-ap-northeast-1c
| 項目 | 設定値 |
|---|---|
| サブネットの関連付け | Client-subnet-private2-ap-northeast-1c |
| ルート | ターゲット |
|---|---|
| 10.1.0.0/16 | local |
| 10.0.0.0/16 | Transit-Gateway |
tgw-attachment-hub
| 項目 | 設定値 |
|---|---|
| Transit Gateway ID | (Transit-Gateway) |
| VPC ID | (Client-vpc) |
セキュリティグループ(1)
| 項目 | 設定値 |
|---|---|
| セキュリティグループ名 | VPC-Endpoint |
| VPC | Client-vpc |
インバウンドルール
| タイプ | ソース |
|---|---|
| HTTPS | 10.1.0.0/16 |
セキュリティグループ(2)
| 項目 | 設定値 |
|---|---|
| セキュリティグループ名 | Client-EC2 |
| VPC | Client-vpc |
インバウンドルール
| タイプ | ソース |
|---|---|
| すべてのICMP-IPv4 | 10.0.0.0/16 |
VPCエンドポイント(1)
| 項目 | 設定値 |
|---|---|
| 名前 | SSM |
| サービス名 | com.amazonaws.ap-northeast-1.ssm |
| VPC | Client-vpc |
| サブネット | Client-subnet-private1-ap-northeast-1a |
| セキュリティグループ | VPC-Endpoint |
VPCエンドポイント(2)
| 項目 | 設定値 |
|---|---|
| 名前 | ssmmessages |
| サービス名 | com.amazonaws.ap-northeast-1.ssmmessages |
| VPC | Client-vpc |
| サブネット | Client-subnet-private1-ap-northeast-1a |
| セキュリティグループ | VPC-Endpoint |
VPCエンドポイント(3)
| 項目 | 設定値 |
|---|---|
| 名前 | ec2messages |
| サービス名 | com.amazonaws.ap-northeast-1.ec2messages |
| VPC | Client-vpc |
| サブネット | Client-subnet-private1-ap-northeast-1a |
| セキュリティグループ | VPC-Endpoint |
IAMロール
| 項目 | 設定値 |
|---|---|
| ユースケース | EC2 |
| 許可ポリシー | AmazonSSMManagedInstanceCore |
| ロール名 | EC2-SSM |
| サービス名 | com.amazonaws.ap-northeast-1.ec2messages |
| VPC | Client-vpc |
EC2インスタンス
| 項目 | 設定値 |
|---|---|
| 名前 | Client-EC2 |
| AMI | Amazon Linux 2023 |
| インスタンスタイプ | t3.micro |
| キーペア | なし |
| VPC | Client-vpc |
| サブネット | Client-subnet-private1-ap-northeast-1a |
| セキュリティグループ | Hub-EC2 |
| IAMインスタンスプロフィール | EC2-SSM |
構成図

構築
Hub-VPCの作成
Hubアカウント側でVPCを作成します。
Transit Gatewayの作成
Hubアカウント上にTGWを構築します。
今回はデフォルトルートテーブルの関連付けと伝搬のチェックを外して手動でルート構築します。

Transit Gateway ルートテーブルの作成
このTGWにはルートテーブルがまだないので作成します。
今回はHubアカウント、Clientアカウントのアタッチメントが接続するルートテーブルを1つ作成します。
Transit Gateway アタッチメントの作成
まずはTGWとHub-vpcを接続します。
Transit Gateway AttachmentをHub-vpcに作成したらTGWのルートテーブルで作成したアタッチメントを関連付けます。
伝搬も同様にアタッチメントに対して行います。
Resource Access ManagerによるTransit Gatewayの共有
Clientアカウントでの作業に移る前にHubアカウントで作成したTGWをRAMで共有します。
リソース共有を作成からTGWを選び、Clientアカウントに対して共有を作成します。


ここで一旦Clientアカウント側での作業になります。
まずはRAMでHubアカウントからの共有が来てるか確認します。
自分と共有のリソースの共有に招待が届いているか確認します。
Hubアカウント側で作成した名前のリソース共有を確認したら承認します。

Client-vpcの作成
承認後ClientアカウントでVPCを作成します。
Transit Gateway アタッチメントの作成(Clientアカウント側)
その後アタッチメントを作成しTGWと接続します。
Clientアカウント側で接続するとHubアカウント側でアタッチメントが見えるようになります。

アクションからTransit Gateway アタッチメントを承諾します。
Transit Gateway ルートテーブルルートの編集
アタッチメントとTGWの接続が完了したらHubアカウント側でルートテーブルを更新します。
1つ目のアタッチメントと同様に関連付けと伝搬を行います。
設定後、TGWルートテーブルのルートタブで各VPCへのルートが設定されているのを確認できます。

これでTGWに来たトラフィックのルーティングが可能になりましたので
各サブネットのルートテーブルにTGWへのルートを追加します。
サブネットルートテーブルの編集
Hubアカウント、Clientアカウントそれぞれ相手のVPC CIDRへの通信をTGWへルーティングさせます。


テスト
これで異なるアカウントのVPC間通信をする準備ができました。
各VPC上にEC2インスタンスを作成し疎通確認を行います。
EC2インスタンス作成時に対抗となるVPCからのpingを許可するようSGのインバウンドルールに設定してください。
今回はClientVPC側のEC2に接続しHubVPC側のEC2に対して疎通確認を行いました。

おわり
今回は異なるアカウントのVPCをTransit Gatewayで接続しました。
以前、AWSとGoogleCloudをVPNで接続したので
Hub-VPC上に作成したResolverエンドポイントを経由して
Client-vpcからGoogleCloud上のDNSサーバーを名前解決できるようにしていきたいですね。
最後までお読みいただきありがとうございました。
Discussion