Linter rule - no location expressions outside of parameter default values

This rule finds resourceGroup().location or deployment().location used outside of a parameter default value.

Linter rule code

Use the following value in the Bicep configuration file to customize rule settings:

no-loc-expr-outside-params

Solution

resourceGroup().location and deployment().location should only be used as the default value of a parameter.

Template users may have limited access to regions where they can create resources. The expressions resourceGroup().location or deployment().location could block users if the resource group or deployment was created in a region the user can't access, thus preventing them from using the template.

Best practice suggests that to set your resources' locations, your template should have a string parameter named location. If you default the location parameter to resourceGroup().location or deployment().location instead of using these functions elsewhere in the template, users of the template can use the default value when convenient but also specify a different location when needed.

resource storageaccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  location: resourceGroup().location
}

You can fix the failure by creating a location property that defaults to resourceGroup().location and use this new parameter instead:

param location string = resourceGroup().location

resource storageaccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  location: location
}

The following example fails this test because location is using resourceGroup().location but isn't a parameter:

  var location = resourceGroup().location

You can fix the failure by turning the variable into a parameter:

  param location string  = resourceGroup().location

If you're using Azure PowerShell to deploy to a subscription, management group, or tenant, you should use a parameter name other than location. The New-AzDeployment, New-AzManagementGroupDeployment, and New-AzTenantDeployment commands have a parameter named location. This command parameter conflicts with the parameter in your Bicep file. You can avoid this conflict by using a name such as rgLocation.

You can use location for a parameter name when deploying to a resource group, because New-AzResourceGroupDeployment doesn't have a parameter named location.

Next steps

For more information about the linter, see Use Bicep linter.