4-projects/modules/peering_net/main.tf (218 lines of code) (raw):
locals {
env_code = substr(var.env, 0, 1)
}
data "google_netblock_ip_ranges" "legacy_health_checkers" {
range_type = "legacy-health-checkers"
}
data "google_netblock_ip_ranges" "health_checkers" {
range_type = "health-checkers"
}
data "google_netblock_ip_ranges" "iap_forwarders" {
range_type = "iap-forwarders"
}
module "peering_network" {
source = "terraform-google-modules/network/google"
version = "~> 9.0"
project_id = var.peering_project_id
network_name = "vpc-${local.env_code}-peering-base"
shared_vpc_host = "false"
delete_default_internet_gateway_routes = "true"
subnets = [for one_subnet_region in keys(var.subnet_config) : {
subnet_name = "sb-${local.env_code}-${var.business_code}-peered-${one_subnet_region}"
subnet_ip = var.subnet_config[one_subnet_region]
subnet_region = one_subnet_region
subnet_private_access = "true"
description = "Peered subnetwork on region ${one_subnet_region}."
subnet_flow_logs = "true"
subnet_flow_logs_interval = var.vpc_flow_logs.aggregation_interval
subnet_flow_logs_sampling = var.vpc_flow_logs.flow_sampling
subnet_flow_logs_metadata = var.vpc_flow_logs.metadata
subnet_flow_logs_metadata_fields = var.vpc_flow_logs.metadata_fields
subnet_flow_logs_filter = var.vpc_flow_logs.filter_expr
}
]
}
resource "google_dns_policy" "default_policy" {
project = var.peering_project_id
name = "dp-${local.env_code}-peering-base-default-policy"
enable_inbound_forwarding = true
enable_logging = true
networks {
network_url = module.peering_network.network_self_link
}
}
module "peering" {
source = "terraform-google-modules/network/google//modules/network-peering"
version = "~> 9.0"
prefix = "${var.business_code}-${local.env_code}"
local_network = module.peering_network.network_self_link
peer_network = var.peer_network_self_link
module_depends_on = var.peering_module_depends_on
}
/******************************************
Mandatory and optional firewall rules
*****************************************/
module "firewall_rules" {
source = "terraform-google-modules/network/google//modules/network-firewall-policy"
version = "~> 9.0"
project_id = var.peering_project_id
policy_name = "fp-${local.env_code}-peering-project-firewalls"
description = "Firewall rules for Peering Network: ${module.peering_network.network_name}."
rules = concat(
[
{
priority = "65530"
direction = "EGRESS"
action = "deny"
rule_name = "fw-${local.env_code}-peering-base-65530-e-d-all-all-tcp-udp"
description = "Lower priority rule to deny all egress traffic."
enable_logging = var.firewall_enable_logging
match = {
dest_ip_ranges = ["0.0.0.0/0"]
layer4_configs = [
{
ip_protocol = "tcp"
},
{
ip_protocol = "udp"
},
]
}
},
{
priority = "10000"
direction = "EGRESS"
action = "allow"
rule_name = "fw-${local.env_code}-peering-base-10000-e-a-allow-google-apis-all-tcp-443"
description = "Lower priority rule to allow private google apis on TCP port 443."
enable_logging = var.firewall_enable_logging
match = {
dest_ip_ranges = ["199.36.153.8/30"]
layer4_configs = [
{
ip_protocol = "tcp"
ports = ["443"]
},
]
}
},
{
// Allow SSH via IAP when using the ssh-iap-access/allow resource manager tag for Linux workloads.
rule_name = "fw-${local.env_code}-peering-base-1000-i-a-all-allow-iap-ssh-tcp-22"
action = "allow"
direction = "INGRESS"
priority = "1000"
enable_logging = true
target_secure_tags = var.peering_iap_fw_rules_enabled ? try(["tagValues/${google_tags_tag_value.firewall_tag_value_ssh[0].name}"], []) : []
match = {
src_ip_ranges = data.google_netblock_ip_ranges.iap_forwarders.cidr_blocks_ipv4
layer4_configs = [
{
ip_protocol = "tcp"
ports = ["22"]
},
]
}
},
{
// Allow RDP via IAP when using the rdp-iap-access/allow resource manager tag for Windows workloads.
rule_name = "fw-${local.env_code}-peering-base-1001-i-a-all-allow-iap-rdp-tcp-3389"
action = "allow"
direction = "INGRESS"
priority = "1001"
enable_logging = true
target_secure_tags = var.peering_iap_fw_rules_enabled ? try(["tagValues/${google_tags_tag_value.firewall_tag_value_rdp[0].name}"], []) : []
match = {
src_ip_ranges = data.google_netblock_ip_ranges.iap_forwarders.cidr_blocks_ipv4
layer4_configs = [
{
ip_protocol = "tcp"
ports = ["3389"]
},
]
}
}
],
!var.windows_activation_enabled ? [] : [
{
priority = "0"
direction = "EGRESS"
action = "allow"
rule_name = "fw-${local.env_code}-peering-base-0-e-a-allow-win-activation-all-tcp-1688"
description = "Allow access to kms.windows.googlecloud.com for Windows license activation."
enable_logging = var.firewall_enable_logging
match = {
dest_ip_ranges = ["35.190.247.13/32"]
layer4_configs = [
{
ip_protocol = "tcp"
ports = ["1688"]
},
]
}
}
],
!var.optional_fw_rules_enabled ? [] : [
{
priority = "1000"
direction = "INGRESS"
action = "allow"
rule_name = "fw-${local.env_code}-peering-base-1000-i-a-all-allow-lb-tcp-80-8080-443"
description = "Allow traffic for Internal & Global load balancing health check and load balancing IP ranges."
enable_logging = var.firewall_enable_logging
match = {
src_ip_ranges = concat(data.google_netblock_ip_ranges.health_checkers.cidr_blocks_ipv4, data.google_netblock_ip_ranges.legacy_health_checkers.cidr_blocks_ipv4)
layer4_configs = [
{
// Allow common app ports by default.
ip_protocol = "tcp"
ports = ["80", "8080", "443"]
},
]
}
},
]
)
depends_on = [
google_tags_tag_value.firewall_tag_value_ssh,
google_tags_tag_value.firewall_tag_value_rdp
]
}
resource "google_compute_network_firewall_policy_association" "vpc_association" {
name = "${module.firewall_rules.fw_policy[0].name}-${module.peering_network.network_name}"
attachment_target = module.peering_network.network_id
firewall_policy = module.firewall_rules.fw_policy[0].id
project = var.peering_project_id
depends_on = [
module.firewall_rules,
module.peering_network
]
}
resource "google_tags_tag_key" "firewall_tag_key_ssh" {
count = var.peering_iap_fw_rules_enabled ? 1 : 0
short_name = "ssh-iap-access"
parent = "projects/${var.peering_project_id}"
purpose = "GCE_FIREWALL"
purpose_data = {
network = "${var.peering_project_id}/${module.peering_network.network_name}"
}
}
resource "google_tags_tag_value" "firewall_tag_value_ssh" {
count = var.peering_iap_fw_rules_enabled ? 1 : 0
short_name = "allow"
parent = "tagKeys/${google_tags_tag_key.firewall_tag_key_ssh[0].name}"
}
resource "google_tags_tag_key" "firewall_tag_key_rdp" {
count = var.peering_iap_fw_rules_enabled ? 1 : 0
short_name = "rdp-iap-access"
parent = "projects/${var.peering_project_id}"
purpose = "GCE_FIREWALL"
purpose_data = {
network = "${var.peering_project_id}/${module.peering_network.network_name}"
}
}
resource "google_tags_tag_value" "firewall_tag_value_rdp" {
count = var.peering_iap_fw_rules_enabled ? 1 : 0
short_name = "allow"
parent = "tagKeys/${google_tags_tag_key.firewall_tag_key_rdp[0].name}"
}