Azure Resource Manager テンプレートのリソースを更新する

他の依存リソースが作成されるまで、リソースのすべてのプロパティを指定できないときなど、デプロイ中にリソースを更新する必要がある場合があります。 たとえば、ロード バランサーのバックエンド プールを作成する場合、仮想マシン (VM) のネットワーク インターフェイス (NIC) をバックエンド プールに含めるために、その NIC を更新することがあります。 Resource Manager ではデプロイ中のリソース更新がサポートされますが、エラーが発生しないように、また、デプロイが更新として確実に処理されるようにするには、テンプレートを適切に設計する必要があります。

リソースを作成して後で更新するときは、それを 2 回参照します。 最初に、それを作成するテンプレートで参照します。 後でリソースを更新するときに、それを同じ名前で参照します。 しかし、テンプレート内で同じ名前のリソースが 2 つあると、Resource Manager は例外をスローします。 このエラーが発生しないようにするには、リンクされているか、含められている 2 番めのテンプレートで、更新されたリソースを Microsoft.Resources/deployments リソース タイプを使用するサブテンプレートとして指定します。

2 番めのテンプレートで、変更するプロパティの名前を指定するか、追加するプロパティの新しい名前を指定する必要があります。 変更されないプロパティの名前と元の値も指定する必要があります。 元のプロパティの 1 つ以上を指定しないと、新しいリソースを作成しようとしていると Resource Manager から想定され、元のものが削除されます。

テンプレートの例

この方法を示すテンプレートの例を見てみましょう。 テンプレートで、firstSubnet という名前の 1 つのサブネットがある firstVNet という名前の仮想ネットワークをデプロイします。 次に、nic1 という名前の仮想ネットワーク インターフェイス (NIC) をデプロイし、その NIC をサブネットに関連付けます。 secondSubnet という名前の 2 番めのサブネットを追加することにより、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 が表示されます。 firstVNetsubnets の順にクリックします。 最初に作成された firstSubnet のほか、updateVNet リソースで追加された secondSubnet が表示されます。

元のサブネットと、更新されたサブネット

次に、リソース グループに戻り、nic1、次に IP configurations をクリックします。 IP configurations セクションで、subnetfirstSubnet (10.0.0.0/24) に設定されています。

nic1 IP 構成設定

元の firstVNet が、再作成されずに更新されました。 firstVNet が再作成されている場合、nic1firstVNet に関連付けられていません。

次の手順