AWS Transit Gatewayを構築する機会がありましたので、備忘録として残したいと思います。今回はTransit Gateway(TGW)を利用してみて、私なりの考え方や構築方法を纏めたいと思います。
1、Transit Gateway(TGW)とは
Transit Gateway(以降はTGW)は、TGWを中心にVPCやオンプレミス環境を接続することで、ネットワーク管理を楽に行うことが出来るサービスです。
従来、VPCとオンプレミス環境を接続するには、Virtual Private Gateway(VGW)を設定し、VPNまたは、AWS Direct Connectで接続する必要がありました。VGWは、1VPCにつき1VGWという制約がある為、リージョン内に複数のVPCがある場合は、その数だけVGWを作成する必要がありました。(10個のVPCにをオンプレミス環境に接続する場合は10個のVGWとVPN設定が必要)
TGWでは、TGWとオンプレミス環境が接続できれば、後は各VPCをTGWに接続するだけでオンプレミス環境と通信することが出来ます。(10個のVPCをオンプレミス環境に接続する場合でも、1つのTGWと1つのVPN設定で通信可能)
TGWの詳細については以下のリンクを参照してください。
2、TGWを構成するコンポーネント
TGWは大きく以下のコンポーネントから構成されています。
- Transit Gateway
- Transit Gateway attachment
- Transit Gateway route table
<Transit Gateway> Transit Gateway attachmentやTransit Gateway route tableを纏めるための箱のようなイメージです。
<Transit Gateway attachment>VPCやVPN、DirectConnectを関連付けるためのアダプターとして機能するイメージです。
<Transit Gateway route table>TGWに送信されたパケットの宛先を決定します。TGW RouteTableのルート設定はBGPを使用した動的設定と手動による静的設定を行うことが出来ます。
Transit Gateway route tableは、Transit Gatewayの中に複数設定すことが出来るため、アタッチするTransit Gateway attachmentごとにアクセス制御することが出来ます。詳細は後述します。
3、Association • Propagation
3-1、Association
アソシエーションは上記[図1、]で説明したTransit Gateway attachmentとTransit Gateway route tableを関連付ける為の設定を行います。
Transit Gateway attachmentとTransit Gateway route tableをアソシエーションしていない場合は以下の様なイメージとなります。
図2のように attachmentとroute tableがアソシエーションされていない場合、attachmentへ来たパケットはどのroute tableを参照するのかわかりません。そのため、パケットは宛先となる別のattachmentへ転送されず、正常な通信はできません。
TGWを使用する場合は、どのattachmentが、どのRouteTableにアソシエーションされるか設定する必要があります。(attachmentに設定できるRouteTableは1つのみです)
WebコンソールでTGW設定を行う場合、attachmentが追加された際にデフォルトで割り当てるroute tableを設定することが出来ます。作成画面にある「Default route table association」を有効にした場合、route tableが自動生成されます。尚、「Default route table association」で設定されたRoutetableは作成後に変更できません。
3-2、Propagation
TGWを構成したネットワークのルーティング設定を全て手動で行う場合、プロパゲーションを設定する必要はありませんが、実際はBGPを使用してルート情報の自動設定を行うと思います。プロパゲーションはTGWルートテーブルを自動設定する際に必要となります。
図3、ではオンプレミス環境のネットワークアドレスがプロパゲーションされる様子を表しています。
図中のRouteTable(1)と(2)はattachment(1)からのルーティング情報を受け取る設定(プロパゲーション設定)を有効化しています。
この状態で、オンプレミス環境からルーティング情報が広報されると、RouteTable(1)と(2)にオンプレミス環境へ到達するためのルーティング情報が追加されます。
VPC1からオンプレミス環境に対する通信が発生した場合、結果的にRouteTable(2)のルート情報を参照し、オンプレミスにパケットが転送されます。
ここで示した図では、戻りパケットに対するルーティング設定が記載されていませんが、RouteTable(1)へattachment(2)からのプロパゲーション設定を行うことで正常に通信ができるようになります。
また、RouteTable(3)はattachment(1)からのプロパゲーション設定を有効化していません。そのため、VPC2からオンプレミス環境への通信が発生した場合、ルーティング情報がないためパケットは転送されず、通信できません。
3-3、ルート情報の伝搬について
TGWでは、VPN接続・DirectConnect接続での経路情報交換はBGPを使用して伝搬されます。そのため、TGWに新たなVPCを追加するなどして、アソシエーションされたTGWルートテーブルが変化した場合、BGPにより経路情報が伝搬され、オンプレミス環境のルータは自動的にルート情報が更新されます。
一方、VPCルートテーブルはアソシエーションされたTGWルートテーブルが変化しても自動的に設定は反映されません。そのため、オンプレミス環境でネットワーク構成が変化した場合は、手動でVPCルートテーブルを変更する必要があります。
4、TGWの構築方法
4-1、環境の説明
今回はTerraformを使用したTGWの構築方法を紹介したいと思います。構築にあたり、以下の前提条件を満たしている事を確認します。
- TGWを構築するリージョンにVPC・Subnetが構築されている事
- オンプレミス環境でサイト間VPN接続に使用するグローバルIPアドレスが確保されている事
- オンプレミス環境との経路交換はBGPを使用しており、オンプレミス環境のAS番号が決定している事
前提条件を図にすると以下のようになります。
今回紹介するテンプレートをデプロイすると以下の環境が作成されます。
テンプレートは以下の環境で作成・動作確認をしています。
- aws-cli/2.0.50
- Terraform v0.13.3
4-2、構築準備
4-2-1、AWSCLIのインストール
以下のリンクを参照して、使用する環境に合わせたAWSCLIをダウンロードし、インストールします。
インストール後に「aws configure」コマンドを実行し、適切なアクセス権のあるIAMユーザーに関連付けます。
4-2-2、Terraformのインストール
以下のリンクを参照して、使用する環境に合わせたTerraformをダウンロードし、インストールします。
※「Terraformのセットアップ」部分を実施
4-2-3、Gitのインストール
以下のリンクを参照して、使用する環境に合わせたGitをダウンロードし、インストールします。
4-2-4、テンプレートファイルのダウンロード
任意のディレクトリまたはフォルダで以下のコマンドを実行してテンプレートをダウンロードします。
git clone https://github.com/nakamura-ryo727/TGW_terraform.git
4-3、環境構築
4-3-1、パラメータの修正
適用する環境に合わせて、パラメータを修正します。
ダウンロードしたファイルの「terraform.tfvars」をテキストエディタで開き、項目を修正します。
pj_name = "example"
←任意の名前(タグ名の接頭辞になります。)
TGW_bgp_asn = "64512"
←TGWのASN(オンプレミス環境と重複しない番号)
vpc_id = "vpc-019e880XXXXXXXXXX"
←TGWにアタッチするVPC
subnet_id = ["subnet-0646fecXXXXXXXXXX","subnet-0b463d3XXXXXXXXXX"]
→TGWにアタッチするサブネット(1AZに複数のSubnetが存在する場合は代表となる1つのSubnetを指定する。)
CGW_bgp_asn = "65000"
←オンプレミス環境のASN
CGW_ip_address = "172.0.0.1"
←サイト間VPN接続に使用するグローバルIP
ダウンロードしたファイルの「provider.tf」をテキストエディタで開き、項目を修正します。
provider "aws" {
region = "ap-northeast-1"
profile = "example"
←profileでアカウントを切り替えている場合に設定
}
4-3-2、環境へのデプロイ
パラメータ設定後、「terraform init」・「terraform plan」・「terraform apply」コマンドを実行して、デプロイを行います。
各コマンドの使用方法は以下のリンクを参照します。
「terraform apply」実行時の最終行に
Apply complete! Resources: 10 added, 0 changed, 0 destroyed
と表示されている場合は、正常にデプロイされています。
構築が終了するまで5分ほどかかります。
※デプロイ出力のサンプル
terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_customer_gateway.CGW01 will be created
+ resource "aws_customer_gateway" "CGW01" {
+ arn = (known after apply)
+ bgp_asn = "65000"
+ id = (known after apply)
+ ip_address = "172.0.0.1"
+ tags = {
+ "Name" = "example-cgw01"
}
+ type = "ipsec.1"
}
# aws_ec2_tag.TGW-ATTA-VPN01 will be created
+ resource "aws_ec2_tag" "TGW-ATTA-VPN01" {
+ id = (known after apply)
+ key = "Name"
+ resource_id = (known after apply)
+ value = "example-tgw-atta-vpn01"
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
中略
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# aws_vpn_connection.VPN01 will be created
+ resource "aws_vpn_connection" "VPN01" {
+ arn = (known after apply)
+ customer_gateway_configuration = (known after apply)
+ customer_gateway_id = (known after apply)
+ id = (known after apply)
+ routes = (known after apply)
+ static_routes_only = (known after apply)
+ tags = {
+ "Name" = "example-vpn01"
}
+ transit_gateway_attachment_id = (known after apply)
+ transit_gateway_id = (known after apply)
+ tunnel1_address = (known after apply)
+ tunnel1_bgp_asn = (known after apply)
+ tunnel1_bgp_holdtime = (known after apply)
+ tunnel1_cgw_inside_address = (known after apply)
+ tunnel1_inside_cidr = (known after apply)
+ tunnel1_preshared_key = (sensitive value)
+ tunnel1_vgw_inside_address = (known after apply)
+ tunnel2_address = (known after apply)
+ tunnel2_bgp_asn = (known after apply)
+ tunnel2_bgp_holdtime = (known after apply)
+ tunnel2_cgw_inside_address = (known after apply)
+ tunnel2_inside_cidr = (known after apply)
+ tunnel2_preshared_key = (sensitive value)
+ tunnel2_vgw_inside_address = (known after apply)
+ type = "ipsec.1"
+ vgw_telemetry = (known after apply)
}
Plan: 10 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_customer_gateway.CGW01: Creating...
aws_ec2_transit_gateway.TGW01: Creating...
aws_customer_gateway.CGW01: Still creating... [10s elapsed]
aws_ec2_transit_gateway.TGW01: Still creating... [10s elapsed]
aws_customer_gateway.CGW01: Creation complete after 11s
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
中略
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
aws_ec2_transit_gateway_route_table_association.association_vpn01: Still creating... [30s elapsed]
aws_ec2_transit_gateway_route_table_association.association_vpn01: Creation complete after 34s
Apply complete! Resources: 10 added, 0 changed, 0 destroyed.