Search code examples
azureazure-virtual-networkazure-bicepazure-load-balancer

backendAddressPool in Azure Load Balancer with only IP addresses does not deploy


I want to deploy an Azure Load Balancer with only IP addresses - which are not referring to Azure VM/VMSS NICs but to generic connected on-prem servers - with Bicep like:

resource ilb 'Microsoft.Network/loadBalancers@2022-05-01' = {
  name: ilbName
...
    backendAddressPools: [
      {
        name: 'direct'
        properties: {
          loadBalancerBackendAddresses: [
            {
              name: 'server65'
              properties: {
                ipAddress: '192.168.42.65'
                virtualNetwork: {
                  id: vnetHubId
                }
              }
            }
            {
              name: 'server66'
              properties: {
                ipAddress: '192.168.42.66'
                virtualNetwork: {
                  id: vnetHubId
                }
              }
            }
          ]
        }
      }
    ]
...

However after deployment - with no errors showing even in debug mode - no IP addresses are display in Portal and when checking with CLI:

> az network lb address-pool show --lb-name ilb-123456789012 -g portfwd-rg -n direct
{
  "etag": "W/\"037f2314-c311-4378-9486-a076cacc7491\"",
  "id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/portfwd-rg/providers/Microsoft.Network/loadBalancers/ilb-123456789012/backendAddressPools/direct",
  "loadBalancerBackendAddresses": [],
  "loadBalancingRules": [
    {
      "id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/portfwd-rg/providers/Microsoft.Network/loadBalancers/ilb-123456789012/loadBalancingRules/direct",
      "resourceGroup": "portfwd-rg"
    }
  ],
  "name": "direct",
  "provisioningState": "Succeeded",
  "resourceGroup": "portfwd-rg",
  "type": "Microsoft.Network/loadBalancers/backendAddressPools"

When creating the backend address pool with CLI it works:

> az network lb address-pool create --lb-name ilb-123456789012 -g portfwd-rg -n direct2 \
--backend-address name=server65 ip-address=192.168.42.65 \
--backend-address name=server66 ip-address=192.168.42.66 \
--vnet /subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/portfwd-rg/providers/Microsoft.Network/virtualNetworks/vnet-hub-123456789012
> az network lb address-pool show --lb-name ilb-123456789012 -g portfwd-rg -n direct2
{
  "etag": "W/\"efeef00f-3dd4-4b7c-bfa3-f58030757dea\"",
  "id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/portfwd-rg/providers/Microsoft.Network/loadBalancers/ilb-123456789012/backendAddressPools/direct2",
  "loadBalancerBackendAddresses": [
    {
      "ipAddress": "192.168.42.65",
      "name": "server65",
      "virtualNetwork": {
        "id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/portfwd-rg/providers/Microsoft.Network/virtualNetworks/vnet-hub-123456789012",
        "resourceGroup": "portfwd-rg"
      }
    },
    {
      "ipAddress": "192.168.42.66",
      "name": "server66",
      "virtualNetwork": {
        "id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/portfwd-rg/providers/Microsoft.Network/virtualNetworks/vnet-hub-123456789012",
        "resourceGroup": "portfwd-rg"
      }
    }
  ],
  "name": "direct2",
  "provisioningState": "Succeeded",
  "resourceGroup": "portfwd-rg",
  "type": "Microsoft.Network/loadBalancers/backendAddressPools"
}

EDIT: So I basically mapped the --debug / PUT request body of az network lb address-pool create to Bicep. This is the PUT request body:

{"name": "direct", "properties": {"loadBalancerBackendAddresses": [{"name": "server65", "properties": {"ipAddress": "192.168.42.65", "virtualNetwork": {"id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/portfwd-rg/providers/Microsoft.Network/virtualNetworks/vnet-hub-123456789012"}}}, {"name": "server66", "properties": {"ipAddress": "192.168.42.66", "virtualNetwork": {"id": "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/portfwd-rg/providers/Microsoft.Network/virtualNetworks/vnet-hub-123456789012"}}}]}}

What am I missing or doing wrong?


Solution

  • I had a similar problem. Without seeing all of your code I will sure with you what I did to fix my problem. I hope it can help you.

    main.bicep

    param location string = resourceGroup().location
    
    var loadBalancerName = 'dev-web01-LB'
    var virtualNetworkName = 'dev-dev-VNET'
    var subnetName = 'dev-web-Net'
    var subnetRef = resourceId('Microsoft.Network/virtualNetworks/subnets', virtualNetworkName, subnetName)
    
    resource loadBalancers_name 'Microsoft.Network/loadBalancers@2022-07-01' = {
      name: loadBalancerName
      location: location
      sku: {
        name: 'Standard'
        tier: 'Regional'
      }
      properties: {
        frontendIPConfigurations: [
          {
            name: 'FrontendIP'
            id: resourceId('Microsoft.Network/loadBalancers/frontendIpConfigurations', loadBalancerName, 'FrontendIP')
            properties: {
              privateIPAddress: '192.168.42.196'
              privateIPAllocationMethod: 'Static'
              subnet: {
                id: subnetRef
              }
              privateIPAddressVersion: 'IPv4'
            }
          }
        ]
        backendAddressPools: [
          {
            name: 'BackendPool'
          }
        ]
        loadBalancingRules: [
          // Start of Rule
          {
            name: 'server65'
            id: resourceId('Microsoft.Network/loadBalancers/frontendIpConfigurations', loadBalancerName, 'server65')
            properties: {
              frontendIPConfiguration: {
                id: resourceId('Microsoft.Network/loadBalancers/frontendIpConfigurations', loadBalancerName, 'FrontendIP')
              }
              frontendPort: 605
              backendPort: 605
              enableFloatingIP: false
              idleTimeoutInMinutes: 4
              protocol: 'Tcp'
              enableTcpReset: false
              loadDistribution: 'Default'
              disableOutboundSnat: false
              backendAddressPool: {
                id: resourceId('Microsoft.Network/loadBalancers/backendAddressPools', loadBalancerName, 'BackendPool')
              }
              backendAddressPools: [
                {
                  id: resourceId('Microsoft.Network/loadBalancers/backendAddressPools', loadBalancerName, 'BackendPool')
                }
              ]
              probe: {
                id: resourceId('Microsoft.Network/loadBalancers/probes', loadBalancerName, 'HealthProbe')
              }
            }
          }
          // End of Rule
          {
            name: 'server66'
            id: resourceId('Microsoft.Network/loadBalancers/frontendIpConfigurations', loadBalancerName, 'server66')
            properties: {
              frontendIPConfiguration: {
                id: resourceId('Microsoft.Network/loadBalancers/frontendIpConfigurations', loadBalancerName, 'FrontendIP')
              }
              frontendPort: 606
              backendPort: 606
              enableFloatingIP: false
              idleTimeoutInMinutes: 4
              protocol: 'Tcp'
              enableTcpReset: false
              loadDistribution: 'Default'
              disableOutboundSnat: false
              backendAddressPool: {
                id: resourceId('Microsoft.Network/loadBalancers/backendAddressPools', loadBalancerName, 'BackendPool')
              }
              backendAddressPools: [
                {
                  id: resourceId('Microsoft.Network/loadBalancers/backendAddressPools', loadBalancerName, 'BackendPool')
                }
              ]
              probe: {
                id: resourceId('Microsoft.Network/loadBalancers/probes', loadBalancerName, 'HealthProbe')
              }
            }
          }
        ]
        probes: [
          {
            name: 'HealthProbe'
            id: resourceId('Microsoft.Network/loadBalancers/probes', loadBalancerName, 'HealthProbe')
            properties: {
              protocol: 'Tcp'
              port: 8483
              intervalInSeconds: 5
              numberOfProbes: 1
              probeThreshold: 1
            }
          }
        ]
      }
    }
    
    module devweb01vm './dev-web01-vm.bicep' = {
      name: 'dev-web01-VM'
      scope: resourceGroup('dev-dev-RG')
      params: {
        location: location
      }
      dependsOn: [
        loadBalancers_name
      ]
    }
    
    module devweb02vm './dev-web02-vm.bicep' = {
      name: 'dev-web02-VM'
      scope: resourceGroup('dev-dev-RG')
      params: {
        location: location
      }
      dependsOn: [
        loadBalancers_name
      ]
    }
    

    dev-web01-vm.bicep

    param location string = resourceGroup().location
    
    var virtualNetworkName = 'dev-dev-VNET'
    var loadBalancerName = 'dev-web01-LB'
    var subnetName = 'dev-web-Net'
    var subnetRef = resourceId('Microsoft.Network/virtualNetworks/subnets', virtualNetworkName, subnetName)
    
    resource dev_web01_VM_nic 'Microsoft.Network/networkInterfaces@2022-07-01' = {
      name: 'dev-web01-vm-Nic'
      location: location
      properties: {
        ipConfigurations: [
          {
            name: 'ipconfig1'
            type: 'Microsoft.Network/networkInterfaces/ipConfigurations'
            properties: {
              privateIPAddress: '192.168.42.250'
              privateIPAllocationMethod: 'Static'
              subnet: {
                id: subnetRef
              }
              primary: true 
              privateIPAddressVersion: 'IPv4'
              loadBalancerBackendAddressPools: [
                {
                  id: resourceId('Microsoft.Network/loadBalancers/backendAddressPools', loadBalancerName, 'BackendPool')
                }
              ]
            }
          }
        ]
      }
    }
    

    dev-web02-vm.bicep

    param location string = resourceGroup().location
    
    var virtualNetworkName = 'dev-dev-VNET'
    var loadBalancerName = 'dev-web01-LB'
    var subnetName = 'dev-web-Net'
    var subnetRef = resourceId('Microsoft.Network/virtualNetworks/subnets', virtualNetworkName, subnetName)
    
    resource dev_web02_vm_nic 'Microsoft.Network/networkInterfaces@2022-07-01' = {
      name: 'dev-web02-vm-Nic'
      location: location
      properties: {
        ipConfigurations: [
          {
            name: 'ipconfig1'
            type: 'Microsoft.Network/networkInterfaces/ipConfigurations'
            properties: {
              privateIPAddress: '192.168.42.251'
              privateIPAllocationMethod: 'Static'
              subnet: {
                id: subnetRef
              }
              primary: true 
              privateIPAddressVersion: 'IPv4'
              loadBalancerBackendAddressPools: [
                {
                  id: resourceId('Microsoft.Network/loadBalancers/backendAddressPools', loadBalancerName, 'BackendPool')
                }
              ]
            }
          }
        ]
      }
    }