次の方法で共有


Bicep で Azure デプロイ スタックを作成してデプロイする

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

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

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

デプロイを計画し、同じスタックに含めるリソース グループを決定するときは、作成、更新、削除を含む、それらのリソースの管理ライフサイクルを検討してください。 たとえば、さまざまなリソース グループ スコープにわたって、さまざまなアプリケーション チーム用にいくつかのテスト仮想マシンをプロビジョニングする必要がある場合があります。 デプロイ スタックを使用して、これらのテスト環境を作成し、以降のデプロイ スタックの更新を通じてテスト仮想マシンの構成を更新できます。 プロジェクトを完了した後、テスト仮想マシンなど、作成したリソースを削除または削除することが必要になる場合があります。 デプロイ スタックを使用し、適切な削除フラグを指定してマネージド リソースを削除します。 この合理化されたアプローチでは、さまざまなリソース グループ スコープにわたって各テスト仮想マシンを個別に変更または削除するのではなく、スタック リソースを 1 回更新する必要があるため、環境のクリーンアップ中の時間を節約できます。

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

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

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

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

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

既知の制限事項

  • 1 つのスコープ内に作成できるデプロイ スタックは 800 個に制限されています。
  • 任意のスコープに最大 2,000 個の拒否割り当てを存在させることができます。
  • デプロイ スタックでは、暗黙的に作成されたリソースは管理されません。 そのため、これらのリソースに拒否割り当ての使用やクリーンアップを行うことはできません。
  • 拒否の割り当てでは、タグはサポートされていません。
  • 拒否の割り当ては、管理グループのスコープではサポートされていません。 ただし、デプロイがサブスクリプションのスコープで指し示されている場合は、管理グループ スタックでサポートされます。
  • デプロイ スタックでは、キー コンテナー シークレットを削除できません。 テンプレートからキー コンテナー シークレットを削除する場合、デタッチ モードでデプロイ スタックの更新/削除コマンドも必ず実行してください。

既知の問題

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

組み込みのロール

警告

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

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

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

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

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

  • リソース グループ スコープのスタックは、デプロイ スタックが存在するのと同じリソース グループにテンプレートをデプロイできます。
  • サブスクリプション スコープのスタックは、リソース グループまたはデプロイ スタックが存在するのと同じサブスクリプションにテンプレートをデプロイできます。
  • 管理グループ スコープのスタックは、テンプレートをサブスクリプションにデプロイできます。

デプロイ スタックが存在する場所は、拒否設定機能を使用して作成された拒否の割り当てであることに注意することが重要です。 たとえば、テンプレートをリソース グループ スコープにデプロイするサブスクリプション スコープでデプロイ スタックを作成し、拒否設定モード 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 ファイルを変更する必要があります。 変更を行った後は、更新コマンドを実行するか、create コマンドを再実行して、デプロイ スタックを更新できます。

コードとしてのインフラストラクチャの設計パターンでは、マネージド リソースの一覧を完全に制御できます。

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 に指示するには、create stack コマンドを使用してスタックを更新し、 ActionOnUnmanage スイッチを含めます。 詳細については、「デプロイ スタックを作成する」を参照してください。

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 エラーが発生する可能性があります。

The deployment stack '{0}' might not have an accurate list of managed resources. To prevent resources from being accidentally deleted, check that the managed resource list doesn't have any additional values. If there is any uncertainty, it's recommended to redeploy the stack with the same template and parameters as the current iteration. To bypass this warning, specify the 'BypassStackOutOfSyncError' flag.

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

...
Resources: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/demoRg/providers/Microsoft.Network/virtualNetworks/vnetthmimleef5fwk
           /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/demoRg/providers/Microsoft.Storage/storageAccounts/storethmimleef5fwk

スタック内のリソースの一覧を確認して確認したら、Azure PowerShell (または Azure CLI でBypassStackOutOfSyncError) の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 ファイルで定義されておらず、暗黙的に作成されたリソースであるため、デプロイ スタックの拒否設定の対象になりません。

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

  • デプロイ スタックを作成または更新し、拒否設定を 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>"

次のステップ

Bicep のデプロイに関するクイックスタートについては、「クイックスタート: Bicep を使用してデプロイスタックを作成してデプロイする」を参照してください。