デプロイ スタック

Azure デプロイ スタックは、Azure リソースのグループを 1 つのまとまりのある単位として管理できるリソースです。 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 バージョン 12.0.0 以降または Azure CLI バージョン 2.61.0 以降が必要です。

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

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

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

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

既知の制限事項

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

既知の問題

  • 現在、リソース グループを削除すると、拒否の割り当てがバイパスされます。 リソース グループのスコープ内にデプロイ スタックを作成する場合、Bicep ファイルにはリソース グループの定義が含まれません。 拒否の割り当ての設定にもかかわらず、リソース グループとそれに含まれているスタックは削除できます。 ただし、グループ内の任意のリソース上でロックがアクティブになっている場合、削除操作は失敗します。
  • What-If のサポートは、まだ使用できません。
  • 管理グループに範囲が設定されたスタックでは、別の管理グループにデプロイてできません。 スタック自体の管理グループか子サブスクリプションにのみデプロイできます。
  • PowerShell コマンド help を使うと、ActionOnUnmanage スイッチの DeleteResourcesAndResourcesGroups 値が一覧表示されます。 この値を使うと、コマンドは管理対象リソースとリソース グループをデタッチします。 この値は、次の更新プログラムで削除されます。 この値は使用しないでください。
  • 場合によっては、Azure PowerShell の New コマンドレットと Set コマンドレットからは、対処方法がはっきりしない汎用的なテンプレート検証エラーが返されることがあります。 このバグは次のリリースで修正されますが、現時点では、エラーが不明な場合、デバッグ モードでコマンドレットを実行し、より詳細なエラーを未加工の応答で確認できます。
  • デプロイ スタックは、Microsoft Graph プロバイダーではサポートされていません。

組み込みのロール

警告

RBAC のアクセス許可 Microsoft.Resources/deploymentStacks/manageDenySetting/action の適用は、政府機関向けクラウドも含めて、リージョン間にロールアウトされています。

デプロイ スタック用に 2 つの組み込みロールがあります。

  • Azure デプロイ スタック共同作成者: ユーザーはデプロイ スタックを管理できますが、デプロイ スタック内で拒否の割り当てを作成または削除することはできません。
  • Azure デプロイ スタック所有者: ユーザーは、拒否の割り当てを持つものも含めて、デプロイ スタックを管理できます。

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

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

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

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

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

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

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

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

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

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

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

New-AzManagementGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DeploymentSubscriptionId "<subscription-id>" `
  -ActionOnUnmanage "detachAll" `
  -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>" `
  -ActionOnUnmanage "detachAll" `
  -DenySettingsMode "none"

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

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

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

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

Set-AzManagementGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DeploymentSubscriptionId "<subscription-id>" `
  -ActionOnUnmanage "detachAll" `
  -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 に指示するには、次のスイッチを指定したスタック作成コマンドでスタックを更新します。 詳細については、「デプロイ スタックを作成する」を参照してください。

ActionOnUnmanage スイッチを使用して、スタックの更新または削除後に管理されなくなったリソースに対する動作を定義します。 使用できる値は、以下のとおりです。

  • deleteAll: 管理対象リソースとリソース グループに対して、デタッチではなく、削除を使用します。
  • deleteResources: 管理対象リソースのみに対して、デタッチではなく、削除を使用します。
  • detachAll: 管理対象リソースとリソース グループをデタッチします。

次に例を示します。

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

警告

action-on-unmanage スイッチを DeleteAll に設定してリソース グループを削除すると、管理対象リソース グループとその中に含まれるすべてのリソースも削除されます。

stack-out-of-sync エラーを処理する

デプロイ スタックを更新または削除するときに、スタック リソースのリストが正しく同期されていないことを示す、次の stack-out-of-sync エラーが発生する可能性があります。

The deployment stack '{0}' may not have an accurate list of managed resources. To ensure no resources are accidentally deleted, please check that the managed resource list does not have any additional values. If there is any uncertainty, we recommend redeploying the stack with the same template and parameters as the current iteration. To bypass this warning, please specify the 'BypassStackOutOfSyncError' flag.

Azure portal からリソースのリストを取得するか、同じパラメーターを使用して現在デプロイされている Bicep ファイルを再デプロイできます。 出力には、管理対象リソースが表示されます

...
Resources: /subscriptions/9e8db52a-71bc-4871-9007-1117bf304622/resourceGroups/demoRg/providers/Microsoft.Network/virtualNetworks/vnetthmimleef5fwk
           /subscriptions/9e8db52a-71bc-4871-9007-1117bf304622/resourceGroups/demoRg/providers/Microsoft.Storage/storageAccounts/storethmimleef5fwk

スタック内のリソースのリストをレビューして確認したら、Azure PowerShell の BypassStackOutOfSyncError スイッチ (または Azure CLI の bypass-stack-out-of-sync-error) を使用してコマンドを再実行できます。 このスイッチは、コマンドを再実行する前に、スタック内のリソースのリストを十分に確認した後にのみ使用する必要があります。 このスイッチは、既定では使用しないでください。

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

ActionOnUnmanage スイッチは、管理されなくなったリソースに対するアクションを定義します。 スイッチの値は次のとおりです。

  • DeleteAll: リソースとリソース グループの両方を削除します。
  • DeleteResources: リソースのみを削除します。
  • DetachAll: リソースをデタッチします。

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

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

Remove-AzResourceGroupDeploymentStack `
  -name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  -ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"

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

Remove-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"

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

Remove-AzManagementGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ManagementGroupId "<management-group-id>" `
  -ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"

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

デプロイ スタック サービスには、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 コマンドを再実行します。 詳細については、「デプロイ スタックを更新する」参照してください。

管理対象リソースを保護する

デプロイ スタックの管理対象リソースに特定のアクセス許可を割り当てて、承認されていないセキュリティ プリンシパルが管理対象リソースを削除または更新することを防止できます。 これらのアクセス許可は拒否設定と呼ばれます。 スタックを親スコープに格納する場合について考えます。 たとえば、サブスクリプション内のリソースを保護するには、スタックを親スコープ (直接の親管理グループ) に配置する必要があります。

拒否設定は、コントロール プレーン操作にのみ適用され、データ プレーン操作には適用されません。 たとえば、ストレージ アカウントとキー コンテナーはコントロール プレーンを介して作成されるため、デプロイ スタックで管理することができます。 しかし、データ プレーンを介して作成されるシークレットや BLOB コンテナーなどの子リソースは、デプロイ スタックでは管理できません。

拒否設定は、明示的に作成されたリソースにのみ適用され、暗黙的に作成されたリソースには適用されません。 たとえば、マネージド AKS クラスターは、仮想マシンなど、クラスター自身をサポートするための他の複数のサービスを作成します。 この場合、仮想マシンは Bicep ファイルで定義されておらず、暗黙的に作成されたリソースであるため、デプロイ スタックの拒否設定の対象にはなりません。

Note

最新のリリースでは、次のことを行うにはスタック スコープでの特定のアクセス許可が必要です。

  • デプロイ スタックを作成または更新し、拒否設定を None 以外の値に設定します。
  • 既存の拒否設定が None 以外の値に設定されているデプロイ スタックを更新または削除します。

デプロイ スタックの組み込みロールを使用してアクセス許可を付与します。

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

  • DenySettingsMode: 未承認のセキュリティ プリンシパルによる削除または更新の試行から保護するために、管理対象リソースで禁止される操作を定義します。 この制限は、明示的にアクセスが許可されていない限り、すべてのユーザーに適用されます。 値には、NoneDenyDeleteDenyWriteAndDelete が含まれます。
  • DenySettingsApplyToChildScopes: 指定すると、拒否設定モードの構成が管理対象リソースの子スコープにも適用されます。 たとえば、Bicep ファイルは、Microsoft.Sql/servers リソース (親) と Microsoft.Sql/servers/databases リソース (子) を定義します。 DenySettingsApplyToChildScopes 設定が有効で、DenySettingsModeDenyWriteAndDelete に設定された Bicep ファイルを使用してデプロイ スタックを作成した場合、 Microsoft.Sql/servers リソースまたは Microsoft.Sql/servers/databases リソースに子リソースを追加することはできません。
  • DenySettingsExcludedAction: 拒否設定から除外されるロールベースの管理操作の一覧です。 最大 200 個のアクションが許可されます。
  • DenySettingsExcludedPrincipal: ロックから除外された Microsoft Entra プリンシパル ID の一覧。 最大 5 つのプリンシパルが許可されます。

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

New-AzResourceGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  -TemplateFile "<bicep-file-name>" `
  -ActionOnUnmanage "detachAll" `
  -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>" `
  -ActionOnUnmanage "detachAll" `
  -DenySettingsMode "denyDelete" `
  -DenySettingsExcludedAction "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
  -DenySettingsExcludedPrincipal "<object-id>,<object-id>"

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

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

New-AzManagementGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -ActionOnUnmanage "detachAll" `
  -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-AzManagementGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ManagementGroupId "<management-group-id>"

次のステップ

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