Azure Resource Manager 템플릿의 리소스 업데이트

다른 종속 리소스가 만들어질 때까지 리소스에 대한 모든 속성을 지정할 수 없는 경우와 같이 배포 중에 리소스를 업데이트해야 하는 경우가 있을 수 있습니다. 예를 들어 부하 분산 장치에 대한 백 엔드 풀을 만드는 경우 VM(가상 머신)의 NIC(네트워크 인터페이스)를 업데이트하여 백 엔드 풀에 포함할 수 있습니다. Resource Manager는 배포 동안 리소스를 업데이트하도록 지원하지만 오류를 피하고 배포가 업데이트로 처리되도록 템플릿을 적절히 디자인해야 합니다.

리소스를 만들고 나중에 업데이트할 때 두 번 참조합니다. 템플릿을 만드는 템플릿에서 먼저 참조합니다. 나중에 리소스를 업데이트할 때 동일한 이름으로 참조합니다. 그러나 두 리소스가 템플릿에서 같은 이름을 갖는 경우 Resource Manager는 예외를 throw합니다. 이 오류를 방지하려면 Microsoft.Resources/deployments 리소스 형식을 사용하여 하위 템플릿으로 연결 또는 포함된 두 번째 템플릿에 업데이트된 리소스를 지정합니다.

두 번째 템플릿에서 변경할 속성의 이름 또는 추가할 속성의 새 이름을 지정해야 합니다. 변경되지 않는 속성의 이름과 원래 값도 지정해야 합니다. 하나 이상의 원래 속성을 지정하지 못하면 Resource Manager는 사용자가 새 리소스를 만들려고 한다고 가정하고 원래 리소스를 삭제합니다.

예제 템플릿

이 기술을 설명하는 예제 템플릿을 살펴보겠습니다. 템플릿은 firstSubnet이라는 하나의 서브넷이 있는 firstVNet이라는 가상 네트워크를 배포합니다. 그런 다음, nic1이라는 가상 NIC(네트워크 인터페이스)를 배포하고 NIC를 해당 서브넷과 연결합니다. secondSubnet이라는 두 번째 서브넷을 추가하여 updateVNet라는 배포 리소스에 firstVNet을 업데이트하는 중첩된 템플릿이 포함됩니다.

{
    "$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": {}
}

firstVNet 리소스에 대한 리소스 개체를 고려합니다. 중첩된 템플릿에 있는 firstVNet에 대한 설정을 다시 지정하는 것을 주목하세요. 이는 Resource Manager가 동일한 템플릿에서 동일한 배포 이름을 허용하지 않으며 중첩된 템플릿은 다른 템플릿으로 간주되기 때문입니다. firstSubnet 리소스에 대한 값을 다시 지정하여 Resource Manager에 기존 리소스를 삭제한 후 다시 배포하는 대신 리소스를 업데이트하도록 지시합니다. 마지막으로, secondSubnet에 대한 새 설정이 이 업데이트 동안 선택됩니다.

템플릿 시도

GitHub에서 예제 템플릿을 사용할 수 있습니다. 템플릿을 배포하려면 다음 Azure CLI 명령을 실행합니다.

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

배포가 완료된 후 포털에서 지정한 리소스 그룹을 엽니다. firstVNet라는 가상 네트워크와 nic1라는 NIC가 표시됩니다. firstVNet을 클릭한 후 subnets를 클릭합니다. 처음에 만들어진 firstSubnet이 표시된 후 updateVNet 리소스에 추가된 secondSubnet이 표시됩니다.

원래 서브넷 및 업데이트된 서브넷

그런 다음, 리소스 그룹으로 다시 이동하고 nic1을 클릭한 다음, IP configurations를 클릭합니다. IP configurations 섹션에서 subnetfirstSubnet (10.0.0.0/24)으로 설정되어 있습니다.

nic1 IP configurations 설정

원래 firstVNet이 다시 만들어지는 대신 업데이트되었습니다. firstVNet이 다시 만들어졌으면 nic1firstVNet에 연결되지 않았을 것입니다.

다음 단계