demo_solution/modules/repo_terraform.azurerm.nsg/main.tf (136 lines of code) (raw):
# Get resource group data
data "azurerm_resource_group" "rg" {
count = var.location == null ? 1 : 0
name = var.resource_group_name
}
# Create NSG
resource "azurerm_network_security_group" "nsg" {
name = var.nsg_name
location = var.location == null ? data.azurerm_resource_group.rg[0].location : var.location
resource_group_name = var.resource_group_name
tags = var.tags
}
# Collect all ASG names to single array to get IDs
locals {
inbound_destination_asg_list = [
for rule in var.inbound_rules :
lookup(rule, "destination_asg", [])
]
outbound_destination_asg_list = [
for rule in var.outbound_rules :
lookup(rule, "destination_asg", [])
]
inbound_source_asg_list = [
for rule in var.inbound_rules :
lookup(rule, "source_asg", [])
]
outbound_source_asg_list = [
for rule in var.outbound_rules :
lookup(rule, "source_asg", [])
]
asg_list = flatten(setunion(flatten(local.inbound_destination_asg_list), flatten(local.outbound_destination_asg_list), flatten(local.inbound_source_asg_list), flatten(local.outbound_source_asg_list)))
subnet_associate = var.subnet_associate == null ? [] : var.subnet_associate
}
# Get subnet to associate with NSG
data "azurerm_subnet" "subnet_associate" {
for_each = { for subnet in local.subnet_associate : subnet.subnet_name => subnet }
name = each.value.subnet_name
virtual_network_name = each.value.vnet_name
resource_group_name = lookup(each.value, "rg_name", var.resource_group_name)
}
# Associate subnet with NSG.
# NSG will be associated with subnet only after all rules are created, it significant for subnets such as AzureBastion or ApplicationGatewaySubnet.
resource "azurerm_subnet_network_security_group_association" "subnet" {
for_each = { for subnet in local.subnet_associate : subnet.subnet_name => subnet }
depends_on = [azurerm_network_security_rule.inbound_rules, azurerm_network_security_rule.outbound_rules]
subnet_id = data.azurerm_subnet.subnet_associate[each.value.subnet_name].id
network_security_group_id = azurerm_network_security_group.nsg.id
}
# Get ASG data to associate with NSG
data "azurerm_application_security_group" "asg" {
for_each = { for asg in local.asg_list : asg.name => asg }
name = each.value.name
resource_group_name = each.value.rg_name
}
# Create ASG map '<rule name> = [<asg_id_1>,<asg_id_2>...,<asg_id_n>]'
locals {
inbound_destination_asg_ids = {
for rule in var.inbound_rules : rule.name => [
for asg in rule.destination_asg :
data.azurerm_application_security_group.asg[asg.name].id
] if can(rule.destination_asg)
}
outbound_destination_asg_ids = {
for rule in var.outbound_rules : rule.name => [
for asg in rule.destination_asg :
data.azurerm_application_security_group.asg[asg.name].id
] if can(rule.destination_asg)
}
inbound_source_asg_ids = {
for rule in var.inbound_rules : rule.name => [
for asg in rule.source_asg :
data.azurerm_application_security_group.asg[asg.name].id
] if can(rule.source_asg)
}
outbound_source_asg_ids = {
for rule in var.outbound_rules : rule.name => [
for asg in rule.source_asg :
data.azurerm_application_security_group.asg[asg.name].id
] if can(rule.source_asg)
}
}
# Create NSG inbound rules
resource "azurerm_network_security_rule" "inbound_rules" {
for_each = { for rule in var.inbound_rules : rule.name => rule }
name = each.value.name
resource_group_name = var.resource_group_name
network_security_group_name = azurerm_network_security_group.nsg.name
priority = each.value.priority
protocol = each.value.protocol
description = lookup(each.value, "description", null)
direction = "Inbound"
access = lookup(each.value, "access", "Allow")
source_port_range = lookup(each.value, "source_port_range", null)
source_port_ranges = lookup(each.value, "source_port_ranges", null)
destination_port_range = lookup(each.value, "destination_port_range", null)
destination_port_ranges = lookup(each.value, "destination_port_ranges", null)
source_address_prefix = lookup(each.value, "source_address_prefix", null)
source_address_prefixes = lookup(each.value, "source_address_prefixes", null)
destination_address_prefix = lookup(each.value, "destination_address_prefix", null)
destination_address_prefixes = lookup(each.value, "destination_address_prefixes", null)
source_application_security_group_ids = can(each.value.source_asg) ? local.inbound_source_asg_ids[each.value.name] : []
destination_application_security_group_ids = can(each.value.destination_asg) ? local.inbound_destination_asg_ids[each.value.name] : []
}
# Create NSG outbound rules
resource "azurerm_network_security_rule" "outbound_rules" {
for_each = { for rule in var.outbound_rules : rule.name => rule }
name = each.value.name
resource_group_name = var.resource_group_name
network_security_group_name = azurerm_network_security_group.nsg.name
priority = each.value.priority
protocol = each.value.protocol
description = lookup(each.value, "description", null)
direction = "Outbound"
access = lookup(each.value, "access", "Allow")
source_port_range = lookup(each.value, "source_port_range", null)
source_port_ranges = lookup(each.value, "source_port_ranges", null)
destination_port_range = lookup(each.value, "destination_port_range", null)
destination_port_ranges = lookup(each.value, "destination_port_ranges", null)
source_address_prefix = lookup(each.value, "source_address_prefix", null)
source_address_prefixes = lookup(each.value, "source_address_prefixes", null)
destination_address_prefix = lookup(each.value, "destination_address_prefix", null)
destination_address_prefixes = lookup(each.value, "destination_address_prefixes", null)
source_application_security_group_ids = can(each.value.source_asg) ? local.outbound_source_asg_ids[each.value.name] : []
destination_application_security_group_ids = can(each.value.destination_asg) ? local.outbound_destination_asg_ids[each.value.name] : []
}
# NSG diagnostic setting
resource "azurerm_monitor_diagnostic_setting" "this" {
count = var.diagnostic_setting == null ? 0 : 1
name = var.diagnostic_setting.name
log_analytics_workspace_id = var.diagnostic_setting.log_analytics_workspace_id
target_resource_id = azurerm_network_security_group.nsg.id
storage_account_id = var.diagnostic_setting.storage_account_id
eventhub_name = var.diagnostic_setting.eventhub_name
eventhub_authorization_rule_id = var.diagnostic_setting.eventhub_authorization_rule_id
dynamic "enabled_log" {
for_each = var.diagnostic_setting.log_category != null ? toset(var.diagnostic_setting.log_category) : []
content {
category = enabled_log.key
}
}
dynamic "enabled_log" {
for_each = var.diagnostic_setting.log_category_group != null ? toset(var.diagnostic_setting.log_category_group) : []
content {
category_group = enabled_log.key
}
}
}