terraform { required_version = "~> 0.12.21" required_providers { azurerm = "~> 1.44" } } resource "azurerm_lb" "azlb" { for_each = var.lbs name = each.key resource_group_name = each.value.resource_group_name location = each.value.location tags = each.value.tags sku = try(each.value.sku, "Basic") #Basic or Standard dynamic "frontend_ip_configuration" { for_each = try(each.value.frontend_ip_configurations, {}) content { name = try(frontend_ip_configuration.value.name, join("-ipc", [each.key, index(each.value.frontend_ip_configurations, frontend_ip_configuration)])) subnet_id = data.azurerm_subnet.sub[frontend_ip_configuration.value.name].id private_ip_address_allocation = try(frontend_ip_configuration.value.private_ip_address_allocation, "Static") #Static or Dynamic private_ip_address = try(frontend_ip_configuration.value.private_ip_address_allocation, "Static") == "Static" ? frontend_ip_configuration.value.private_ip_address : null public_ip_address_id = try(frontend_ip_configuration.value.public_ip_address_id, null) public_ip_prefix_id = try(frontend_ip_configuration.value.public_ip_prefix_id, null) zones = try(frontend_ip_configuration.value.zones, null) } } depends_on = [var.azlb_depends_on] } locals { fipcs = flatten([ for lbkey, lb in var.lbs : [ for fipc in try(lb.frontend_ip_configurations, []) : { name = fipc.name rules = try(fipc.rules, []) lb_name = lbkey resource_group_name = lb.resource_group_name subnet = { name = fipc.subnet.name virtual_network_name = fipc.subnet.virtual_network_name resource_group_name = try(fipc.subnet.resource_group_name, lb.resource_group_name) } } ] ]) } data "azurerm_subnet" "sub" { for_each = {for fipc in local.fipcs: fipc.name => fipc} name = each.value.subnet.name virtual_network_name = each.value.subnet.virtual_network_name resource_group_name = each.value.subnet.resource_group_name depends_on = [var.azlb_depends_on] } locals { bps = flatten([ for lbkey, lb in var.lbs : [ for bp in try(lb.backend_pools, []) : { name = bp.name resource_group_name = lb.resource_group_name lb_name = lbkey nics = bp.nics } ] ]) } resource "azurerm_lb_backend_address_pool" "azlbbpool" { for_each = {for bp in local.bps: bp.name => bp} name = each.key resource_group_name = each.value.resource_group_name loadbalancer_id = azurerm_lb.azlb[each.value.lb_name].id } locals { rules = flatten([ for fipc in local.fipcs : [ for rule in fipc.rules : { name = rule.name resource_group_name = fipc.resource_group_name lb_name = fipc.lb_name fipc_name = fipc.name protocol = rule.protocol # Tcp, Udp or All frontend_port = rule.frontend_port backend_port = rule.backend_port backend_pool_name = rule.backend_pool_name load_distribution = rule.load_distribution # 'Default', SourceIP, SourceIPProtocol probe = rule.probe } ] ]) } locals { probes = flatten([ for rule in local.rules : { name = rule.probe.name resource_group_name = rule.resource_group_name lb_name = rule.lb_name protocol = rule.probe.protocol # Tcp, Http or Https port = try(rule.probe.port, rule.backend_port) request_path = try(rule.probe.request_path, null) } ]) } resource "azurerm_lb_probe" "azlbprobe" { for_each = {for probe in local.probes: probe.name => probe} name = each.key resource_group_name = each.value.resource_group_name loadbalancer_id = azurerm_lb.azlb[each.value.lb_name].id protocol = each.value.protocol port = each.value.port request_path = try(each.value.request_path, null) } resource "azurerm_lb_rule" "azlbrule" { for_each = {for rule in local.rules: rule.name => rule} name = each.key resource_group_name = each.value.resource_group_name loadbalancer_id = azurerm_lb.azlb[each.value.lb_name].id frontend_ip_configuration_name = each.value.fipc_name protocol = each.value.protocol backend_address_pool_id = azurerm_lb_backend_address_pool.azlbbpool[each.value.backend_pool_name].id frontend_port = each.value.frontend_port backend_port = each.value.backend_port load_distribution = each.value.load_distribution probe_id = azurerm_lb_probe.azlbprobe[each.value.probe.name].id # depends_on = [azurerm_marketplace_agreement.accept] } locals { nics = flatten([ for bp in local.bps : [ for nic in bp.nics : { name = nic.name resource_group_name = nic.resource_group_name lb_name = bp.lb_name ipc_name = nic.ipc_name bp_name = bp.name } ] ]) } data "azurerm_network_interface" "nic" { for_each = {for nic in local.nics: nic.name => nic} name = each.key resource_group_name = each.value.resource_group_name depends_on = [var.azlb_depends_on] } resource "azurerm_network_interface_backend_address_pool_association" "aznicbpass" { for_each = {for nic in local.nics: nic.name => nic} network_interface_id = data.azurerm_network_interface.nic[each.key].id ip_configuration_name = each.value.ipc_name backend_address_pool_id = azurerm_lb_backend_address_pool.azlbbpool[each.value.bp_name].id }