Fonctions de modèle ARM dans les étendues de déploiement

Avec les modèles Azure Resource Manager (modèles ARM), vous pouvez déployer sur des groupes de ressources, des abonnements, des groupes d’administration ou des locataires. En règle générale, les fonctions de modèle ARM fonctionnent de la même manière pour toutes les étendues. Cet article décrit les différences qui existent pour certaines fonctions d’après l’étendue.

Fonctions prises en charge

Lors du déploiement sur différentes étendues, il est important de tenir compte des points suivants :

  • La fonction resourceGroup() est prise en charge pour les déploiements de groupes de ressources.

  • La fonction subscription() est prise en charge pour les déploiements de groupes de ressources et d’abonnements.

  • Les fonctions reference() et list() sont prises en charge pour toutes les étendues.

  • Utilisez resourceId() pour obtenir l’ID d’une ressource déployée au niveau du groupe de ressources.

    "subnet": {
      "id": "[resourceId(parameters('virtualNetworkResourceGroup'), 'Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnet1Name'))]"
    }
    
  • Vous pouvez également utiliser la fonction subscriptionResourceId() pour récupérer l’ID d’une ressource déployée au niveau de l’abonnement.

    Par exemple, pour obtenir l’ID de ressource d’une définition de stratégie déployée sur un abonnement, utilisez :

    "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    
  • Utilisez la fonction extensionResourceId() pour les ressources qui sont implémentées en tant qu’extensions du groupe d’administration. Les définitions de stratégie personnalisée qui sont déployées sur un groupe d’administration sont des extensions de celui-ci.

    Pour obtenir l’ID de ressource d’une définition de stratégie personnalisée au niveau du groupe d’administration, utilisez :

    "policyDefinitionId": "[extensionResourceId(variables('mgScope'), 'Microsoft.Authorization/policyDefinitions', parameters('policyDefinitionID'))]"
    
  • Utilisez la fonction tenantResourceId() pour obtenir l’ID d’une ressource déployée au niveau du locataire. Les définitions de stratégie intégrées sont des ressources de niveau locataire. Lorsque vous affectez une stratégie intégrée au niveau du groupe d’administration, utilisez la fonction tenantResourceId.

    Pour obtenir l’ID de ressource d’une définition de stratégie intégrée, utilisez :

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

Résolution de fonction dans les étendues

Quand vous effectuez un déploiement dans plusieurs étendues, les fonctions resourceGroup() et subscription() sont résolues différemment selon la façon dont vous spécifiez le modèle. Quand vous établissez un lien vers un modèle externe, les fonctions sont toujours résolues par rapport à la portée de ce modèle. Quand vous imbriquez un modèle dans un modèle parent, utilisez la propriété expressionEvaluationOptions pour indiquer si les fonctions sont résolues par rapport au groupe de ressources et à l’abonnement pour le modèle parent ou le modèle imbriqué. Affectez à la propriété la valeur inner pour effectuer la résolution par rapport à l’étendue du modèle imbriqué. Affectez à la propriété la valeur outer pour effectuer la résolution par rapport à l’étendue du modèle parent.

Le tableau suivant indique si les fonctions sont résolues par rapport à l’abonnement ou au groupe de ressources parent ou incorporé.

Type de modèle Étendue Résolution
Imbriqué Externe (par défaut) Groupe de ressources parent
Imbriqué interne Sous-groupe de ressources
Lié N/A Sous-groupe de ressources

L’exemple de modèle suivant montre :

  • Un modèle imbriqué avec l’étendue par défaut (externe)
  • Un modèle imbriqué avec l’étendue interne
  • Un modèle lié
{
  "$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)]"
    }
  }
}

Pour tester le modèle précédent et voir les résultats, utilisez PowerShell ou Azure CLI.

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

La sortie de l’exemple précédent est :

 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

Étapes suivantes