Funções de modelo do ARM nos âmbitos de implementação

Com o Azure Resource Manager modelos (modelos do ARM), pode implementar em grupos de recursos, subscrições, grupos de gestão ou inquilinos. Geralmente, as funções de modelo do ARM funcionam da mesma forma para todos os âmbitos. Este artigo descreve as diferenças que existem para algumas funções consoante o âmbito.

Funções suportadas

Ao implementar em diferentes âmbitos, existem algumas considerações importantes:

  • A função resourceGroup() é suportada para implementações de grupos de recursos.

  • A função subscription() é suportada para implementações de grupos de recursos e subscrições.

  • As funções de referência() e list() são suportadas para todos os âmbitos.

  • Utilize resourceId() para obter o ID de um recurso implementado no grupo de recursos.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Utilize a função subscriptionResourceId() para obter o ID de um recurso implementado na subscrição.

    Por exemplo, para obter o ID de recurso de uma definição de política implementada numa subscrição, utilize:

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Utilize a função extensionResourceId() para recursos implementados como extensões do grupo de gestão. As definições de política personalizadas implementadas no grupo de gestão são extensões do grupo de gestão.

    Para obter o ID de recurso de uma definição de política personalizada ao nível do grupo de gestão, utilize:

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Utilize a função tenantResourceId() para obter o ID de um recurso implementado no inquilino. As definições de política incorporadas são recursos ao nível do inquilino. Ao atribuir uma política incorporada ao nível do grupo de gestão, utilize a função tenantResourceId.

    Para obter o ID do recurso para uma definição de política incorporada, utilize:

    "policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    

Resolução de funções nos âmbitos

Quando implementa em mais do que um âmbito, as funções resourceGroup() e subscription() resolvem de forma diferente com base na forma como especifica o modelo. Quando liga a um modelo externo, as funções resolvem sempre o âmbito desse modelo. Quando aninha um modelo num modelo principal, utilize a expressionEvaluationOptions propriedade para especificar se as funções resolvem para o grupo de recursos e a subscrição do modelo principal ou do modelo aninhado. Defina a propriedade para inner resolver o âmbito do modelo aninhado. Defina a propriedade para outer resolver para o âmbito do modelo principal.

A tabela seguinte mostra se as funções são resolvidas para o grupo de recursos principal ou incorporado e a subscrição.

Tipo de modelo Âmbito Resolução
aninhado exterior (predefinição) Grupo de recursos principal
aninhado interior Subgrupo de recursos
ligado N/D Subgrupo de recursos

O modelo de exemplo seguinte mostra:

  • modelo aninhado com âmbito predefinido (externo)
  • modelo aninhado com âmbito interno
  • modelo ligado
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "defaultScopeTemplate",
      "resourceGroup": "inlineGroup",
      "properties": {
        "mode": "Incremental",
        "parameters": {},
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [],
          "outputs": {
            "resourceGroupOutput": {
              "type": "string",
              "value": "[resourceGroup().name]"
            }
          }
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "innerScopeTemplate",
      "resourceGroup": "inlineGroup",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {},
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [],
          "outputs": {
            "resourceGroupOutput": {
              "type": "string",
              "value": "[resourceGroup().name]"
            }
          }
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "linkedTemplate",
      "resourceGroup": "linkedGroup",
      "properties": {
        "mode": "Incremental",
        "parameters": {},
        "templateLink": {
          "contentVersion": "1.0.0.0",
          "uri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/resourcegroupname.json"
        }
      }
    }
  ],
  "outputs": {
    "parentRG": {
      "type": "string",
      "value": "[format('Parent resource group is {0}', resourceGroup().name)]"
    },
    "defaultScopeRG": {
      "type": "string",
      "value": "[format('Default scope resource group is {0}', reference('defaultScopeTemplate').outputs.resourceGroupOutput.value)]"
    },
    "innerScopeRG": {
      "type": "string",
      "value": "[format('Inner scope resource group is {0}', reference('innerScopeTemplate').outputs.resourceGroupOutput.value)]"
    },
    "linkedRG": {
      "type": "string",
      "value": "[format('Linked resource group is {0}', reference('linkedTemplate').outputs.resourceGroupOutput.value)]"
    }
  }
}

Para testar o modelo anterior e ver os resultados, utilize o PowerShell ou a CLI do Azure.

New-AzResourceGroup -Name parentGroup -Location southcentralus
New-AzResourceGroup -Name inlineGroup -Location southcentralus
New-AzResourceGroup -Name linkedGroup -Location southcentralus

New-AzResourceGroupDeployment `
  -ResourceGroupName parentGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crossresourcegroupproperties.json

O resultado do exemplo anterior é:

 Name             Type                       Value
 ===============  =========================  ==========
 parentRG         String                     Parent resource group is parentGroup
 defaultScopeRG   String                     Default scope resource group is parentGroup
 innerScopeRG     String                     Inner scope resource group is inlineGroup
 linkedRG         String                     Linked resource group is linkedgroup

Passos seguintes