Memperbarui sumber daya di template Azure Resource Manager

Mungkin ada kalanya Anda perlu memperbarui sumber daya selama penyebaran, seperti ketika Anda tidak dapat menentukan semua properti untuk sumber daya hingga sumber daya dependen lainnya dibuat. Misalnya, jika Anda membuat kumpulan backend untuk load balancer, Anda dapat memperbarui antarmuka jaringan (NIC) pada mesin virtual (VM) Anda untuk menyertakannya ke dalam kumpulan backend. Resource Manager mendukung pembaruan sumber daya selama penyebaran, tetapi Anda harus merancang templat dengan benar untuk menghindari kesalahan dan memastikan bahwa penyebaran ditangani sebagai pembaruan.

Saat Anda membuat sumber daya dan memperbaruinya nanti, Anda mereferensikannya dua kali. Anda mereferensikannya terlebih dahulu dalam templat yang membuatnya. Kemudian, saat memperbarui sumber daya, Anda mereferensikannya dengan nama yang sama. Namun, jika dua sumber daya memiliki nama yang sama di templat, Resource Manager akan mengeluarkan pengecualian. Untuk menghindari kesalahan ini, tentukan sumber daya yang diperbarui dalam templat kedua yang ditautkan atau disertakan sebagai subteks Microsoft.Resources/deployments yang menggunakan jenis sumber daya.

Di templat kedua, Anda harus menentukan nama properti untuk diubah atau nama baru untuk properti yang akan ditambahkan. Anda juga harus menentukan nama dan nilai asli properti yang tidak berubah. Jika Anda gagal menentukan satu atau beberapa properti asli, Resource Manager mengasumsikan bahwa Anda ingin membuat sumber daya baru dan menghapus yang asli.

Contoh templat

Mari kita lihat contoh templat yang menunjukkan teknik. Templat menyebarkan jaringan virtual bernama firstVNet yang memiliki satu subnet bernama firstSubnet. Kemudian menyebarkan antarmuka jaringan virtual (NIC) bernama nic1 dan mengaitkan NIC dengan subnet. Sumber daya penyebaran bernama updateVNet menyertakan templat berlapis yang diperbarui firstVNet dengan menambahkan subnet kedua bernama 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": {}
}

Pertimbangkan objek sumber daya untuk sumber daya kita firstVNet . Perhatikan bahwa kami menentukan lagi pengaturan untuk kami firstVNet dalam templat berlapis—ini karena Resource Manager tidak mengizinkan nama penyebaran yang sama dalam templat yang sama, dan templat berlapis dianggap sebagai templat yang berbeda. Dengan sekali lagi menentukan nilai untuk sumber daya, firstSubnet kami memberi tahu Resource Manager untuk memperbarui sumber daya yang ada alih-alih menghapusnya dan menyebarkannya kembali. Yang terakhir, setelan baru kita untuk secondSubnet diambil selama pembaruan ini.

Coba templatenya

Contoh template tersedia di GitHub. Untuk menerapkan templat, jalankan perintah Azure CLI berikut:

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

Setelah penyebaran selesai, buka grup sumber daya yang Anda tentukan di portal. Anda akan melihat jaringan virtual bernama firstVNet dan NIC bernama nic1. Klik firstVNet, lalu klik subnets. Anda akan melihat firstSubnet yang awalnya dibuat, dan Anda akan melihat secondSubnet yang ditambahkan di sumber daya updateVNet.

Subnet asli dan subnet yang diperbarui

Kemudian, kembali ke grup sumber daya dan klik nic1, lalu klik IP configurations. Di bagian IP configurations, subnet disetel ke firstSubnet (10.0.0.0/24).

Pengaturan konfigurasi IP nic1 IP

firstVNet Aslinya diperbarui alih-alih dibuat ulang. Jika firstVNet telah dibuat ulang, nic1 tidak akan dikaitkan dengan firstVNet.

Langkah berikutnya