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 が表示されます。
firstVNet
、subnets
の順にクリックします。 最初に作成された firstSubnet
のほか、updateVNet
リソースで追加された secondSubnet
が表示されます。
次に、リソース グループに戻り、nic1
、次に IP configurations
をクリックします。
IP configurations
セクションで、subnet
が firstSubnet (10.0.0.0/24)
に設定されています。
元の firstVNet
が、再作成されずに更新されました。
firstVNet
が再作成されている場合、nic1
は firstVNet
に関連付けられていません。
次の手順
- Azure Resource Manager
- ARM テンプレートとは
- チュートリアル:初めての ARM テンプレートを作成してデプロイする
- チュートリアル:ARM テンプレートにリソースを追加する
- ARM テンプレートのベスト プラクティス
- Azure Resource Manager のドキュメント
- ARM テンプレートのドキュメント