これは何?
AWS VPC とオンプレミスネットワーク間のVPN接続であるSite-to-Site VPN接続(サイト間VPN)についてTerraformで構築をしたので、構築手順をご紹介したいと思います。
注意点
- こちらの記事では動的ルーティングではなく静的ルーティングを利用する場合の構築手順をご紹介します
- サイト間VPNについてはトンネルに関して細かい設定ができますが、今回はトンネル設定はすべてデフォルトとしました
構成図
構築手順
AWSドキュメントに沿って、下記の手順で作成します。
- ステップ 1: カスタマーゲートウェイを作成する
- ステップ 2: ターゲットゲートウェイを作成する
- ステップ 3: ルーティングを設定する
- ステップ 4: セキュリティグループを更新する
- ステップ 5: VPN 接続を作成する
- ステップ 6: 設定ファイルをダウンロードする
- ステップ 7: カスタマーゲートウェイデバイスを設定する
Terraformで構築した、ステップ1〜5までの手順について、コード付きで詳細を記載します。
ステップ 1: カスタマーゲートウェイを作成する
オンプレミス側のネットワーク内のゲートウェイである、カスタマーゲートウェイを作成します。
Terraformのaws_customer_gatewayリソースについてはこちら
今回はオンプレ側のASNは65000と指定があったため、bgp_asnは65000で設定しています。
# Customer gateway resource "aws_customer_gateway" "cgw" { bgp_asn = 65000 ip_address = var.site-to-site_vpn.onpre_ip_01 //オンプレ側のIPをvariables.tfで定義 type = "ipsec.1" }
なおvariables.tfの、オンプレ側のIP・CIDRは次のように設定しています。
# ----------------------------- # Site-to-Site VPN # ----------------------------- variable "site-to-site_vpn" { type = map(string) default = { onpre_ip_01 = "XXX.XXX.XXX.XXX" // オンプレ側ルーターのIP。 onpre_cidr_01 = "YYY.YYY.YYY.YYY/24" // オンプレ側ネットワークCIDR。 } }
ステップ 2: ターゲットゲートウェイを作成する
ターゲットゲートウェイは、仮想プライベートゲートウェイまたは Transit Gatewayを使用します。
今回は仮想プライベートゲートウェイ(VGW)を構築します。
Terraformのaws_vpn_gatewayリソースについてはこちら
AWS側のASNは65007を指定しています。
resource "aws_vpn_gateway" "vgw" { vpc_id = aws_vpc.vpc.id amazon_side_asn = "65007" }
ステップ 3: ルーティングを設定する
動的ルーティングを利用する場合は、ルート伝播を有効に設定することで、Site-to-Site VPN ルートを自動的に伝播します。
ルート伝播設定のためのTerraformのaws_vpn_gateway_route_propagationリソースについてはこちら
今回は静的ルーティングでの構築であり、オンプレ側ネットワークCIDRを静的ルートとしてルートテーブルに手動で入力しておけば、ルート伝播を有効にする必要はありません。
今回はルート伝播は無効とし、VPCサブネットのルートテーブルにオンプレ側ネットワークCIDRとVGWとのルートを設定しました。
Terraformのaws_route_tableリソースについてはこちら
resource "aws_route_table" "rt_private" { vpc_id = aws_vpc.vpc.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.natgw.id } route { cidr_block = var.site-to-site_vpn.onpre_cidr_01 //オンプレ側のIPをvariables.tfで定義 gateway_id = aws_vpn_gateway.vgw.id //仮想プライベートゲートウェイを指定 } }
ステップ 4: セキュリティグループを更新する
オンプレと接続するインスタンスに適用するセキュリティグループに対して、オンプレ用IPアドレスの接続を許可するルールを追加します。
Terraformのaws_security_groupリソースについてはこちら
オンプレ側ネットワークCIDRからの通信について、双方向かつ全ポートに許可しています。
resource "aws_security_group" "instance" { name = "instance-sg" vpc_id = aws_vpc.vpc.id ingress { description = "local" from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = [var.vpc.cidr] } ingress { description = "Site-to-Site VPN" from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = [ var.site-to-site_vpn.onpre_cidr_01 //オンプレ側のIPをvariables.tfで定義 ] } egress { description = "local" from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = [var.vpc.cidr] } egress { description = "Site-to-Site VPN" from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = [ var.site-to-site_vpn.onpre_cidr_01 //オンプレ側のIPをvariables.tfで定義 ] } }
ステップ 5: VPN 接続を作成する
オンプレ側CGWとAWS側VGWを接続するためのVPN接続を作成していきます。
Terraformのaws_vpn_connectionリソースについてはこちら
local_ipv4_network_cidrにローカル(オンプレ)側のCIDR、remote_ipv4_network_cidrにリモート(AWS VPC)側のCIDRを設定しています。
今回は静的ルーティングのため、static_routes_onlyをtrueに設定しています。
# Site-to-site connection resource "aws_vpn_connection" "vpnc" { vpn_gateway_id = aws_vpn_gateway.vgw.id customer_gateway_id = aws_customer_gateway.cgw.id local_ipv4_network_cidr = var.site-to-site_vpn.onpre_cidr_01 remote_ipv4_network_cidr = var.vpc.cidr static_routes_only = true type = "ipsec.1" }
また、今回は静的ルーティングのため、VPN接続とCGWとの間の静的ルートを別途aws_vpn_connection_routeで設定します。
Terraformのaws_vpn_connection_routeについてはこちら
resource "aws_vpn_connection_route" "onpre" { destination_cidr_block = var.site-to-site_vpn.onpre_cidr_01 vpn_connection_id = aws_vpn_connection.vpnc.id }
構築結果
マネジメントコンソールから、Terraformで設定した通りに構築されていることを確認しました。
終わりに
今回はサイト間VPNをTerraformで構築する手順についてご紹介しました。
構築される際の参考になれば幸いです。