Mettre à jour une ressource dans un modèle Azure Resource Manager

Il peut arriver que vous deviez mettre à jour une ressource pendant un déploiement, par exemple lorsque vous ne pouvez pas spécifier toutes les propriétés d’une ressource tant que d’autres ressources dépendantes n’ont pas été créées. Par exemple, si vous créez un pool principal pour un équilibrage de charge, vous pouvez mettre à jour les interfaces réseau (NIC) sur vos machines virtuelles pour les inclure dans le pool principal. Resource Manager prend en charge la mise à jour des ressources lors du déploiement, mais vous devez concevoir votre modèle correctement pour éviter les erreurs et garantir que le déploiement est traité comme une mise à jour.

Lorsque vous créez une ressource et la mettez à jour ultérieurement, vous la référencez deux fois. Vous la référencez d’abord dans le modèle qui la crée. Plus tard, lorsque vous mettez à jour la ressource, vous la référencez par le même nom. Toutefois, si deux ressources ont le même nom dans un modèle, Resource Manager lève une exception. Pour éviter cette erreur, spécifiez la ressource mise à jour dans un second modèle qui est lié ou inclus en tant que sous-modèle à l’aide du type de ressource Microsoft.Resources/deployments.

Dans le deuxième modèle, vous devez spécifier le nom de la propriété à modifier ou un nouveau nom de propriété à ajouter. Vous devez également spécifier les noms et les valeurs d’origine des propriétés qui ne changent pas. Si vous ne spécifiez pas une ou plus de propriétés d’origine, Resource Manager part du principe que vous souhaitez créer une nouvelle ressource et supprime la ressource initiale.

Exemple de modèle

Examinons un exemple de modèle illustrant cette technique. Le modèle déploie un réseau virtuel nommé firstVNet et qui comporte un sous-réseau appelé firstSubnet. Il déploie ensuite une interface réseau virtuelle (NIC) nommée nic1 et associe le NIC au sous-réseau. Une ressource de déploiement nommée updateVNet inclut un modèle imbriqué qui met à jour firstVNet en ajoutant un second sous-réseau appelé secondSubnet.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "resources": [
        {
            "apiVersion": "2020-05-01",
            "name": "firstVNet",
            "location": "[resourceGroup().location]",
            "type": "Microsoft.Network/virtualNetworks",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "10.0.0.0/22"
                    ]
                },
                "subnets": [
                    {
                        "name": "firstSubnet",
                        "properties": {
                            "addressPrefix": "10.0.0.0/24"
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "2020-05-01",
            "type": "Microsoft.Network/networkInterfaces",
            "name": "nic1",
            "location": "[resourceGroup().location]",
            "dependsOn": [
                "firstVNet"
            ],
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'firstVNet', 'firstSubnet')]"
                            }
                        }
                    }
                ]
            }
        },
        {
            "apiVersion": "2020-06-01",
            "type": "Microsoft.Resources/deployments",
            "name": "updateVNet",
            "dependsOn": [
                "nic1"
            ],
            "properties": {
                "mode": "Incremental",
                "parameters": {},
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.1",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "apiVersion": "2020-05-01",
                            "name": "firstVNet",
                            "location": "[resourceGroup().location]",
                            "type": "Microsoft.Network/virtualNetworks",
                            "properties": {
                                "addressSpace": "[reference('firstVNet').addressSpace]",
                                "subnets": [
                                    {
                                        "name": "[reference('firstVNet').subnets[0].name]",
                                        "properties": {
                                            "addressPrefix": "[reference('firstVNet').subnets[0].properties.addressPrefix]"
                                        }
                                    },
                                    {
                                        "name": "secondSubnet",
                                        "properties": {
                                            "addressPrefix": "10.0.1.0/24"
                                        }
                                    }
                                ]
                            }
                        }
                    ],
                    "outputs": {}
                }
            }
        }
    ],
    "outputs": {}
}

Considérez l’objet de ressource pour notre ressourcefirstVNet. Notez que nous spécifions de nouveau les paramètres de notre ressource firstVNet dans un modèle imbriqué, parce que Resource Manager n’autorise pas l’utilisation du même nom de déploiement dans le même modèle, et que les modèles imbriqués sont considérés comme des modèles distincts. En spécifiant une nouvelle fois nos valeurs pour notre ressource firstSubnet, nous indiquons à Resource Manager de mettre à jour la ressource existante au lieu de la supprimer et de la redéployer. Pour finir, nos nouveaux paramètres pour secondSubnet sont sélectionnés dans le cadre de cette mise à jour.

Essayer le modèle

Un exemple de modèle est disponible sur GitHub. Pour déployer le modèle, exécutez les commandes Azure CLI suivantes :

az group create --location <location> --name <resource-group-name>
az deployment group create -g <resource-group-name> \
    --template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example1-update/deploy.json

Une fois le déploiement terminé, ouvrez le groupe de ressources que vous avez spécifié dans le portail. Vous voyez un réseau virtuel nommé firstVNet et une interface de réseau virtuel appelée nic1. Cliquez sur firstVNet, puis sur subnets. Vous voyez firstSubnet qui a été créé à l’origine et vous voyez secondSubnet qui a été ajouté dans la ressource updateVNet.

Sous-réseau d’origine et sous-réseau mis à jour

Ensuite, revenez au groupe de ressources, cliquez sur nic1, puis cliquez sur IP configurations. Dans la section IP configurations, subnet est défini sur firstSubnet (10.0.0.0/24).

Paramètres de configuration IP nic1

Le firstVNet d’origine a été mis à jour au lieu d’être recréé. Si firstVNet avait été recréé, nic1 ne serait pas être associé à firstVNet.

Étapes suivantes