デプロイ スタック (プレビュー)

Azure デプロイ スタックは、Azure リソースのグループをアトミック単位として管理できるようにする Azure リソースの一種です。 Bicep ファイルまたは ARM JSON テンプレートがデプロイ スタックに送信されると、スタックによって管理されるリソースが定義されます。 以前にテンプレートに含まれていたリソースが削除された場合、デプロイ スタックの指定された actionOnUnmanage 動作に基づいて、そのリソースはデタッチまたは削除されます。 他の Azure リソースと同様に、Azure ロールベースのアクセス制御 (Azure RBAC) を使用して、デプロイ スタックへのアクセスを制限できます。

デプロイ スタックを作成して更新するには、Bicep ファイルと共に Azure CLI、Azure PowerShell、または Azure portal を利用できます。 これらの Bicep ファイルは ARM JSON テンプレートにトランスパイルされ、スタックによってデプロイ オブジェクトとしてデプロイされます。 デプロイ スタックには、使い慣れたデプロイ リソース以外にも、これらの機能のスーパーセットとして機能する追加の機能が用意されています。

Microsoft.Resources/deploymentStacks は、デプロイ スタックのリソースの種類です。 これはメイン テンプレートで構成されており、記述されているリソースに対してスコープ全体で 1 対多の更新を実行でき、それらのリソースに対する不要な変更をブロックできます。

デプロイを計画し、同じスタックに含めるリソース グループを決定するときは、これらのリソースの管理ライフサイクル (作成、更新、削除など) を考慮することが重要です。 たとえば、さまさまなリソース グループ スコープにわたって、さまざまなアプリケーション チーム用にいくつかのテスト VM をプロビジョニングする必要があるとします。 この場合、デプロイ スタックを利用して、これらのテスト環境を作成し、その後のデプロイ スタックの更新を通じてテスト VM 構成を更新できます。 プロジェクトを完了した後、作成されたすべてのリソース (テスト VM など) を削除する必要がある場合があります。 デプロイ スタックを利用して、適切な削除フラグを指定することで、管理対象リソースを簡単に削除できます。 この合理化されたアプローチでは、各種リソース グループ スコープでそれぞれのテスト VM を個別に変更または削除するのではなく、スタック リソースへの 1 回の更新で行われるため、環境のクリーンアップにかかる時間を節約できます。

デプロイ スタックには、Azure PowerShell バージョン 10.1.0 以降または Azure CLI バージョン 2.50.0 以降が必要です。

最初のデプロイ スタックを作成するには、クイック スタート: デプロイ スタックの作成に関するページを参照してください。

デプロイ スタックを使用する理由

デプロイ スタックには、次の利点があります。

  • まとまりのあるエンティティとして簡略化された、さまざまなスコープにわたるリソースのプロビジョニングと管理。
  • 拒否設定による管理対象リソースへの不要な変更の防止。
  • デプロイ スタックの更新時に削除フラグを使用することで行われる効率的な環境のクリーンアップ。
  • デプロイ スタックに対する Bicep、ARM テンプレート、テンプレート スペックなどの標準テンプレートの利用。

既知の制限事項

  • 暗黙的に作成されたリソースは、スタックによって管理されません。 そのため、拒否の割り当てやクリーンアップはできません。
  • 拒否の割り当てでは、タグはサポートされていません。
  • 拒否割り当ては、管理グループ スコープ内ではサポートされていません。
  • デプロイ スタックでは、キー コンテナー シークレットを削除できません。 テンプレートからキー コンテナー シークレットを削除する場合、デタッチ モードでデプロイ スタックの更新/削除コマンドも必ず実行してください。

既知の問題

  • 現在、リソース グループを削除すると、拒否の割り当てがバイパスされます。 リソース グループのスコープ内にデプロイ スタックを作成する場合、Bicep ファイルにはリソース グループの定義が含まれません。 拒否の割り当ての設定にもかかわらず、リソース グループとそれに含まれているスタックは削除できます。 ただし、グループ内の任意のリソース上でロックがアクティブになっている場合、削除操作は失敗します。
  • What-if はプレビューでは使用できません。
  • 管理グループに範囲が設定されたスタックでは、別の管理グループにデプロイてできません。 スタック自体の管理グループか子サブスクリプションにのみデプロイできます。

デプロイ スタックを作成する

デプロイ スタック リソースは、リソース グループ、サブスクリプション、または管理グループのスコープで作成できます。 デプロイ スタックに渡されるテンプレートにより、テンプレートのデプロイに指定されたターゲット スコープで作成または更新されるリソースが定義されます。

  • リソース グループ スコープのスタックは、デプロイ スタックが存在するのと同じリソース グループ スコープに、渡されたテンプレートをデプロイできます。
  • サブスクリプション スコープのスタックは、リソース グループ スコープ (指定されている場合) またはデプロイ スタックが存在するのと同じサブスクリプション スコープに、渡されたテンプレートをデプロイできます。
  • 管理グループ スコープのスタックは、指定されたサブスクリプション スコープに渡されたテンプレートをデプロイできます。

デプロイ スタックが存在する場所は、拒否設定機能を使用して作成された拒否の割り当てであることに注意することが重要です。 たとえば、テンプレートをリソース グループ スコープにデプロイするサブスクリプション スコープでデプロイ スタックを作成し、拒否設定モード DenyDelete を使用すると、指定したリソース グループに管理対象リソースを簡単にプロビジョニングでき、それらのリソースへの削除の試行をブロックできます。 この方法を使用すると、リソース グループ レベルではなくサブスクリプション レベルで分離することで、デプロイ スタックのセキュリティも強化されます。 この分離により、デプロイ スタックは高いレベルで分離されたまま、プロビジョニングされたリソースを操作する開発者チームはリソース グループへの可視性と書き込みアクセス権のみを持つことができます。 これにより、デプロイ スタックを編集し、拒否の割り当てを変更できるユーザーの数が最小限に抑えられます。 詳細については、「管理対象リソースを削除から保護する」を参照してください。

create-stack コマンドを使用して、デプロイ スタックを更新することもできます。

リソース グループ スコープでデプロイ スタックを作成するには:

New-AzResourceGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "none"

サブスクリプション スコープでデプロイ スタックを作成するには:

New-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DeploymentResourceGroupName "<resource-group-name>" `
  -DenySettingsMode "none"

DeploymentResourceGroupName パラメータは、管理対象リソースを保存するのに使用されるリソース グループを指定します。 パラメータが指定されていない場合、管理対象リソースはサブスクリプション スコープに保存されます。

管理グループ スコープでデプロイ スタックを作成するには:

New-AzManagmentGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DeploymentSubscriptionId "<subscription-id>" `
  -DenySettingsMode "none"

deploymentSubscriptionId パラメータは、管理対象リソースを保存するのに使用されるサブスクリプションを指定します。 パラメータが指定されていない場合、管理対象リソースは管理グループ スコープに保存されます。

デプロイ スタックを一覧表示する

リソース グループ スコープでデプロイ スタック リソースを一覧表示するには:

Get-AzResourceGroupDeploymentStack `
  -ResourceGroupName "<resource-group-name>"

サブスクリプション スコープでデプロイ スタック リソースを一覧表示するには:

Get-AzSubscriptionDeploymentStack

管理グループ スコープでデプロイ スタック リソースを一覧表示するには:

Get-AzManagementGroupDeploymentStack `
  -ManagementGroupId "<management-group-id>"

デプロイ スタックを更新する

デプロイ スタックを更新するには (管理対象リソースの追加または削除が含まれる場合があります)、基になる Bicep ファイルを変更する必要があります。 変更が行われたら、update コマンドを実行するか、create コマンドを再実行するというデプロイ スタックを更新するための 2 つのオプションがあります。

管理対象リソースの一覧は、コードとしてのインフラストラクチャ (IaC) 設計パターンを通じて完全に制御できます。

Set コマンドを使用する

リソース グループ スコープでデプロイ スタックを更新するには:

Set-AzResourceGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "none"

サブスクリプション スコープでデプロイ スタックを更新するには:

Set-AzSubscriptionDeploymentStack `
   -Name "<deployment-stack-name>" `
   -Location "<location>" `
   -TemplateFile "<bicep-file-name>" `
   -DeploymentResourceGroupName "<resource-group-name>" `
  -DenySettingsMode "none"

DeploymentResourceGroupName パラメータは、デプロイ スタック リソースを保存するのに使用されるリソース グループを指定します。 リソース グループ名を指定しない場合、デプロイ スタック サービスによって新しいリソース グループが作成されます。

管理グループ スコープでデプロイ スタックを更新するには:

Set-AzManagmentGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DeploymentSubscriptionId "<subscription-id>" `
  -DenySettingsMode "none"

新規作成コマンドを使用する

次のような警告が表示されます。

The deployment stack 'myStack' you're trying to create already exists in the current subscription/management group/resource group. Do you want to overwrite it? Detaching: resources, resourceGroups (Y/N)

詳細については、「デプロイ スタックを作成する」を参照してください。

デタッチと削除を制御する

デタッチされたリソース (または非管理対象リソース) とは、デプロイ スタックによって追跡または管理されていないが、Azure 内にまだ存在するリソースを指します。

非管理対象リソースを削除するように Azure に指示するには、次のいずれかの削除フラグを使用し、create stack コマンドを使用してスタックを更新します。 詳細については、「デプロイ スタックを作成する」を参照してください。

  • DeleteAll: 管理対象リソースとリソース グループに対して、デタッチではなく、削除を使用します。
  • DeleteResources: 管理対象リソースのみに対して、デタッチではなく、削除を使用します。
  • DeleteResourceGroups: 管理対象リソース グループのみに対して、デタッチではなく、削除を使用します。 DeleteResourceGroups を単独で使用することは無効です。 DeleteResourceGroups は、DeleteResources と共に使用する必要があります。

次に例を示します。

New-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "none" `
  -DeleteResourceGroups `
  -DeleteResources

警告

DeleteAll または DeleteResourceGroups プロパティのいずれかを使用してリソース グループを削除すると、管理対象リソース グループとその中に含まれるすべてのリソースも削除されます。

デプロイ スタックを削除する

削除フラグを指定せずに削除コマンドを実行すると、非管理対象リソースはデタッチされますが、削除されません。 非管理対象リソースを削除するには、次のスイッチを使用します。

  • DeleteAll: リソースとリソース グループの両方を削除します。
  • DeleteResources: リソースのみを削除します。
  • DeleteResourceGroups: リソース グループのみを削除します。

すべて削除のスイッチを指定した場合でも、デプロイ スタックが配置されているリソース グループ内に非管理対象リソースがある場合は、非管理対象リソースとリソース グループ自体の両方とも削除されません。

リソース グループ スコープでデプロイ スタック リソースを削除するには:

Remove-AzResourceGroupDeploymentStack `
  -name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  [-DeleteAll/-DeleteResourceGroups/-DeleteResources]

サブスクリプション スコープでデプロイ スタック リソースを削除するには:

Remove-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name>" `
  [-DeleteAll/-DeleteResourceGroups/-DeleteResources]

管理グループ スコープでデプロイ スタック リソースを削除するには:

Remove-AzManagementGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ManagementGroupId "<management-group-id>" `
  [-DeleteAll/-DeleteResourceGroups/-DeleteResources]

デプロイ スタックの管理対象リソースを表示する

パブリック プレビューの期間中、デプロイ スタック サービスには、まだ Azure portal グラフィカル ユーザー インターフェイス (GUI) はありません。 デプロイ スタック内の管理対象リソースを表示するには、次の Azure Powershell または Azure CLI コマンドを使用します。

リソース グループ スコープで管理対象リソースを表示するには:

(Get-AzResourceGroupDeploymentStack -Name "<deployment-stack-name>" -ResourceGroupName "<resource-group-name>").Resources

サブスクリプション スコープで管理対象リソースを表示するには:

(Get-AzSubscriptionDeploymentStack -Name "<deployment-stack-name>").Resources

管理グループ スコープで管理対象リソースを表示するには:

(Get-AzManagementGroupDeploymentStack -Name "<deployment-stack-name>" -ManagementGroupId "<management-group-id>").Resources

デプロイ スタックにリソースを追加する

管理対象リソースを追加するには、基になる Bicep ファイルにリソース定義を追加し、update コマンドを実行するか、create コマンドを再実行します。 詳細については、「デプロイ スタックを更新する」参照してください。

デプロイ スタックから管理対象リソースを削除する

管理対象リソースを削除するには、基になる Bicep ファイルからリソース定義を削除し、update コマンドを実行するか、create コマンドを再実行します。 詳細については、「デプロイ スタックを更新する」参照してください。

管理対象リソースを削除から保護する

デプロイ スタックの作成時に、管理対象リソースに特定の種類のアクセス許可を割り当てることができます。これにより、未承認のセキュリティ プリンシパルによる削除を防止できます。 これらの設定は拒否設定と呼ばれます。 スタックを親スコープに保存する場合です。

Azure PowerShell には、拒否の割り当てをカスタマイズするための、こちらのパラメーターが含まれています。

  • DenySettingsMode: 未承認のセキュリティ プリンシパルによる削除または更新の試行から保護するための、管理対象リソースで禁止されている操作を定義します。 この制限は、明示的にアクセスが許可されていない限り、すべてのユーザーに適用されます。 値には、NoneDenyDeleteDenyWriteAndDelete が含まれます。
  • DenySettingsApplyToChildScopes: 拒否設定は、管理対象リソースの入れ子になったリソースに適用されます。
  • DenySettingsExcludedAction: 拒否設定から除外されるロールベースの管理操作の一覧です。 最大 200 個のアクションが許可されます。
  • DenySettingsExcludedPrincipal: ロックから除外された Microsoft Entra プリンシパル ID の一覧。 最大 5 つのプリンシパルが許可されます。

リソース グループ スコープで拒否設定を適用するには:

New-AzResourceGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "DenyDelete" `
  -DenySettingsExcludedAction "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
  -DenySettingsExcludedPrincipal "<object-id>,<object-id>"

サブスクリプション スコープで拒否設定を適用するには:

New-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "DenyDelete" `
  -DenySettingsExcludedAction "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
  -DenySettingsExcludedPrincipal "<object-id>,<object-id>"

DeploymentResourceGroupName パラメータを使用して、デプロイ スタックを作成するリソース グループ名を指定します。 スコープが指定されていない場合は、デプロイ スタックのスコープが使用されます。

管理グループ スコープで拒否設定を適用するには:

New-AzManagmentGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "DenyDelete" `
  -DenySettingsExcludedActions "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
  -DenySettingsExcludedPrincipal "<object-id>,<object-id>"

DeploymentSubscriptionId パラメータを使用して、デプロイ スタックを作成するサブスクリプション ID を指定します。 スコープが指定されていない場合は、デプロイ スタックのスコープが使用されます。

デプロイ スタックから管理対象リソースをデタッチする

既定では、非管理対象リソースがスタックの管理スコープ内に含まれなくなった場合、それらはデプロイ スタックによりデタッチされ、削除はされません。 詳細については、「デプロイ スタックを更新する」参照してください。

デプロイ スタックからテンプレートをエクスポートする

デプロイ スタックから JSON 出力にリソースをエクスポートできます。 出力をファイルにパイプすることができます。

リソース グループ スコープでデプロイ スタックをエクスポートするには:

Save-AzResourceGroupDeploymentStack `
   -Name '<deployment-stack-name>' `
   -ResourceGroupName '<resource-group-name>' `

サブスクリプション スコープでデプロイ スタックをエクスポートするには:

Save-AzSubscriptionDeploymentStack `
  -name '<deployment-stack-name>'

管理グループ スコープでデプロイ スタックをエクスポートするには:

Save-AzManagmentGroupDeploymentStack `
  -Name '<deployment-stack-name>' `
  -ManagementGroupId '<management-group-id>'

次のステップ

クイック スタートを実行するには、クイック スタート: デプロイ スタックの作成に関する記事を参照してください。