What-If を使用して、デプロイで行われることを予測する

完了

環境内のリソースをデプロイまたは変更しているユーザーは、次のような疑問を心に抱いています。

  • 何かを壊しはしないだろうか?
  • 何を削除するか?
  • このデプロイによって既存のリソースにどのような影響があるだろうか?
  • デプロイ ボタンを押す前に、デプロイで発生すると予想されることが実際に発生することであるかどうかを検証できるか?

デプロイして最善の結果を期待するのは、よい方法ではありません。 もっとよい方法は、What-If 操作を使用することです。 この操作は、新しいデプロイを試みた場合の結果を予測するのに役立ちます。

Azure Resource Manager には、テンプレートをデプロイした場合の変更内容がはっきりわかる What-If 操作が用意されています。 what-if 操作では、既存のリソースに対していかなる変更も行われません。 代わりに、指定したテンプレートがリソース グループとサブスクリプション レベルでデプロイされた場合の変更が予測されます。

Note

What-If 操作では、変更が実際には発生しないのにリソースが変更されることが示される場合があります。 Microsoft では、これらの問題を削減することに取り組んでいますが、お客様のご協力が必要です。 このような問題が発生した場合は、ぜひご報告してください

What-If 操作を使用すると、現在の状態モデルと望ましい状態モデルが比較されます。 What-If 操作により、実際のリソースまたはそれらのリソースの状態に変更を適用すること "なく"、テンプレートによって行われる変更が予想と一致するかどうかが確認されます。

What-If 結果の形式を制御する

New-AzResourceGroupDeployment Azure PowerShell コマンドレットにより、リソース グループへの新しいデプロイが作成されます。 このコマンドに -Whatif パラメーターを追加すると、コマンドはデプロイの実行から、実行した場合に何が発生するかを示す "プレビュー" の単なる報告に切り替わります。

az deployment group what-if コマンドを使用すると、デプロイを実行した場合に何が発生するかをプレビューできます。

結果の形式として次のいずれかを使用することにより、What-If 操作のテキスト出力の量を制御することができます。

  • FullResourcePayloads。 このパラメーターを含めると、変更されるリソースの一覧で構成された "詳細" 出力が得られます。 出力には、テンプレートに従って変更されるすべてのプロパティの詳細も表示されます。
  • ResourceIdOnly。 このモードを使用すると、変更されるリソースの一覧が返されますが、すべての詳細は返されません。

たとえば、既存の環境に 1 つのストレージ アカウントをデプロイするテンプレートで、ストレージの種類を変更するとします。

たとえば、次の PowerShell コードを実行して、完全なリソース ペイロードを示すように Resource Manager に要求します。

New-AzResourceGroupDeployment `
  -ResourceGroupName ToyStorage `
  -TemplateFile $templateFileName `
  -WhatIf `
  -WhatIfResultFormat FullResourcePayloads
az deployment group what-if \
  --resource-group ToyStorage \
  --template-file $templateFile \
  --result-format FullResourcePayloads

前のコマンドにより、次の結果が生成されます。

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/ToyStorage

  ~ Microsoft.Storage/storageAccounts/bz64gjjpidbuvi [2019-06-01]
    ~ sku.name: "Standard_LRS" => "Standard_GRS"

Resource changes: 1 to modify.

この後、コマンドを再実行しますが、今度はリソース ID のみを要求します。

New-AzResourceGroupDeployment `
  -ResourceGroupName ToyStorage `
  -TemplateFile $templateFileName `
  -WhatIf `
  -WhatIfResultFormat ResourceIdOnly
az deployment group what-if \
  --resource-group ToyStorage \
  --template-file $templateFile \
  --result-format ResourceIdOnly

前のコマンドにより、次の結果が生成されます。

Resource and property changes are indicated with this symbol:
  ! Deploy

The deployment will update the following scope:

Scope: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/ToyStorage

  ! Microsoft.Storage/storageAccounts/bz64gjjpidbuvi

Resource changes: 1 to deploy.

What-If によって検出される変更の種類

What-If 操作を使用すると、6 種類の変更が一覧表示されます。

Type 説明 結果
作成 現在、リソースは存在しませんが、テンプレートで定義されています。 リソースが作成されます。
削除 この変更の種類は "完全モード" のデプロイを使用する場合にのみ適用されます。 リソースは存在しますが、テンプレートで定義されていません。 増分モードを使用してデプロイする場合、リソースは削除されません。 完全モードを使用してデプロイする場合、リソースは削除されます。 この変更の種類は、完全モードによる削除をサポートしているリソースについてのみ返されます。
Ignore リソースは存在しますが、テンプレートで定義されていません。 既定のデプロイ モードである増分モードを使用する場合、リソースはデプロイも変更もされません。 完全モードを使用してデプロイする場合、リソースは削除されます。
NoChange リソースは存在し、テンプレートで定義されています。 リソースは再デプロイされますが、リソースのプロパティは変更されません。 この変更の種類は、結果の形式が、既定の結果の形式である FullResourcePayloads に設定されている場合に返されます。
変更 リソースは存在し、テンプレートで定義されています。 リソースは再デプロイされ、リソースのプロパティが変更されます。 この変更の種類は、結果の形式が、既定の結果の形式である FullResourcePayloads に設定されている場合に返されます。
配置 リソースは存在し、テンプレートで定義されています。 リソースは再デプロイされます。 リソースのプロパティは、変更される場合と変更されない場合があります。 いずれかのプロパティが変更されるかどうか判断するのに十分な情報がない場合、操作ではこの変更の種類が返されます。 結果の形式が ResourceIdOnly に設定されている場合にのみ、この状況が表示されます。

すべての変更の種類を知る必要がない場合は、-WhatIfExcludeChangeType 引数を使用して、関心がない種類を除外できます。

すべての変更の種類を知る必要がない場合は、--what-if-exclude-change-types 引数を使用して、関心がない種類を除外できます。

スクリプトで What-If の結果を使用する

スクリプト内で、または自動デプロイ プロセスの一部として、what-if 操作からの出力を使用することが必要になる場合があります。

結果を取得するには、Get-AzResourceGroupDeploymentWhatIfResult コマンドレットを使用します。 その後、スクリプトで結果を解析し、必要なカスタム ロジックを実行できます。

生の JSON 結果を取得するには、CLI コマンドに --no-pretty-print 引数を追加します。 その後、スクリプトで結果を解析し、必要なカスタム ロジックを実行できます。

デプロイ モードとリソースの削除

テンプレートをデプロイするときにリソースの削除を確認することが必要になる場合があります。 その目的のために、What-If 操作では、使用するデプロイ モードが考慮されます。 "完全" デプロイ モードを使用する場合、Resource Manager により、デプロイで定義されていないために削除されるリソースが報告されます。

既存のリソースを更新し、完全モードでデプロイされるテンプレートの例を見てみることにしましょう。

Diagram showing change types for three resources, some of which already exist.

以下に示すのは、この例で何が起きているのかの説明です。

  • テンプレートにより、既にデプロイされている storage-1 という名前のストレージ アカウントが更新されます。 SKU は LRS から GRS に、owner タグの値は Team A に変更されようとしています。What-If の出力では、このリソースの Modify 変更タイプが表示されています。
  • テンプレートにより、cosmos-db-1という名前の新しい Azure Cosmos DB アカウントが作成されます。これはまだリソース グループに存在していません。 What-If の出力では、このリソースの変更の種類として Create が表示されます。
  • テンプレートには、リソース グループに既に存在する Azure SQL 論理サーバーは含まれていません。 デプロイでは完全モードが使用されるため、What-If の出力では、このリソースの変更の種類として Delete が表示されます。 デプロイで完全モードではなく増分モードが使用された場合、変更の種類は、Ignore になります。

デプロイを確認する

テンプレートをデプロイする前に変更をプレビューするには、デプロイ コマンドで -Confirm パラメーターを使用します。 変更内容が想定どおりだった場合は、デプロイの完了に同意します。

ヒント

特に完全モードでデプロイする場合は、-Confirm スイッチを使用してデプロイ コマンドを実行することをお勧めします。 -Confirm スイッチを使用すると、提案された変更内容が好ましくない場合に、操作を中止することができます。

テンプレートをデプロイする前に変更をプレビューするには、デプロイ コマンドで --confirm-with-what-if 引数を使用します。 変更内容が想定どおりだった場合は、デプロイの完了に同意します。

ヒント

特に完全モードでデプロイする場合は、--confirm-with-what-if 引数を使用してデプロイ コマンドを実行することをお勧めします。 --confirm-with-what-if スイッチを使用すると、提案された変更内容が好ましくない場合に、操作を中止することができます。