Transit Gatewayの概要と構築方法

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の詳細については以下のリンクを参照してください。

AWS Transit Gateway

トランジットゲートウェイの動作

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を使用した動的設定と手動による静的設定を行うことが出来ます。

図1、TGWの構成イメージ

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、アソシエーション設定がない場合

図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、プロパゲーション動作

図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、ルート情報の伝搬説明

4、TGWの構築方法


4-1、環境の説明

今回はTerraformを使用したTGWの構築方法を紹介したいと思います。構築にあたり、以下の前提条件を満たしている事を確認します。

  1. TGWを構築するリージョンにVPC・Subnetが構築されている事
  2. オンプレミス環境でサイト間VPN接続に使用するグローバルIPアドレスが確保されている事
  3. オンプレミス環境との経路交換はBGPを使用しており、オンプレミス環境のAS番号が決定している事

前提条件を図にすると以下のようになります。

図5、前提条件

今回紹介するテンプレートをデプロイすると以下の環境が作成されます。

図6、構築後イメージ

テンプレートは以下の環境で作成・動作確認をしています。

  • aws-cli/2.0.50
  • Terraform v0.13.3

4-2、構築準備

4-2-1、AWSCLIのインストール

以下のリンクを参照して、使用する環境に合わせたAWSCLIをダウンロードし、インストールします。

AWS CLI バージョン 2 のインストール

インストール後に「aws configure」コマンドを実行し、適切なアクセス権のあるIAMユーザーに関連付けます。

4-2-2、Terraformのインストール

以下のリンクを参照して、使用する環境に合わせたTerraformをダウンロードし、インストールします。

Download Terraform

Terraformのセットアップ

※「Terraformのセットアップ」部分を実施

4-2-3、Gitのインストール

以下のリンクを参照して、使用する環境に合わせた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」コマンドを実行して、デプロイを行います。

各コマンドの使用方法は以下のリンクを参照します。

terrafomeの基本的な使い方メモ

「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.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)