🪢

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