Funções de modelo do ARM em escopos de implantação
Com os modelos do ARM (modelos do Azure Resource Manager), você pode implantar em grupos de recursos, assinaturas, grupos de gerenciamento ou locatários. Geralmente, as funções de modelo do ARM funcionam da mesma forma para todos os escopos. Este artigo descreve as diferenças entre algumas funções dependendo do escopo.
Funções suportadas
Para implantar em escopos diferentes, veja algumas considerações importantes:
A função resourceGroup() é compatível com as implantações de grupo de recursos.
A função subscription() é compatível com as implantações de assinatura e de grupo de recursos.
As funções reference() e list() são compatíveis com todos os escopos.
Use resourceId() para obter a ID de um recurso implantado no grupo de recursos.
"subnet": { "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]" }
Use a função subscriptionResourceId() para obter a ID de um recurso implantado na assinatura.
Por exemplo, para obter a ID de recurso de uma definição de política que foi implantada em uma assinatura, use:
"roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
Use a função extensionResourceId() para recursos que são implementados como extensões do grupo de gerenciamento. As definições de política personalizadas que são implantadas no grupo de gerenciamento são extensões do grupo de gerenciamento.
Para obter a ID de recurso de uma definição de política personalizada no nível do grupo de gerenciamento, use:
"policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Use a função tenantResourceId() para obter a ID de um recurso implantado no locatário. As definições de política internas são recursos de nível de locatário. Ao atribuir uma política interna no nível do grupo de gerenciamento, use a função tenantResourceId.
Para obter a ID do recurso de uma definição de política interna, use:
"policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
Resolução da função em escopos
Quando você implantar mais de um escopo, as funções resourceGroup() e subscription() serão resolvidas de modo diferente dependendo da maneira que você especificou o modelo. Quando você vincula a um modelo externo, as funções sempre são resolvidas para o escopo desse modelo. Quando você aninha um modelo dentro de um modelo pai, use a propriedade expressionEvaluationOptions
para especificar se as funções são resolvidas para o grupo de recursos e a assinatura para o modelo pai ou o modelo aninhado. Defina a propriedade como inner
para resolver para o escopo do modelo aninhado. Defina a propriedade como outer
para resolver para o escopo do modelo pai.
A tabela a seguir mostra se as funções são resolvidas para o grupo de recursos pai ou aninhado e para a assinatura.
Tipo do modelo | Escopo | Resolução |
---|---|---|
aninhado | externo (padrão) | Grupo de recursos pai |
aninhado | interna | Subgrupo de recursos |
vinculado | N/D | Subgrupo de recursos |
O modelo de exemplo a seguir mostra:
- o modelo aninhado com escopo padrão (externo)
- o modelo aninhado com escopo interno
- o modelo vinculado
{
"$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, use 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
Próximas etapas
- Para entender como definir parâmetros no modelo, confira Noções básicas sobre a estrutura e a sintaxe de modelos do ARM.
- Para dicas sobre como resolver erros de implantação, consulte Solução de erros comuns de implantação do Azure com o Azure Resource Manager.
- Para obter informações sobre como implantar um modelo que exige um token SAS, confira Implantar um modelo do ARM privado com o token SAS.