AWS VPN Gateway Terraform module
Terraform module which creates VPN gateway resources on AWS.
Features
This module creates:
- a VPN Connection unless
create_vpn_connection = false - a VPN Gateway Attachment
- one or more VPN Gateway Route Propagation depending on how many routing tables exists in a VPC
- one or more VPN Connection Route if
create_vpn_connection = trueandvpn_connection_static_routes_only = true, and depending on the number of destinations provided in variablevpn_connection_static_routes_destinations(which must be inline withvpc_subnet_route_table_count)
This module does not create a VPN Gateway resource because it is meant to be used in combination with the VPC module that will create that resource (when enable_vpn_gateway = true).
This module also does not create a Customer Gateway resource.
This module will create static routes for the VPN Connection if configured to create a VPN Connection resource with static routes and destinations for the routes have been provided.
The static routes will then be automatically propagated to the VPC subnet routing tables (provided in private_route_table_ids) once a VPN tunnel status is UP.
When static routes are disabled, the appliance behind the Customer Gateway needs to support BGP routing protocol in order for routes to be automatically discovered, and subsequently propagated to the VPC subnet routing tables.
This module supports optional parameters for tunnel inside cidr and preshared keys. They can be supplied individually, too.
If you want to use the Transit Gateway support you are responsible for creating the transit gateway resources (eg, using terraform-aws-transit-gateway module).
Usage
With VPC module
module "vpn_gateway" {
source = "terraform-aws-modules/vpn-gateway/aws"
version = "~> 3.0"
vpc_id = module.vpc.vpc_id
vpn_gateway_id = module.vpc.vgw_id
customer_gateway_id = module.vpc.cgw_ids[0]
# precalculated length of module variable vpc_subnet_route_table_ids
vpc_subnet_route_table_count = 3
vpc_subnet_route_table_ids = module.vpc.private_route_table_ids
# tunnel inside cidr & preshared keys (optional)
tunnel1_inside_cidr = var.custom_tunnel1_inside_cidr
tunnel2_inside_cidr = var.custom_tunnel2_inside_cidr
tunnel1_preshared_key = var.custom_tunnel1_preshared_key
tunnel2_preshared_key = var.custom_tunnel2_preshared_key
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
enable_vpn_gateway = true
amazon_side_asn = 64620
customer_gateways = {
IP1 = {
bgp_asn = 65220
ip_address = "172.83.124.10"
},
IP2 = {
bgp_asn = 65220
ip_address = "172.83.124.11"
}
}
# ...
}
Without VPC module
module "vpn_gateway" {
source = "terraform-aws-modules/vpn-gateway/aws"
version = "~> 3.0"
vpn_gateway_id = aws_vpn_gateway.vpn_gateway.id
customer_gateway_id = aws_customer_gateway.main.id
vpc_id = aws_vpc.vpc.vpc_id
vpc_subnet_route_table_count = 3
vpc_subnet_route_table_ids = ["rt-12322456", "rt-43433343", "rt-11223344"]
# tunnel inside cidr & preshared keys (optional)
tunnel1_inside_cidr = var.custom_tunnel1_inside_cidr
tunnel2_inside_cidr = var.custom_tunnel2_inside_cidr
tunnel1_preshared_key = var.custom_tunnel1_preshared_key
tunnel2_preshared_key = var.custom_tunnel2_preshared_key
}
resource "aws_customer_gateway" "main" {
bgp_asn = 65000
ip_address = "172.83.124.10"
type = "ipsec.1"
tags {
Name = "main-customer-gateway"
}
}
resource "aws_vpc" "vpc" {
# ...
}
resource "aws_vpn_gateway" "vpn_gateway" {
vpc_id = aws_vpc.vpc.vpc_id
# ...
}
With VPC module and Transit Gateway resources
module "vpn_gateway" {
source = "terraform-aws-modules/vpn-gateway/aws"
version = "~> 3.0"
create_vpn_gateway_attachment = false
connect_to_transit_gateway = true
vpc_id = module.vpc.vpc_id
transit_gateway_id = aws_ec2_transit_gateway.this.id
customer_gateway_id = module.vpc.cgw_ids[0]
# tunnel inside cidr & preshared keys (optional)
tunnel1_inside_cidr = var.custom_tunnel1_inside_cidr
tunnel2_inside_cidr = var.custom_tunnel2_inside_cidr
tunnel1_preshared_key = var.custom_tunnel1_preshared_key
tunnel2_preshared_key = var.custom_tunnel2_preshared_key
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
enable_vpn_gateway = false
amazon_side_asn = 64620
customer_gateways = {
IP1 = {
bgp_asn = 65220
ip_address = "172.83.124.10"
},
IP2 = {
bgp_asn = 65220
ip_address = "172.83.124.11"
}
}
# ...
}
resource "aws_ec2_transit_gateway" "this" {
description = "My TGW"
}
resource "aws_ec2_transit_gateway_vpc_attachment" "this" {
subnet_ids = module.vpc.private_subnets
vpc_id = module.vpc.vpc_id
transit_gateway_id = aws_ec2_transit_gateway.this.id
}
With VPC and Transit Gateway modules
module "vpn_gateway" {
source = "terraform-aws-modules/vpn-gateway/aws"
version = "~> 3.0"
create_vpn_gateway_attachment = false
connect_to_transit_gateway = true
vpc_id = module.vpc.vpc_id
transit_gateway_id = module.tgw.ec2_transit_gateway_id
customer_gateway_id = module.vpc.cgw_ids[0]
# tunnel inside cidr & preshared keys (optional)
tunnel1_inside_cidr = var.custom_tunnel1_inside_cidr
tunnel2_inside_cidr = var.custom_tunnel2_inside_cidr
tunnel1_preshared_key = var.custom_tunnel1_preshared_key
tunnel2_preshared_key = var.custom_tunnel2_preshared_key
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
enable_vpn_gateway = false
amazon_side_asn = 64620
customer_gateways = {
IP1 = {
bgp_asn = 65220
ip_address = "172.83.124.10"
},
IP2 = {
bgp_asn = 65220
ip_address = "172.83.124.11"
}
}
# ...
}
module "tgw" {
source = "terraform-aws-modules/transit-gateway/aws"
version = "~> 2.0"
name = "my-tgw"
description = "My TGW shared with several other AWS accounts"
amazon_side_asn = 64532
vpc_attachments = {
vpc1 = {
vpc_id = "vpc-12345678" # module.vpc.vpc_id <- will not work since computed values can't be used in `count`
subnet_ids = ["subnet-123456", "subnet-111222233"] # module.vpc.public_subnets <- will not work since computed values can't be used in `count`
dns_support = true
tgw_routes = [
{
destination_cidr_block = "30.0.0.0/16"
},
{
blackhole = true
destination_cidr_block = "0.0.0.0/0"
}
]
}
}
}
Examples
- Complete example shows how to create all VPN Gateway resources and integration with VPC module.
- Complete example with Transit Gateway shows how to create VPN Connection between Transit Gateway and Customer Gateway.
- Complete example with static routes shows how to create all VPN Gateway together with static routes.
- Minimal example shows how to create just VPN Gateway using this module.
Authors
Module is maintained by Anton Babenko with help from these awesome contributors.
License
Apache 2 Licensed. See LICENSE for full details.