Atualizar um recurso em um modelo do Azure Resource Manager

Pode haver momentos em que você precisa atualizar um recurso durante uma implantação, como quando não é possível especificar todas as propriedades de um recurso até que outros recursos dependentes sejam criados. Por exemplo, se você criar um pool de back-end para um balanceador de carga, poderá atualizar as NICs (adaptadores de rede) nas VMs (máquinas virtuais) para incluí-las no pool de back-end. O Resource Manager dá suporte à atualização de recursos durante a implantação, mas é necessário criar o modelo corretamente para evitar erros e garantir que a implantação é tratada como uma atualização.

Ao criar um recurso e atualizá-lo posteriormente, você o referencia duas vezes. Você faz referência a ele primeiro no modelo que o cria. Posteriormente, ao atualizar o recurso, você o referencia pelo mesmo nome. No entanto, se dois recursos tiverem o mesmo nome em um modelo, o Resource Manager gerará uma exceção. Para evitar esse erro, especifique o recurso atualizado em um segundo modelo que está vinculado ou incluído como um submodelo que usa o tipo de recurso Microsoft.Resources/deployments.

No segundo modelo, você deve especificar o nome da propriedade existente a ser alterado ou um novo nome de uma propriedade a ser adicionado. Você também deve especificar os nomes e os valores originais das propriedades que não são alteradas. Se você não especificar uma ou mais propriedades originais, o Resource Manager considerará que você deseja criar um novo recurso e excluirá o recurso original.

Modelo de exemplo

Vamos examinar um modelo de exemplo que demonstra a técnica. O modelo implanta uma rede virtual chamada firstVNet que tem uma sub-rede chamada firstSubnet. Em seguida, ele implanta uma NIC (interface de rede virtual) chamada nic1 e a associa à sub-rede. Um recurso de implantação denominado updateVNet inclui um modelo aninhado que atualiza firstVNet ao adicionar uma segunda sub-rede denominada 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": {}
}

Considere o objeto de recurso para o nosso recurso firstVNet. Observe que especificamos novamente as configurações para nosso firstVNet em um modelo aninhado. Isso ocorre porque o Resource Manager não permite que o mesmo nome de implantação no mesmo modelo e modelos aninhados sejam considerados como um modelo diferente. Ao especificarmos novamente nossos valores para o nosso recurso firstSubnet, estamos informando o Resource Manager para atualizar o recurso existente, em vez de excluí-lo e reimplantá-lo. Por fim, nossas novas configurações para secondSubnet são selecionadas durante essa atualização.

Experimentar o modelo

Um modelo de exemplo está disponível no GitHub. Para implantar o modelo, execute os seguintes comandos da CLI do Azure:

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

Depois que a implantação for concluída, abra o grupo de recursos que você especificou no portal. Você vê uma rede virtual denominada firstVNet e uma NIC denominada nic1. Clique em firstVNet e, depois, em subnets. Você verá a firstSubnet que foi originalmente criada e a secondSubnet que foi adicionada ao recurso updateVNet.

Original subnet and updated subnet

Depois, retorne ao grupo de recursos e clique em nic1. Em seguida, clique em IP configurations. Na seção IP configurations, a subnet é definida como firstSubnet (10.0.0.0/24).

nic1 IP configurations settings

A firstVNet original foi atualizada em vez de recriada. Se firstVNet tivesse sido recriada, a nic1 não seria associada a firstVNet.

Próximas etapas