リソースをデプロイするときには、デプロイが増分更新と完全更新のどちらであるかを指定する必要があります。 これら 2 つのモードの違いは、テンプレートにないリソース グループの既存のリソースを Resource Manager が処理する方法にあります。
どちらのモードでも、Resource Manager はテンプレートで指定されたすべてのリソースを作成しようとします。 リソースがリソース グループに既に存在し、その設定が変更されていない場合、そのリソースに対する操作は行われません。 リソースのプロパティ値を変更すると、リソースはそれらの新しい値で更新されます。 既存のリソースの場所またはタイプを更新しようとすると、デプロイメントはエラーで失敗します。 代わりに、必要な場所または種類で新しいリソースをデプロイします。
デフォルトのモードは増分モードです。
増分モード
増分モードでは、Resource Manager は、リソース グループに存在するがテンプレートで指定されていないリソース を変更せずに残します 。 テンプレート内のリソースは、リソース グループ に追加されます 。
Von Bedeutung
増分モードは、推奨される展開モードです。 Bicep ファイルまたは ARM JSON テンプレートの一部としてリソースを削除する必要がある場合は、 デプロイ スタックを使用します。
既存のリソースを増分モードで再デプロイすると、すべてのプロパティが再適用されます。 プロパティは増分的に追加されません。 よくある誤解は、テンプレートで指定されていないプロパティは変更されないままであると考えることです。 特定のプロパティを指定しない場合、Resource Manager はデプロイをそれらの値を上書きしていると解釈します。 テンプレートに含まれていないプロパティは、既定値にリセットされます。 更新する値だけでなく、リソースの既定値以外のすべての値を指定します。 テンプレートのリソース定義には、常にリソースの最終的な状態が含まれています。 既存のリソースに対する部分的な更新を表すことはできません。
Warnung
まれに、リソースまたはその子リソースの 1 つにプロパティを指定できます。 一般的な 2 つの例は、 仮想ネットワーク上のサブネット と Web アプリのサイト構成値です。 このような場合は、増分更新を慎重に処理する必要があります。
サブネットの場合は、subnets
リソースの プロパティを使用して値を指定します。 子リソース Microsoft.Network/virtualNetworks/subnets を使用して値を定義しないでください。 サブネットが仮想ネットワークで定義されている限り、仮想ネットワークを再デプロイしてもサブネットを失うことはありません。
サイト構成値の場合、値は子リソースの種類 Microsoft.Web/sites/config
に実装されます。 Web アプリを再デプロイし、サイト構成値に空のオブジェクトを指定した場合、子リソースは更新されません。 ただし、新しいサイト構成値を指定すると、子リソースの種類が更新されます。
完全モード
Warnung
コンプリート モードはお勧めしません。 Bicep または ARM テンプレートのデプロイで削除を実行する場合は、 デプロイ スタックを使用します。
完全モードでは、Resource Manager は、リソース グループに存在するが、テンプレートで指定されていないリソース を削除します 。
注
テンプレートを完全モードでデプロイする前に、必ず 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 は削除されません。
リソースの種類が削除を処理する方法の一覧については、「 完全モードのデプロイでの Azure リソースの削除」を参照してください。
リソース グループが ロックされている場合、完全モードではリソースは削除されません。
注
ルートレベルのテンプレートのみが完全デプロイメントモードをサポートします。 リンクされたテンプレートまたはネストされたテンプレートの場合は、増分モードを使用する必要があります。
サブスクリプション レベルのデプロイ では、完全モードはサポートされていません。
現在、ポータルでは完全モードはサポートされていません。
結果の例
インクリメンタル モードと完全モードの違いを説明するために、次のシナリオを考えてみます。
リソースグループ には、次のものが含まれます。
- リソース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」を参照してください。