main.networking.tf (134 lines of code) (raw):

#create public ip(s) - Assumes each ip configuration has a unique name resource "azurerm_public_ip" "virtualmachine_public_ips" { for_each = { for key, values in local.nics_ip_configs : key => values if values.ipconfig.create_public_ip_address == true } allocation_method = var.public_ip_configuration_details.allocation_method location = var.location name = each.value.ipconfig.public_ip_address_name resource_group_name = var.resource_group_name ddos_protection_mode = var.public_ip_configuration_details.ddos_protection_mode ddos_protection_plan_id = var.public_ip_configuration_details.ddos_protection_plan_id domain_name_label = var.public_ip_configuration_details.domain_name_label edge_zone = var.edge_zone #var.public_ip_configuration_details.edge_zone idle_timeout_in_minutes = var.public_ip_configuration_details.idle_timeout_in_minutes ip_version = var.public_ip_configuration_details.ip_version sku = var.public_ip_configuration_details.sku sku_tier = var.public_ip_configuration_details.sku_tier tags = var.public_ip_configuration_details.tags != null && var.public_ip_configuration_details != {} ? var.public_ip_configuration_details.tags : local.tags zones = var.public_ip_configuration_details.zones #var.zone != null ? [var.zone] : [] # } #create the Nics resource "azurerm_network_interface" "virtualmachine_network_interfaces" { for_each = var.network_interfaces location = var.location name = each.value.name resource_group_name = coalesce(each.value.resource_group_name, var.resource_group_name) accelerated_networking_enabled = each.value.accelerated_networking_enabled dns_servers = each.value.dns_servers edge_zone = var.edge_zone #each.value.edge_zone internal_dns_name_label = each.value.internal_dns_name_label ip_forwarding_enabled = each.value.ip_forwarding_enabled tags = each.value.tags != null && each.value.tags != {} ? each.value.tags : local.tags dynamic "ip_configuration" { for_each = each.value.ip_configurations content { name = ip_configuration.value.name private_ip_address_allocation = ip_configuration.value.private_ip_address_allocation gateway_load_balancer_frontend_ip_configuration_id = ip_configuration.value.gateway_load_balancer_frontend_ip_configuration_resource_id primary = ip_configuration.value.is_primary_ipconfiguration private_ip_address = ip_configuration.value.private_ip_address private_ip_address_version = ip_configuration.value.private_ip_address_version public_ip_address_id = ip_configuration.value.create_public_ip_address ? azurerm_public_ip.virtualmachine_public_ips["${each.key}-${ip_configuration.key}"].id : ip_configuration.value.public_ip_address_resource_id subnet_id = ip_configuration.value.private_ip_subnet_resource_id } } } #configure locks on each public IP that has been created if lock values are set. resource "azurerm_management_lock" "this_public_ip" { for_each = { for key, values in local.nics_ip_configs : key => values if((values.ipconfig.create_public_ip_address == true) && (var.public_ip_configuration_details.lock_level != null)) } lock_level = var.public_ip_configuration_details.lock_level name = coalesce(each.value.ipconfig.public_ip_address_lock_name, "${each.key}-lock") scope = azurerm_public_ip.virtualmachine_public_ips[each.key].id depends_on = [ azurerm_network_interface.virtualmachine_network_interfaces, azurerm_public_ip.virtualmachine_public_ips, azurerm_linux_virtual_machine.this, azurerm_windows_virtual_machine.this ] } #configure resource locks on each NIC if the lock values are set resource "azurerm_management_lock" "this_nic" { for_each = { for nic, nicvalues in var.network_interfaces : nic => nicvalues if nicvalues.lock_level != null } lock_level = each.value.lock_level name = coalesce(each.value.lock_name, "${each.key}-lock") scope = azurerm_network_interface.virtualmachine_network_interfaces[each.key].id depends_on = [ azurerm_network_interface.virtualmachine_network_interfaces, azurerm_public_ip.virtualmachine_public_ips, azurerm_linux_virtual_machine.this, azurerm_windows_virtual_machine.this ] } #assign permissions to the network interface and/or public ip if enabled and role assignments included resource "azurerm_role_assignment" "this_network_interface" { for_each = local.nics_role_assignments principal_id = each.value.role_assignment.principal_id scope = azurerm_network_interface.virtualmachine_network_interfaces[each.value.nic_key].id condition = each.value.role_assignment.condition condition_version = each.value.role_assignment.condition_version delegated_managed_identity_resource_id = each.value.role_assignment.delegated_managed_identity_resource_id principal_type = each.value.role_assignment.principal_type role_definition_id = (length(split("/", each.value.role_assignment.role_definition_id_or_name))) > 3 ? each.value.role_assignment.role_definition_id_or_name : null role_definition_name = (length(split("/", each.value.role_assignment.role_definition_id_or_name))) > 3 ? null : each.value.role_assignment.role_definition_id_or_name skip_service_principal_aad_check = each.value.role_assignment.skip_service_principal_aad_check } resource "azurerm_monitor_diagnostic_setting" "this_nic_diags" { for_each = local.nics_diag_settings name = each.value.diagnostic_setting.name target_resource_id = azurerm_network_interface.virtualmachine_network_interfaces[each.value.nic_key].id eventhub_authorization_rule_id = each.value.diagnostic_setting.event_hub_authorization_rule_resource_id log_analytics_destination_type = each.value.diagnostic_setting.log_analytics_destination_type log_analytics_workspace_id = each.value.diagnostic_setting.workspace_resource_id partner_solution_id = each.value.diagnostic_setting.marketplace_partner_resource_id storage_account_id = each.value.diagnostic_setting.storage_account_resource_id dynamic "enabled_log" { for_each = each.value.diagnostic_setting.log_categories content { category = enabled_log.value } } dynamic "enabled_log" { for_each = each.value.diagnostic_setting.log_groups content { category_group = enabled_log.value } } dynamic "metric" { for_each = each.value.diagnostic_setting.metric_categories content { category = metric.value } } } #create the nic associations ### NSG associations resource "azurerm_network_interface_security_group_association" "this" { for_each = local.nics_nsgs network_interface_id = azurerm_network_interface.virtualmachine_network_interfaces[each.value.nic_key].id network_security_group_id = each.value.network_security_groups.network_security_group_resource_id } ### ASG Associations resource "azurerm_network_interface_application_security_group_association" "this" { for_each = local.nics_asgs application_security_group_id = each.value.application_security_groups.application_security_group_resource_id network_interface_id = azurerm_network_interface.virtualmachine_network_interfaces[each.value.nic_key].id } ### LB Pool Association resource "azurerm_network_interface_backend_address_pool_association" "this" { for_each = local.nics_ip_configs_lb_pools backend_address_pool_id = each.value.lb_pools.load_balancer_backend_pool_resource_id ip_configuration_name = each.value.ipconfig_name network_interface_id = azurerm_network_interface.virtualmachine_network_interfaces[each.value.nic_key].id } ### App GW Assocation resource "azurerm_network_interface_application_gateway_backend_address_pool_association" "this" { for_each = local.nics_ip_configs_app_gw_pools backend_address_pool_id = each.value.ag_pools.app_gateway_backend_pool_resource_id ip_configuration_name = each.value.ipconfig_name network_interface_id = azurerm_network_interface.virtualmachine_network_interfaces[each.value.nic_key].id } ### NAT Rule Assocation resource "azurerm_network_interface_nat_rule_association" "this" { for_each = local.nics_ip_configs_lb_nat_rules ip_configuration_name = each.value.ipconfig_name nat_rule_id = each.value.lb_nat_rules.load_balancer_nat_rule_resource_id network_interface_id = azurerm_network_interface.virtualmachine_network_interfaces[each.value.nic_key].id }