Skip to content

Commit 44f82a1

Browse files
committed
feat: add vpn-connection module
1 parent e4af6f6 commit 44f82a1

File tree

9 files changed

+1290
-0
lines changed

9 files changed

+1290
-0
lines changed

.github/labeler.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,8 @@
33
- changed-files:
44
- any-glob-to-any-file:
55
- modules/customer-gateway/**/*
6+
7+
":floppy_disk: vpn-connection":
8+
- changed-files:
9+
- any-glob-to-any-file:
10+
- modules/vpn-connection/**/*

.github/labels.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,6 @@
4343
- color: "fbca04"
4444
description: "This issue or pull request is related to customer-gateway module."
4545
name: ":floppy_disk: customer-gateway"
46+
- color: "fbca04"
47+
description: "This issue or pull request is related to vpn-connection module."
48+
name: ":floppy_disk: vpn-connection"

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
Terraform module which creates VPN related resources on AWS.
88

99
- [customer-gateway](./modules/customer-gateway/)
10+
- [vpn-connection](./modules/vpn-connection/)
1011

1112

1213
## Target AWS Services

modules/vpn-connection/README.md

Lines changed: 111 additions & 0 deletions
Large diffs are not rendered by default.

modules/vpn-connection/main.tf

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
locals {
2+
metadata = {
3+
package = "terraform-aws-vpn"
4+
version = trimspace(file("${path.module}/../../VERSION"))
5+
module = basename(path.module)
6+
name = var.name
7+
}
8+
module_tags = var.module_tags_enabled ? {
9+
"module.terraform.io/package" = local.metadata.package
10+
"module.terraform.io/version" = local.metadata.version
11+
"module.terraform.io/name" = local.metadata.module
12+
"module.terraform.io/full-name" = "${local.metadata.package}/${local.metadata.module}"
13+
"module.terraform.io/instance" = local.metadata.name
14+
} : {}
15+
}
16+
17+
data "aws_default_tags" "this" {}
18+
19+
data "aws_customer_gateway" "this" {
20+
id = var.customer_gateway.id
21+
}
22+
23+
locals {
24+
default_tags = data.aws_default_tags.this.tags
25+
common_tags = merge(
26+
local.default_tags,
27+
local.module_tags,
28+
var.tags,
29+
)
30+
tunnel_statuses = {
31+
for tunnel in aws_vpn_connection.this.vgw_telemetry :
32+
tunnel.outside_ip_address => tunnel
33+
}
34+
}
35+
36+
37+
###################################################
38+
# VPN Connection
39+
###################################################
40+
41+
resource "aws_vpn_connection" "this" {
42+
static_routes_only = var.routing_type == "STATIC"
43+
enable_acceleration = var.target_gateway.type == "TRANSIT_GATEWAY" ? var.acceleration_enabled : null
44+
45+
46+
## Customer Gateway
47+
type = data.aws_customer_gateway.this.type
48+
customer_gateway_id = var.customer_gateway.id
49+
outside_ip_address_type = var.target_gateway.type == "TRANSIT_GATEWAY" ? var.customer_gateway.outside_ip_address_type : null
50+
# transport_transit_gateway_attachment_id - (Required when outside_ip_address_type is set to PrivateIpv4). The attachment ID of the Transit Gateway attachment to Direct Connect Gateway. The ID is obtained through a data source only.
51+
52+
53+
## Target Gateway
54+
transit_gateway_id = var.target_gateway.type == "TRANSIT_GATEWAY" ? var.target_gateway.id : null
55+
vpn_gateway_id = var.target_gateway.type == "VPN_GATEWAY" ? var.target_gateway.id : null
56+
57+
58+
## Tunnel Options
59+
tunnel_inside_ip_version = var.target_gateway.type == "TRANSIT_GATEWAY" ? lower(var.tunnel_inside_ip_version) : null
60+
local_ipv4_network_cidr = var.tunnel_inside_ip_version == "IPv4" ? var.local_ipv4_cidr : null
61+
local_ipv6_network_cidr = var.tunnel_inside_ip_version == "IPv6" ? var.local_ipv6_cidr : null
62+
remote_ipv4_network_cidr = var.tunnel_inside_ip_version == "IPv4" ? var.remote_ipv4_cidr : null
63+
remote_ipv6_network_cidr = var.tunnel_inside_ip_version == "IPv6" ? var.remote_ipv6_cidr : null
64+
65+
66+
## Tunnel 1 Options
67+
tunnel1_inside_cidr = var.tunnel1_inside_ipv4_cidr
68+
tunnel1_inside_ipv6_cidr = var.tunnel1_inside_ipv6_cidr
69+
70+
tunnel1_enable_tunnel_lifecycle_control = var.tunnel1_tunnel_endpoint_lifecycle_control_enabled
71+
72+
tunnel1_preshared_key = var.tunnel1_preshared_key
73+
74+
75+
## Tunnel 1 Initiation Options
76+
tunnel1_startup_action = lower(var.tunnel1_startup_action)
77+
tunnel1_dpd_timeout_seconds = var.tunnel1_dpd.timeout
78+
tunnel1_dpd_timeout_action = lower(var.tunnel1_dpd.timeout_action)
79+
# tunnel1_log_options - (Optional) Options for logging VPN tunnel activity. See Log Options below for more details.
80+
81+
82+
83+
## Tunnel 1 IKE Negotiation
84+
tunnel1_ike_versions = var.tunnel1_ike_versions
85+
tunnel1_rekey_margin_time_seconds = var.tunnel1_ike_rekey.margin_time
86+
tunnel1_rekey_fuzz_percentage = var.tunnel1_ike_rekey.fuzz
87+
tunnel1_replay_window_size = var.tunnel1_ike_replay_window_size
88+
89+
tunnel1_phase1_encryption_algorithms = var.tunnel1_ike_phase1.encryption_algorithms
90+
tunnel1_phase1_integrity_algorithms = var.tunnel1_ike_phase1.integrity_algorithms
91+
tunnel1_phase1_dh_group_numbers = var.tunnel1_ike_phase1.dh_group_numbers
92+
tunnel1_phase1_lifetime_seconds = var.tunnel1_ike_phase1.lifetime
93+
94+
tunnel1_phase2_encryption_algorithms = var.tunnel1_ike_phase2.encryption_algorithms
95+
tunnel1_phase2_integrity_algorithms = var.tunnel1_ike_phase2.integrity_algorithms
96+
tunnel1_phase2_dh_group_numbers = var.tunnel1_ike_phase2.dh_group_numbers
97+
tunnel1_phase2_lifetime_seconds = var.tunnel1_ike_phase2.lifetime
98+
99+
100+
## Tunnel 2 Options
101+
tunnel2_inside_cidr = var.tunnel2_inside_ipv4_cidr
102+
tunnel2_inside_ipv6_cidr = var.tunnel2_inside_ipv6_cidr
103+
104+
tunnel2_enable_tunnel_lifecycle_control = var.tunnel2_tunnel_endpoint_lifecycle_control_enabled
105+
106+
tunnel2_preshared_key = var.tunnel2_preshared_key
107+
108+
109+
## Tunnel 2 Initiation Options
110+
tunnel2_startup_action = lower(var.tunnel2_startup_action)
111+
tunnel2_dpd_timeout_seconds = var.tunnel2_dpd.timeout
112+
tunnel2_dpd_timeout_action = lower(var.tunnel2_dpd.timeout_action)
113+
114+
115+
## Tunnel 2 IKE Negotiation
116+
tunnel2_ike_versions = var.tunnel2_ike_versions
117+
tunnel2_rekey_margin_time_seconds = var.tunnel2_ike_rekey.margin_time
118+
tunnel2_rekey_fuzz_percentage = var.tunnel2_ike_rekey.fuzz
119+
tunnel2_replay_window_size = var.tunnel2_ike_replay_window_size
120+
121+
tunnel2_phase1_encryption_algorithms = var.tunnel2_ike_phase1.encryption_algorithms
122+
tunnel2_phase1_integrity_algorithms = var.tunnel2_ike_phase1.integrity_algorithms
123+
tunnel2_phase1_dh_group_numbers = var.tunnel2_ike_phase1.dh_group_numbers
124+
tunnel2_phase1_lifetime_seconds = var.tunnel2_ike_phase1.lifetime
125+
126+
tunnel2_phase2_encryption_algorithms = var.tunnel2_ike_phase2.encryption_algorithms
127+
tunnel2_phase2_integrity_algorithms = var.tunnel2_ike_phase2.integrity_algorithms
128+
tunnel2_phase2_dh_group_numbers = var.tunnel2_ike_phase2.dh_group_numbers
129+
tunnel2_phase2_lifetime_seconds = var.tunnel2_ike_phase2.lifetime
130+
131+
132+
# tunnel2_log_options - (Optional) Options for logging VPN tunnel activity. See Log Options below for more details.
133+
134+
135+
tags = merge(
136+
{
137+
"Name" = local.metadata.name
138+
},
139+
local.module_tags,
140+
var.tags,
141+
)
142+
}
143+
144+
resource "aws_ec2_tag" "this" {
145+
for_each = merge(
146+
{
147+
"Name" = local.metadata.name
148+
},
149+
local.common_tags,
150+
)
151+
152+
resource_id = aws_vpn_connection.this.transit_gateway_attachment_id
153+
key = each.key
154+
value = each.value
155+
}
156+
157+
158+
###################################################
159+
# Static Routes for VPN Connection
160+
###################################################
161+
162+
resource "aws_vpn_connection_route" "this" {
163+
for_each = toset(var.static_routing_destination_cidrs)
164+
165+
vpn_connection_id = aws_vpn_connection.this.id
166+
destination_cidr_block = each.value
167+
}

0 commit comments

Comments
 (0)