Bicep ファイルをデプロイする前に、行われる変更をプレビューできます。 Azure Resource Manager (ARM) は What-If 操作を提供し、Bicep ファイルをデプロイした場合にリソースがどのように変化するかを確認できます。 what-if 操作では、既存のリソースに対していかなる変更も行われません。 代わりに、指定した Bicep ファイルがデプロイされた場合の変更が予測されます。
What-If 操作は、 Visual Studio Code、Azure PowerShell、Azure CLI、または REST API の操作で使用できます。 What-if は、リソース グループ、サブスクリプション、管理グループ、テナント レベルのデプロイでサポートされています。
What-If 操作中は、templateLink
の評価と拡張はサポートされていません。 その結果、入れ子になったデプロイ内でテンプレート リンクを使用してデプロイされたリソース (テンプレート スペック参照を含む) は、What-If 操作の結果には表示されません。
[前提条件]
必要なアクセス許可
Bicep ファイルまたは Azure Resource Manager (ARM) テンプレートをデプロイするには、デプロイするリソースに対する書き込みアクセス権と、 Microsoft.Resources/deployments
リソースの種類に対するすべての操作へのアクセス権が必要です。 たとえば、仮想マシンをデプロイするには、Microsoft.Compute/virtualMachines/write
および Microsoft.Resources/deployments/*
アクセス許可が必要です。 What-If 操作のアクセス許可要件も同じです。
Azure CLI バージョン 2.76.0 以降 と Azure PowerShell バージョン 13.4.0 以降 では、このプロセス中に ARM が Bicep テンプレートを徹底的に検証する方法を決定する ValidationLevel スイッチが導入されています。 詳細については、「What-if コマンド」を参照してください。
ロールとアクセス許可の一覧については、Azure の組み込みロールに関するページを参照してください。
Installation
Azure CLI で what-if を使用するには、Azure CLI 2.14.0 以降である必要があります。 必要であれば、Azure CLI の最新バージョンをインストールします。
制限事項
What-if は、次の制限に達するまで、入れ子になったテンプレートを展開します。
- 500 個の入れ子になったテンプレート。
- クロス リソース グループのデプロイにおける 800 個のリソース グループ。
- 入れ子になったテンプレートの展開に 5 分かかる。
これらの制限のいずれかに達すると、残りのリソースの変更の種類が "無視" に設定されます。
短絡
Bicep デプロイでの What-If 操作では、"ショートサーキット" が発生する可能性があります。これは、デプロイの構造または外部状態への依存関係により、サービスがモジュールまたはリソースを完全に分析できないシナリオです。 個々のリソースのショートサーキットは、多くの場合、未解決の式または外部依存関係が原因で、リソース ID または API バージョンをデプロイ コンテキストの外部で計算できない場合に発生します。 詳細については、「 未評価の式」を参照してください。 まれですが、モジュールまたは入れ子になったデプロイ リソースのショートサーキットも発生する可能性があります。その結果、モジュール内のすべてのリソースが What-If 分析結果から除外されます。 このような場合、API 応答には問題を示す診断メッセージが含まれます。
what-if 操作の実行
最新バージョンの Az PowerShell モジュール (13.1.0 以降) または Azure CLI (2.75.0 以降) を使用すると、what-if がデプロイの一部を分析できない場合に診断が提供されます。 これらのツールの以前のバージョンは同じように動作しますが、診断は表示されません。 たとえば、CLI バージョン 2.74.0 を使用する場合、問題は引き続き発生します。これは警告なしに発生するだけです。
What-if コマンド
Bicep ファイルをデプロイする前に変更をプレビューするには、以下を使用します。
- az deployment group what-if (リソース グループのデプロイの場合)
- az deployment sub what-if (サブスクリプション レベルのデプロイの場合)
- az deployment mg what-if (管理グループのデプロイの場合)
- az deployment tenant what-if (テナントのデプロイの場合)
Azure CLI バージョン 2.76.0 以降 では、このプロセス中に ARM が Bicep テンプレートを徹底的に検証する方法を決定する --validation-level
スイッチが導入されています。 次の値を受け入れます。
- プロバイダー (既定): テンプレートの構文、リソース定義、依存関係、アクセス許可チェックなど、完全な検証を実行して、テンプレート内のすべてのリソースをデプロイするための十分なアクセス許可があることを確認します。
- ProviderNoRbac: プロバイダーと同様に、テンプレートとリソースの完全な検証を実行しますが、完全なデプロイアクセス許可ではなく、各リソースに対する読み取りアクセス許可のみをチェックします。 これは、フル アクセスを必要とせずにリソース構成を検証する場合に便利です。
- テンプレート: 静的検証のみを実行し、プレフライト チェック (リソースの可用性など) とアクセス許可チェックをスキップしながら、テンプレートの構文と構造をチェックします。 これはあまり徹底していないので、デプロイエラーの原因となる可能性のある問題が見つからない可能性があります。
--confirm-with-what-if
(または短縮形式 -c
) を使用して、変更をプレビューし、デプロイを続行するかどうかを確認するプロンプトを表示することもできます。 このスイッチを次のコマンドに追加します。
- az deployment group create コマンドを実行する
- az deployment sub create
- az deployment mg create
- az deployment tenant create コマンドを使用して、新しいテナントのデプロイメントを作成します。
たとえば、リソース グループのデプロイの場合は az deployment group create --confirm-with-what-if
または -c
を使用します。
上記のコマンドは、手動で検査できるテキストの概要を返します。 プログラムによって変更を検査できる JSON オブジェクトを取得するには、--no-pretty-print
スイッチを使用します。 たとえば、リソース グループのデプロイの場合は az deployment group what-if --no-pretty-print
を使用します。
カラーなしの結果を返す場合は、Azure CLI 構成ファイルを開きます。 no_color を yes に設定します。
REST API については、以下を使用します。
- リソース グループ デプロイの場合は「デプロイ - What If」
- サブスクリプションのデプロイの場合は「デプロイ - サブスクリプション スコープでの What If」
- 管理グループのデプロイの場合は「デプロイ - 管理グループ スコープでの What If」
- テナントのデプロイの場合は「デプロイ - テナント スコープでの What If」
what-if 操作は、Azure SDK を介して使用できます。
- Python の場合は、what-if を使用します。
- Java の場合は、DeploymentWhatIf クラスを使用します。
- .NET の場合は、DeploymentWhatIf クラスを使用します。
環境を設定する
what-if がどのように動作するか見るため、いくつかのテストを実行してみましょう。 まず、仮想ネットワークを作成する Bicep ファイルをデプロイします。 次の Bicep ファイルを what-if-before.bicep
として保存します。
resource vnet 'Microsoft.Network/virtualNetworks@2024-07-01' = {
name: 'vnet-001'
___location: resourceGroup().___location
tags: {
CostCenter: '12345'
Owner: 'Team A'
}
properties: {
addressSpace: {
addressPrefixes: [
'10.0.0.0/16'
]
}
enableVmProtection: false
enableDdosProtection: false
subnets: [
{
name: 'subnet001'
properties: {
addressPrefix: '10.0.0.0/24'
}
}
{
name: 'subnet002'
properties: {
addressPrefix: '10.0.1.0/24'
}
}
]
}
}
Bicep ファイルをデプロイするには、次のコマンドを使用します。
az group create \
--name ExampleGroup \
--___location "Central US"
az deployment group create \
--resource-group ExampleGroup \
--template-file "what-if-before.bicep"
変更をテストする
デプロイが完了すると、what-if 操作をテストできる状態になります。 ここでは、仮想ネットワークを変更する Bicep ファイルをデプロイします。 前の例と比較すると、次の例では、元のタグの 1 つが見落とされ、サブネットが削除され、アドレス プレフィックスが変更されています。 次の Bicep ファイルを what-if-after.bicep
として保存します。
resource vnet 'Microsoft.Network/virtualNetworks@2024-07-01' = {
name: 'vnet-001'
___location: resourceGroup().___location
tags: {
CostCenter: '12345'
}
properties: {
addressSpace: {
addressPrefixes: [
'10.0.0.0/15'
]
}
enableVmProtection: false
enableDdosProtection: false
subnets: [
{
name: 'subnet002'
properties: {
addressPrefix: '10.0.1.0/24'
}
}
]
}
}
変更を確認するには、次のコマンドを使用します。
az deployment group what-if \
--resource-group ExampleGroup \
--template-file "what-if-after.bicep"
what-if の出力は次のようになります。
テキスト出力は次のとおりです。
Resource and property changes are indicated with these symbols:
- Delete
+ Create
~ Modify
- tags.Owner: "Team A"
+ properties.enableVmProtection: false
~ properties.addressSpace.addressPrefixes: [
- 0: "10.0.0.0/16"
+ 0: "10.0.0.0/15"
]
~ properties.subnets: [
- 0:
name: "subnet001"
properties.addressPrefix: "10.0.0.0/24"
properties.defaultOutboundAccess: false
properties.privateEndpointNetworkPolicies: "Disabled"
properties.privateLinkServiceNetworkPolicies: "Enabled"
]
Resource changes: 1 to modify.
出力の上部で、変更の種類を示す色が定義されていることに注意してください。
出力の下部には、タグ Owner が削除されたことが表示されています。 アドレス プレフィックスが 10.0.0.0/16 から 10.0.0.0/15 に変更されました。 subnet001 という名前のサブネットが削除されました。 これらの変更は、デプロイされていないことに注意してください。 Bicep ファイルをデプロイした場合に行われる変更のプレビューが表示されています。
削除済みとして一覧されたプロパティの一部は、実際には変更されません。 プロパティは、Bicep ファイルに含まれていない場合、削除済みとして誤って報告されることがありますが、デプロイ時に既定値として自動的に設定されます。 この結果は、what-if 応答では "ノイズ" と見なされます。 最後にデプロイされたリソースには、プロパティ用の値セットがあります。 what-if 操作が成熟すると、これらのプロパティは結果から除外されます。
削除の確定
Bicep ファイルをデプロイする前に変更をプレビューするには、デプロイ コマンドで confirm スイッチ パラメーターを使用します。 変更が期待どおりの場合は、デプロイを完了すると応答します。
az deployment group create \
--resource-group ExampleGroup \
--confirm-with-what-if \
--template-file "what-if-after.bicep"
テキスト出力は次のとおりです。
Resource and property changes are indicated with these symbols:
- Delete
+ Create
~ Modify
The deployment will update the following scope:
Scope: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ExampleGroup
~ Microsoft.Network/virtualNetworks/vnet-001 [2024-07-01]
- properties.privateEndpointVNetPolicies: "Disabled"
- tags.Owner: "Team A"
+ properties.enableVmProtection: false
~ properties.addressSpace.addressPrefixes: [
- 0: "10.0.0.0/16"
+ 0: "10.0.0.0/15"
]
~ properties.subnets: [
- 0:
name: "subnet001"
properties.addressPrefix: "10.0.0.0/24"
properties.defaultOutboundAccess: false
properties.privateEndpointNetworkPolicies: "Disabled"
properties.privateLinkServiceNetworkPolicies: "Enabled"
]
Resource changes: 1 to modify.
Are you sure you want to execute the deployment? (y/n):
期待通りの変更が表示され、デプロイを実行することを確認できます。
what-if 結果のプログラムによる評価
次に、コマンドを変数に設定して、what-if 結果をプログラムで評価してみましょう。
results=$(az deployment group what-if --resource-group ExampleGroup --template-file "what-if-after.bicep" --no-pretty-print)
what-if の結果を理解する
結果を表示する
what-if を PowerShell または Azure CLI で使用する際、さまざまな種類の変更を確認するのに役立つ、色分けされた結果が出力されます。
テキスト出力は次のとおりです。
Resource and property changes are indicated with these symbols:
- Delete
+ Create
~ Modify
The deployment will update the following scope:
Scope: /subscriptions/./resourceGroups/ExampleGroup
~ Microsoft.Network/virtualNetworks/vnet-001 [2018-10-01]
- tags.Owner: "Team A"
~ properties.addressSpace.addressPrefixes: [
- 0: "10.0.0.0/16"
+ 0: "10.0.0.0/15"
]
~ properties.subnets: [
- 0:
name: "subnet001"
properties.addressPrefix: "10.0.0.0/24"
]
Resource changes: 1 to modify.
注
What-if 操作では、reference 関数を解決できません。 reference 関数を含むテンプレート式にプロパティを設定するたびに、What-if は、そのプロパティが変更されることを報告します。 この動作は、What-if がそのプロパティの現在の値 (ブール値の場合は true
や false
など) を未解決のテンプレート式と比較するために発生します。 当然、これらの値は一致しません。 Bicep ファイルをデプロイすると、そのプロパティは、テンプレート式が別の値に解決される場合にのみ変更されます。
変更の種類
what-if 操作では、7 種類の異なる変更が一覧表示されます:
- 作成: リソースは現在存在しませんが、Bicep ファイル内で定義されています。 リソースが作成されます。
- 削除: この変更の種類は、JSON テンプレートのデプロイに完全モードを使用する場合にのみ適用されます。 リソースは存在しますが、Bicep ファイル内では定義されていません。 完全モードでは、リソースが削除されます。 この変更の種類には、完全モードの削除をサポートしているリソースのみが含まれます。
- 無視: リソースは存在しますが、Bicep ファイル内では定義されていません。 リソースはデプロイまたは変更されません。 入れ子になったテンプレートの展開の制限に達すると、この変更の種類になります。 「What-if 制限」を参照してください。
-
変更なし: リソースは存在し、Bicep ファイル内で定義されています。 リソースは再デプロイされますが、リソースのプロパティは変更されません。 この変更の種類は、ResultFormat が
FullResourcePayloads
に設定されている場合に返されます。これは既定値です。 -
NoEffect: プロパティは読み取り専用であり、サービスによって無視されます。 たとえば、
sku.tier
プロパティは常にsku.name
名前空間でMicrosoft.ServiceBus
に一致するように設定されます。 -
変更: リソースは存在し、Bicep ファイル内で定義されています。 リソースは再デプロイされ、リソースのプロパティが変更されます。 この変更の種類は、ResultFormat が
FullResourcePayloads
に設定されている場合に返されます。これは既定値です。 -
デプロイ: リソースは存在し、Bicep ファイル内で定義されています。 リソースは再デプロイされます。 リソースのプロパティは、変更される場合と変更されない場合があります。 いずれかのプロパティが変更されるかどうか判断するのに十分な情報がない場合、操作ではこの変更の種類が返されます。 この状況は、ResultFormat が
ResourceIdOnly
に設定されている場合にのみ表示されます。
結果の形式
予測される変更に関して返される詳細さのレベルを制御します。 2 つのオプションがあります。
- FullResourcePayloads - 変更されるリソースの一覧と、変更されるプロパティの詳細を返します
- ResourceIdOnly - 変更されるリソースの一覧を返します
既定値は FullResourcePayloads です。
PowerShell のデプロイ コマンドでは、-WhatIfResultFormat
パラメーターを使用します。 プログラム オブジェクト コマンドでは、ResultFormat
パラメーターを使用します。
Azure CLI の場合は、--result-format
パラメーターを使用します。
次の結果では、2 つの異なる出力形式が示されています。
完全なリソース ペイロード
Resource and property changes are indicated with these symbols: - Delete + Create ~ Modify The deployment will update the following scope: Scope: /subscriptions/./resourceGroups/ExampleGroup ~ Microsoft.Network/virtualNetworks/vnet-001 [2018-10-01] - tags.Owner: "Team A" ~ properties.addressSpace.addressPrefixes: [ - 0: "10.0.0.0/16" + 0: "10.0.0.0/15" ] ~ properties.subnets: [ - 0: name: "subnet001" properties.addressPrefix: "10.0.0.0/24" ] Resource changes: 1 to modify.
リソース ID のみ
Resource and property changes are indicated with this symbol: ! Deploy The deployment will update the following scope: Scope: /subscriptions/./resourceGroups/ExampleGroup ! Microsoft.Network/virtualNetworks/vnet-001 Resource changes: 1 to deploy.
未評価の式
未評価の式が出力に表示される場合は、what-if をデプロイのコンテキスト外で評価できないことを意味します。 式は、デプロイの実行時に入力される情報を示す as-is 表示されます。
param now string = utcNow()
resource sa 'Microsoft.Storage/storageAccounts@2025-01-01' = {
name: 'acct'
___location: resourceGroup().___location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
tags: {
lastDeployedOn: now
lastDeployedBy: deployer().userPrincipalName
}
}
前の例では、 now
パラメーターは utcNow()
関数を使用して現在の日付と時刻を取得します。 what-if を実行すると、これらの式はデプロイのコンテキスト外では評価できないため、as-is 表示されます。 what-if 出力は次のようになります。
Note: The result may contain false positive predictions (noise).
You can help us improve the accuracy of the result by opening an issue here: https://aka.ms/WhatIfIssues
Resource and property changes are indicated with this symbol:
~ Modify
The deployment will update the following scope:
Scope: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/jgaotest
~ Microsoft.Storage/storageAccounts/acct0808 [2025-01-01]
~ tags.lastDeployedOn: "20250808T200145Z" => "[utcNow()]"
Resource changes: 1 to modify.
what-if では、次の式は評価されません。
- newGuid() や utcNow() などの非決定論的関数
- セキュリティで保護されたパラメーター値への参照。
- 同じテンプレートにデプロイされていないリソースへの参照。
- 同じテンプレートで定義されていないリソース プロパティへの参照。
- listKeys()などの任意のリソース関数。
リソースをクリーンアップする
サンプル リソースが不要になったら、Azure CLI または Azure PowerShell を使用してリソース グループを削除します。
az group delete --name ExampleGroup
次のステップ
- パイプラインで What-If 操作を使用するには、「Test ARM templates with What-If in a pipeline」 (パイプラインで What-If を使用して ARM テンプレートをテストする) を参照してください。
- What-If 操作から正しくない結果が表示された場合は、https://aka.ms/whatifissues で問題を報告してください。
- what if の使用方法を示している Learn モジュールについては、「what-if と ARM テンプレート テスト ツールキットを使用して変更をプレビューし、Azure リソースを検証する」を参照してください。