0

I have a VMSS which I deployed using ARM templates. This is the networkProfile block under VMSS resource section.

             "networkProfile": {
                 "networkInterfaceConfigurations": [
                     {
                         "name": "[variables('nicName')]",
                         "properties": {
                             "primary": true,
                             "ipConfigurations": [
                                 {
                                     "name": "[concat(variables('VMSSName'), '-ipconfig')]",
                                     "properties": {
                                         "subnet": {
                                             "id": "[variables('subnetRef')]"
                                          },
                                         "applicationGatewayBackendAddressPools": "[variables('AppGatewayBackendAddressPool')]"
                                         }
                                     }
                                 ]
                             }
                         }
                     ]
                 },

In Variable section, if I use resourceId() function and provide values from parameters then it does not apply the configuration in VMSS. for example:

"AppGatewayBackendAddressPool": "[resourceId(parameters('VirtualNetworkResourceGroup'),'Microsoft.Network/applicationGateways/backendAddressPools', parameters('ApplicationGatewayName'), parameters('BackendAddressPool'))]",

I've also tried adding parameters('SubscriptionName') but the result is same.

"AppGatewayBackendAddressPool": "[resourceId(parameters('SubscriptionName') ,parameters('VirtualNetworkResourceGroup'),'Microsoft.Network/applicationGateways/backendAddressPools', parameters('ApplicationGatewayName'), parameters('BackendAddressPool'))]",

When I declare variable like below then it applies backendAddressPool configuration in Networking -> Load Balancing.

"AppGatewayBackendAddressPool": [
        { "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/applicationGateways/<applicationGatewayName>/backendAddressPools/<backendAddressPool>" }
 ],

Similar I'm doing with subnetRef like below and that is working fine.

"subnetRef": "[resourceId(parameters('VirtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('VirtualNetworkName'),  parameters('SubnetName'))]",

I want to parametrize the deployment by defining separate parameters.json file so I can attach applicationGatewayBackendAddressPools with different virtual machine scale sets.

3 Answers3

1

This is how I achieved it by following Ked Mardemootoo answer.

IP configuration section under networkProfile of VMSS resource.

"ipConfigurations": [
  {
      "name": "[concat(variables('VMSSName'), '-ipconfig')]",
      "properties": {
          "subnet": {
              "id": "[variables('subnetRef')]"
          },
          "applicationGatewayBackendAddressPools": [
              { "id": "[concat(parameters('AapplicationGatewayExternalid'), '/backendAddressPools/', parameters('BackendAddressPool'))]" }
          ]
      }
  }
]

Template file parameters:

        "BackendAddressPool": {
            "type": "string",
            "metadata": {
                "description": "Backend pool to host blue/green vmss."
            }
        },
        "AapplicationGatewayExternalid": {
            "type": "string",
            "metadata": {
                "description": "Application Gateway Id."
            }
        }

Now, ARM template is calling and referencing applicationGatewayBackendAddressPools attribute dynamically under VMSS' resource section.

I have these two parameters in parameters.json file where I can define values according to environment.

        "BackendAddressPool": {
            "value": "<backendPoolName>"
        },
        "AapplicationGatewayExternalid": {
            "value": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/applicationGateways/<ApplicationGatewayName>"
        }

Overriding template variables in release pipeline vars: overriding template vars

Defining in pipeline vars pipeline var

0

Nothing seems wrong with your variables/parameters call but applicationGatewayBackendAddressPools is not a valid attribute for neither VMSS nor Application Gateway.

You can do it check AKS and Application Gateway documentations. I achieve the same goal by setting backendAddressPools, which is in Application Gateway section, in different parameters.json files.

efdestegul
  • 617
  • 3
  • 6
  • I'm still not sure then how the same `applicationGatewayBackendAddressPools` attribute is working fine when I declare variable as: `"AppGatewayBackendAddressPool": [ { "id": "/subscriptions//resourceGroups//providers/Microsoft.Network/applicationGateways//backendAddressPools/" } ],` – Muhammad Zeeshan May 31 '21 at 15:34
0

You seem to be missing the concat in the variables. Looking at the raw json on my end, this is how it's configured. See if you can do something similar, and convert the subnet name and backend address pool to variables.

"ipConfigurations": [
    {
        "name": "ip-vmss-name",
        "properties": {
            "primary": true,
            "subnet": {
                "id": "[concat(parameters('virtualNetworks_vnet_externalid'), '/subnets/snet-vm')]"
            },
            "privateIPAddressVersion": "IPv4",
            "applicationGatewayBackendAddressPools": [
                {
                    "id": "[concat(parameters('applicationGateways_agw_1_externalid'), '/backendAddressPools/be-addr-pool-vmss-1')]"
                }
            ]
        }
    }
]
Ked Mardemootoo
  • 1,480
  • 1
  • 5
  • 19