Azure Resource Manager のデプロイ モード
リソースをデプロイするときには、デプロイが増分更新と完全更新のどちらであるかを指定する必要があります。 これら 2 つのモードの違いは、テンプレートにないリソース グループの既存のリソースを Resource Manager が処理する方法にあります。
いずれのモードでも、Resource Manager はテンプレートで指定されたすべてのリソースの作成を試みます。 リソースが既にリソース グループ内に存在しており、その設定が変更されていない場合、そのリソースに対しては何の操作も行われません。 リソースのプロパティ値を変更した場合、リソースはそれらの新しい値で更新されます。 既存のリソースの場所または種類を更新しようとすると、デプロイがエラーで失敗します。 その代わり、必要な場所または種類で新しいリソースをデプロイできます。
既定のモードは増分です。
完全モード
完全モードでは、Resource Manager はリソース グループに存在するがテンプレートに指定されていないリソースを削除します。
Note
テンプレートを完全モードでデプロイする前に、必ず what-if 操作を使用してください。 What-if では、作成、削除、または変更されるリソースが示されます。 リソースを誤って削除しないようにするには、what-if を使用します。
condition が false と評価されるためにデプロイされないリソースがテンプレートに含まれている場合、テンプレートをデプロイするために使用する REST API のバージョンによって結果が異なります。 2019-05-10 より前のバージョンを使用する場合、リソースは削除されません。 2019-05-10 以降では、リソースは削除されます。 最新バージョンの Azure PowerShell および Azure CLI では、リソースは削除されます。
コピー ループでは完全モードを使用するように注意してください。 コピー ループを解決した後でテンプレートに指定されていないリソースはすべて削除されます。
テンプレート内の複数のリソース グループにデプロイする場合、デプロイ操作で指定されたリソース グループ内のリソースは削除対象となります。 セカンダリ リソース グループ内のリソースは削除されません。
完全モードでは、リソースの種類に応じて削除の動作が多少異なります。 親リソースは、完全モードでデプロイされたテンプレートに含まれていない場合、自動的に削除されます。 一部の子リソースは、テンプレートに含まれていなければ、自動的には削除されません。 ただし、親リソースが削除されると、これらの子リソースも削除されます。
たとえば、リソース グループに DNS ゾーン (リソースの種類は Microsoft.Network/dnsZones
) と CNAME レコード (リソースの種類は Microsoft.Network/dnsZones/CNAME
) が含まれるとします。DNS ゾーンは CNAME レコードの親リソースです。 テンプレートを完全モードでデプロイし、そこに DNS ゾーンを含めていない場合、DNS ゾーンと CNAME レコードの両方が削除されます。 テンプレートに DNS ゾーンだけを含め、CNAME レコードは含めていない場合、CNAME は削除されません。
リソースの種類別に削除の動作を説明した一覧については、「Deletion of Azure resources for complete mode deployments (完全モードのデプロイでの Azure リソースの削除)」をご覧ください。
リソース グループがロックされている場合、完全モードはリソースを削除しません。
Note
完全デプロイ モードがサポートされるのはルートレベルのテンプレートのみです。 リンクされたテンプレートまたは入れ子になったテンプレートには、増分モードを使用する必要があります。
サブスクリプション レベルのデプロイでは、完全モードはサポートされていません。
現時点では、ポータルでは完全モードはサポートされていません。
増分モード
増分モードでは、Resource Manager はリソース グループに存在するが、テンプレートに指定されていないリソースを変更せず、そのまま残します。 テンプレート内のリソースは、リソース グループに追加されます。
重要
既存のリソースを増分モードで再デプロイすると、すべてのプロパティが再適用されます。 プロパティは増分的に追加されません。 テンプレートで指定されていないプロパティは変更されないままであるという一般的な誤解があります。 特定のプロパティを指定しなかった場合、Resource Manager では、デプロイによってそれらの値が上書きされると解釈されます。 テンプレートに含まれていないプロパティは、既定値にリセットされます。 更新対象だけでなく、リソースの既定以外のすべての値を指定します。 テンプレート内のリソース定義には、常にリソースの最終的な状態が含まれています。 既存のリソースに対する部分的な更新を表すことはできません。
警告
まれに、リソースまたは子リソースの 1 つでプロパティを指定できます。 2 つの一般的な例は、仮想ネットワーク上のサブネットと、Web アプリのサイト構成値です。 このような場合は、増分更新を慎重に処理する必要があります。
サブネットの場合、Microsoft-Network/virtualNetworks リソースの subnets
プロパティーを使用して値を指定します。 子リソース Microsoft.Network/virtualNetworks/subnets を使用して値を定義しないでください。 サブネットが仮想ネットワークで定義されている限り、仮想ネットワークを再デプロイして、サブネットが失われる可能性はありません。
サイト構成値の場合、値は子リソースの種類で実装されますMicrosoft.Web/sites/config
。 Web アプリを再デプロイし、サイト構成値に空のオブジェクトを指定した場合、子リソースは更新されません。 ただし、新しいサイト構成値を指定すると、子リソースの種類が更新されます。
結果の例
増分モードと完全モードの違いを説明するために、次のシナリオについて考えます。
リソース グループには、次が含まれます。
- リソース A
- リソース B
- リソース C
テンプレートには、次が含まれます。
- リソース A
- リソース B
- リソース D
増分モードでデプロイすると、リソース グループには次が含まれます。
- リソース A
- リソース B
- リソース C
- リソース D
完全モードでデプロイすると、リソース C が削除されます。 リソース グループには次が含まれます。
- リソース A
- リソース B
- リソース D
デプロイ モードの設定
PowerShell を使用してデプロイするときにデプロイ モードを設定するには、Mode
パラメーターを使用します。
New-AzResourceGroupDeployment `
-Mode Complete `
-Name ExampleDeployment `
-ResourceGroupName ExampleResourceGroup `
-TemplateFile c:\MyTemplates\storage.json
Azure CLI を使用してデプロイするときにデプロイ モードを設定するには、mode
パラメーターを使用します。
az deployment group create \
--mode Complete \
--name ExampleDeployment \
--resource-group ExampleResourceGroup \
--template-file storage.json
次の例は、増分デプロイ モードに設定された、リンクされたテンプレート セットを示しています。
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2020-10-01",
"name": "linkedTemplate",
"properties": {
"mode": "Incremental",
<nested-template-or-external-template>
}
}
]
次のステップ
- Resource Manager テンプレートの作成については、「ARM テンプレートの構造と構文について」を参照してください。
- リソースをデプロイする方法については、「ARM テンプレートと Azure PowerShell を使用したリソースのデプロイ」を参照してください。
- リソース プロバイダーの操作を表示するには、「Azure REST API」を参照してください。