TGW接続された2つのVPCをAWS CLIで一気に構築する。



構成


プライベートとパブリック、トランジットゲートウェイ用のサブネットを適当に切ってTGWで接続しただけのよくある簡単な構成。
基本構成大体同じなのに新しいシステム導入の度ポチポチやってられないので、スクリプト作成しました。
terraformにもその内起こそうとは思ってますが、まずは個人的に慣れているCLIでベースラインを作成したので、参考にどうぞ。

VPC作成

export AWS_DEFAUKT_REGION='ap-northeast-1'
export AWS_PAGER="" ## デフォルトでlessになってて一括でコマンド通らんくてうざいので消す ##
### 変数定義 ###
VPC_NAME='VPC-A-tokyo'
VPC_CIDR='192.168.0.0/22'
SUB_PRI_NAME='SUB-A-Private-tokyo'
SUB_PRI_CIDR='192.168.1.0/24'
SUB_PUB_NAME='SUB-A-Public-tokyo'
SUB_PUB_CIDR='192.168.0.0/24'
SUB_TGW_NAME='SUB-A-Transit-tokyo'
SUB_TGW_CIDR='192.168.3.240/28'
RTB_PUB_NAME='RTB-A-Public-tokyo'
RTB_PRI_NAME='RTB-A-Private-tokyo'
IGW_NAME='IGW-A-tokyo'
AZ_A_TOKYO='ap-northeast-1a'

###実行ログファイル###
LOGFILE_NAME=$(TZ=JST-9 date +%Y%m%d_%H%M%S)_CREATE_TGW.log
script ${HOME}/${LOGFILE_NAME}
echo "${HOME}/${LOGFILE_NAME}"

### AWS運用VPC作成 ###
aws ec2 create-vpc\
 --cidr-block ${VPC_CIDR}\
 --instance-tenancy default\
 --tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=${VPC_NAME}},]"

VPC_ID=$(aws ec2 describe-vpcs\
 --filters Name=tag:Name,Values=${VPC_NAME}\
 --query 'Vpcs[].VpcId' --output text)

echo ${VPC_ID}

### プライベートサブネット ###
aws ec2 create-subnet\
 --vpc-id ${VPC_ID}\
 --cidr-block ${SUB_PRI_CIDR}\
 --availability-zone ${AZ_A_TOKYO}\
 --tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${SUB_PRI_NAME}},]"

SUB_PRI_ID=$(aws ec2 describe-subnets\
 --filters Name=tag:Name,Values=${SUB_PRI_NAME}\
 --query 'Subnets[].SubnetId' --output text)

echo ${SUB_PRI_ID}


### パブリックサブネット ###
aws ec2 create-subnet\
 --vpc-id ${VPC_ID}\
 --cidr-block ${SUB_PUB_CIDR}\
 --availability-zone ${AZ_A_TOKYO}\
 --tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${SUB_PUB_NAME}},]"

SUB_PUB_ID=$(aws ec2 describe-subnets\
 --filters Name=tag:Name,Values=${SUB_PUB_NAME}\
 --query 'Subnets[].SubnetId' --output text)

echo ${SUB_PUB_ID}


### TGWサブネット ###
aws ec2 create-subnet\
 --vpc-id ${VPC_ID}\
 --cidr-block ${SUB_TGW_CIDR}\
 --availability-zone ${AZ_A_TOKYO}\
 --tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${SUB_TGW_NAME}},]"

SUB_TGW_ID=$(aws ec2 describe-subnets\
 --filters Name=tag:Name,Values=${SUB_TGW_NAME}\
 --query 'Subnets[].SubnetId' --output text)

echo ${SUB_TGW_ID}

### プライベートルートテーブル作成 ###
aws ec2 create-route-table\
 --vpc-id ${VPC_ID}\
 --tag-specifications "ResourceType=route-table,Tags=[{Key=Name,Value=${RTB_PRI_NAME}},]"

RTB_PRI_ID=$(aws ec2 describe-route-tables\
 --filters Name=tag:Name,Values=${RTB_PRI_NAME}\
 --query 'RouteTables[].RouteTableId' --output text)

echo ${RTB_PRI_ID}

### パブリックテーブル作成 ###
aws ec2 create-route-table\
 --vpc-id ${VPC_ID}\
 --tag-specifications "ResourceType=route-table,Tags=[{Key=Name,Value=${RTB_PUB_NAME}},]"

RTB_PUB_ID=$(aws ec2 describe-route-tables\
 --filters Name=tag:Name,Values=${RTB_PUB_NAME}\
 --query 'RouteTables[].RouteTableId' --output text)

echo ${RTB_PUB_ID}

### サブネットとプライベートルートテーブルの関連付け ###
aws ec2 associate-route-table\
 --subnet-id ${SUB_PRI_ID}\
 --route-table-id ${RTB_PRI_ID}


### サブネットとパブリックルートテーブルの関連付け ###
aws ec2 associate-route-table\
 --subnet-id ${SUB_PUB_ID}\
 --route-table-id ${RTB_PUB_ID}


### インターネットゲートウェイ作成 ###
aws ec2 create-internet-gateway\
 --tag-specifications "ResourceType=internet-gateway,Tags=[{Key=Name,Value=${IGW_NAME}},]"

IGW_ID=$(aws ec2 describe-internet-gateways\
 --filters Name=tag:Name,Values=${IGW_NAME}\
 --query 'InternetGateways[].InternetGatewayId' --output text)

echo ${IGW_ID}

### インターネットゲートウェイをVPCにアタッチ ###
aws ec2 attach-internet-gateway\
 --vpc-id ${VPC_ID}\
 --internet-gateway-id ${IGW_ID}
 
### インターネットゲートウェイの経路を指定 ###
aws ec2 create-route\
 --route-table-id ${RTB_PUB_ID}\
 --destination-cidr-block '0.0.0.0/0'\
 --gateway-id ${IGW_ID}


exit


VPC-Bについても変数部分をちょちょっと変えて、どかんと立つはず。
scriptで実行ログを取っているので、必要な方は証跡として忘れずにダウンロード&&削除お願いします。

TGW作成

export AWS_DEFAUKT_REGION='ap-northeast-1'
export AWS_PAGER="" ## デフォルトでlessになってて一括でコマンド通らんくてうざいので消す ##

### 変数定義 ###
TGW_NAME='TGW-tokyo'
TGW_DESC='Connect VPCs tokyo'

###実行ログファイル###
LOGFILE_NAME=$(TZ=JST-9 date +%Y%m%d_%H%M%S)_CREATE_TGW.log
script ${HOME}/${LOGFILE_NAME}
echo "${HOME}/${LOGFILE_NAME}"

### トランジットゲートウェイの作成 ###
aws ec2 create-transit-gateway\
 --description "${TGW_DESC}"\
 --tag-specifications "ResourceType=transit-gateway,Tags=[{Key=Name,Value=${TGW_NAME}}]"

TGW_ID=$(aws ec2 describe-transit-gateways\
 --filters Name=tag:Name,Values=${TGW_NAME}\
 --query 'TransitGateways[].TransitGatewayId' --output text)
 
echo ${TGW_ID}

exit

TGW作成はまあそんな何回も構築することはないでしょうが、一応。
こんな感じ。
リージョンリソースなので特にVPCのIDとか必要じゃないみたい。
事前に決めとく必要があるのは名前と説明くらいかな。

TGWアタッチメント作成

export AWS_DEFAULT_REGION='ap-northeast-1'
export AWS_PAGER="" ## デフォルトでlessになってて一括でコマンド通らんくてうざいので消す ##

TGW_NAME='TGW-tokyo'
VPC_A_NAME='VPC-A-tokyo'
SUB_TGW_A_NAME='SUB-A-Transit-tokyo'
VPC_A_CIDR='192.168.0.0/22'
RTB_A_PRI_NAME='RTB-A-Private-tokyo'
VPC_B_NAME='VPC-B-tokyo'
SUB_TGW_B_NAME='SUB-B-Transit-tokyo'
VPC_B_CIDR='172.24.4.0/22'
RTB_B_PRI_NAME='RTB-B-Private-tokyo'

###実行ログファイル###
LOGFILE_NAME=$(TZ=JST-9 date +%Y%m%d_%H%M%S)_CREATE_TGWattachment.log
script ${HOME}/${LOGFILE_NAME}
echo "${HOME}/${LOGFILE_NAME}"

### 変数取得 ###
TGW_ID=$(aws ec2 describe-transit-gateways\
 --filters Name=tag:Name,Values=${TGW_NAME}\
 --query 'TransitGateways[].TransitGatewayId' --output text)
 
echo ${TGW_ID}

### アタッチ先VPC情報① ###
VPC_A_ID=$(aws ec2 describe-vpcs\
 --filters Name=tag:Name,Values=${VPC_A_NAME}\
 --query 'Vpcs[].VpcId' --output text)

echo ${VPC_A_ID}

### アタッチ先VPC情報② ###
VPC_B_ID=$(aws ec2 describe-vpcs\
 --filters Name=tag:Name,Values=${VPC_B_NAME}\
 --query 'Vpcs[].VpcId' --output text)

echo ${VPC_B_ID}

### アタッチ先サブネット① ###
SUB_TGW_A_ID=$(aws ec2 describe-subnets\
 --filters Name=tag:Name,Values=${SUB_TGW_A_NAME}\
 --query 'Subnets[].SubnetId' --output text)
 
 echo ${SUB_TGW_A_ID}
 
 ### アタッチ先サブネット② ###
SUB_TGW_B_ID=$(aws ec2 describe-subnets\
 --filters Name=tag:Name,Values=${SUB_TGW_B_NAME}\
 --query 'Subnets[].SubnetId' --output text)
 
 echo ${SUB_TGW_B_ID}
 
### アタッチ先ルートテーブル① ###
RTB_A_PRI_ID=$(aws ec2 describe-route-tables\
 --filters Name=tag:Name,Values=${RTB_A_PRI_NAME}\
 --query 'RouteTables[].RouteTableId' --output text)

echo ${RTB_A_PRI_ID}

### アタッチ先ルートテーブル② ###
RTB_PRI_B_ID=$(aws ec2 describe-route-tables\
 --filters Name=tag:Name,Values=${RTB_PRI_B_NAME}\
 --query 'RouteTables[].RouteTableId' --output text)

echo ${RTB_PRI_B_ID}
 
### トランジットゲートウェイのアタッチ ###
aws ec2 create-transit-gateway-vpc-attachment\
 --transit-gateway-id ${TGW_ID}\
 --vpc-id ${VPC_A_ID}\
 --subnet-id ${SUB_TGW_A_ID}
 
aws ec2 create-transit-gateway-vpc-attachment\
 --transit-gateway-id ${TGW_ID}\
 --vpc-id ${VPC_B_ID}\
 --subnet-id ${SUB_TGW_B_ID}
 

### ルートの追加 ###
aws ec2 create-route\
 --route-table-id ${RTB_A_PRI_ID}\
 --destination-cidr-block ${VPC_B_CIDR}\
 --transit-gateway-id ${TGW_ID}
 
aws ec2 create-route\
 --route-table-id ${RTB_B_PRI_ID}\
 --destination-cidr-block ${VPC_A_CIDR}\
 --transit-gateway-id ${TGW_ID}
 
exit

TGWルートテーブルについては、用途で複数使い分け等ある場合もあるが、今回はVPC-A VPC-B間はお互い通す形にした。

とまあ、個人的な備忘録を兼ねたスクリプトを作成してみた。
需要があれば是非参考にしていただければ。
検証利用の場合は、TGWアタッチメントの料金がそれなりにかかるため、環境削除も忘れずに。


この記事が気に入ったらサポートをしてみませんか?