Pilhas de implantação

Uma pilha de implantação do Azure é um recurso que permite gerenciar um grupo de recursos do Azure como uma unidade única e coesa. Quando você envia um arquivo Bicep ou um modelo JSON ARM para uma pilha de implantação, ele define os recursos que a pilha gerencia. Se um recurso incluído anteriormente no modelo for removido, ele será desanexado ou excluído com base no comportamento actionOnUnmanage especificado da pilha de implantação. O acesso à pilha de implantação pode ser restrito usando o controle de acesso baseado em função do Azure (Azure RBAC), semelhante a outros recursos do Azure.

Para criar e atualizar uma pilha de implantação, você pode utilizar a CLI do Azure, o Azure PowerShell ou o portal do Azure junto com arquivos Bicep. Esses arquivos Bicep são transempilhados em modelos JSON ARM, que são então implantados como um objeto de implantação pela pilha. A pilha de implantação oferece recursos adicionais além dos recursos de implantação familiares, servindo como um superconjunto desses recursos.

Microsoft.Resources/deploymentStacks é o tipo de recurso para pilhas de implantação. Ele consiste em um modelo principal que pode executar atualizações de 1 para muitos em todos os escopos para os recursos que descreve e bloquear quaisquer alterações indesejadas nesses recursos.

Ao planejar sua implantação e determinar quais grupos de recursos devem fazer parte da mesma pilha, é importante considerar o ciclo de vida de gerenciamento desses recursos, que inclui criação, atualização e exclusão. Por exemplo, suponha que você precise provisionar algumas máquinas virtuais (VM) de teste para várias equipes de aplicativos em diferentes escopos de grupo de recursos. Nesse caso, uma pilha de implantação pode ser utilizada para criar esses ambientes de teste e atualizar as configurações de VM de teste por meio de atualizações subsequentes para a pilha de implantação. Depois de concluir o projeto, pode ser necessário remover ou excluir quaisquer recursos que foram criados, como as VMs de teste. Utilizando uma pilha de implantação, os recursos gerenciados podem ser facilmente removidos especificando o sinalizador de exclusão apropriado. Essa abordagem simplificada economiza tempo durante a limpeza do ambiente, pois envolve uma única atualização para o recurso de pilha, em vez de modificar ou remover individualmente cada VM de teste em vários escopos de grupo de recursos.

As pilhas de implantação exigem o Azure PowerShell versão 12.0.0 ou posterior ou a CLI do Azure versão 2.61.0 ou posterior.

Para criar sua primeira pilha de implantação, trabalhe com Guia de início rápido: criar pilha de implantação.

Por que usar pilhas de implantação?

As pilhas de implantação oferecem os seguintes benefícios:

  • Provisionamento e gerenciamento simplificados de recursos em diferentes escopos como uma entidade unificada.
  • Prevenção de modificações indesejadas nos recursos gerenciados por meio de configurações de negação.
  • Limpeza eficiente do ambiente usando sinalizadores de exclusão durante as atualizações da pilha de implantação.
  • Uso de modelos padrão, como Bicep, modelos ARM ou especificações de modelo para suas pilhas de implantação.

Limitações conhecidas

  • Os recursos criados implicitamente não são gerenciados pela pilha de implantação. Portanto, nenhuma negação ou limpeza é possível.
  • As atribuições de negação não suportam tags.
  • As atribuições de negação não são suportadas no escopo do grupo de gerenciamento. No entanto, eles são suportados em uma pilha de grupo de gerenciamento se a implantação for apontada para o escopo da assinatura.
  • As pilhas de implantação não podem excluir segredos do cofre de chaves. Se você estiver removendo segredos do cofre de chaves de um modelo, certifique-se de executar também o comando update/delete da pilha de implantação com o modo de desanexação.

Problemas conhecidos

  • Atualmente, a exclusão de grupos de recursos ignora as atribuições de negação. Ao criar uma pilha de implantação no escopo do grupo de recursos, o arquivo Bicep não contém a definição para o grupo de recursos. Apesar da configuração negar-atribuição, é possível excluir o grupo de recursos e sua pilha contida. No entanto, se um bloqueio estiver ativo em qualquer recurso dentro do grupo, a operação de exclusão falhará.
  • O suporte para hipóteses ainda não está disponível.
  • Uma pilha com escopo de grupo de gerenciamento é impedida de implantar em outro grupo de gerenciamento. Ele só pode ser implantado no grupo de gerenciamento da própria pilha ou em uma assinatura filho.
  • A ajuda do comando PowerShell lista um DeleteResourcesAndResourcesGroups valor para o ActionOnUnmanage switch. Quando esse valor é usado, o comando desanexa os recursos gerenciados e os grupos de recursos. Este valor será removido na próxima atualização. Não use esse valor.
  • Em alguns casos, os cmdlets New e set do Azure PowerShell podem retornar um erro genérico de validação de modelo que não é claramente acionável. Esse bug será corrigido na próxima versão, mas, por enquanto, se o erro não estiver claro, você pode executar o cmdlet no modo de depuração para ver um erro mais detalhado na resposta bruta.
  • As pilhas de implantação não são suportadas pelo provedor do Microsoft Graph.

Funções incorporadas

Aviso

Aplicação da permissão RBAC Microsoft.Resources/deploymentStacks/manageDenySetting/action está sendo implementada em todas as regiões, incluindo Nuvens Governamentais.

Há duas funções internas para a pilha de implantação:

  • Colaborador da Pilha de Implantação do Azure: permite que os usuários gerenciem pilhas de implantação, mas não podem criar ou excluir atribuições de negação dentro das pilhas de implantação.
  • Proprietário da Pilha de Implantação do Azure: Permite que os usuários gerenciem pilhas de implantação, incluindo aquelas com atribuições de negação.

Criar pilhas de implantação

Um recurso de pilha de implantação pode ser criado no escopo do grupo de recursos, da assinatura ou do grupo de gerenciamento. O modelo passado para uma pilha de implantação define os recursos a serem criados ou atualizados no escopo de destino especificado para a implantação do modelo.

  • Uma pilha no escopo do grupo de recursos pode implantar o modelo passado para o mesmo escopo do grupo de recursos onde a pilha de implantação existe.
  • Uma pilha no escopo de assinatura pode implantar o modelo passado para um escopo de grupo de recursos (se especificado) ou o mesmo escopo de assinatura onde a pilha de implantação existe.
  • Uma pilha no escopo do grupo de gerenciamento pode implantar o modelo passado para o escopo de assinatura especificado.

É importante observar que, onde existe uma pilha de implantação, o mesmo acontece com a atribuição de negação criada com o recurso de configurações de negação. Por exemplo, criando uma pilha de implantação no escopo da assinatura que implanta o modelo no escopo do grupo de recursos e com o modo DenyDeletede configurações de negação, você pode facilmente provisionar recursos gerenciados para o grupo de recursos especificado e bloquear tentativas de exclusão para esses recursos. Usando essa abordagem, você também aumenta a segurança da pilha de implantação separando-a no nível de assinatura, em oposição ao nível do grupo de recursos. Essa separação garante que as equipes de desenvolvedores que trabalham com os recursos provisionados tenham apenas visibilidade e acesso de gravação aos grupos de recursos, enquanto a pilha de implantação permanece isolada em um nível mais alto. Isso minimiza o número de usuários que podem editar uma pilha de implantação e fazer alterações em sua atribuição de negação. Para obter mais informações, consulte Proteger o recurso gerenciado contra exclusão.

Os comandos create-stack também podem ser usados para atualizar pilhas de implantação.

Para criar uma pilha de implantação no escopo do grupo de recursos:

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

Para criar uma pilha de implantação no escopo da assinatura:

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

O DeploymentResourceGroupName parâmetro especifica o grupo de recursos usado para armazenar os recursos gerenciados. Se o parâmetro não for especificado, os recursos gerenciados serão armazenados no escopo da assinatura.

Para criar uma pilha de implantação no escopo do grupo de gerenciamento:

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

O deploymentSubscriptionId parâmetro especifica a assinatura usada para armazenar os recursos gerenciados. Se o parâmetro não for especificado, os recursos gerenciados serão armazenados no escopo do grupo de gerenciamento.

Listar pilhas de implantação

Para listar recursos da pilha de implantação no escopo do grupo de recursos:

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

Para listar recursos da pilha de implantação no escopo da assinatura:

Get-AzSubscriptionDeploymentStack

Para listar recursos da pilha de implantação no escopo do grupo de gerenciamento:

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

Atualizar pilhas de implantação

Para atualizar uma pilha de implantação, que pode envolver a adição ou exclusão de um recurso gerenciado, você precisa fazer alterações nos arquivos Bicep subjacentes. Depois que as modificações forem feitas, você terá duas opções para atualizar a pilha de implantação: executar o comando update ou executar novamente o comando create.

A lista de recursos gerenciados pode ser totalmente controlada através do padrão de projeto de infraestrutura como código (IaC).

Usar o comando Definir

Para atualizar uma pilha de implantação no escopo do grupo de recursos:

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

Para atualizar uma pilha de implantação no escopo da assinatura:

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

O DeploymentResourceGroupName parâmetro especifica o grupo de recursos usado para armazenar os recursos da pilha de implantação. Se você não especificar um nome de grupo de recursos, o serviço de pilha de implantação criará um novo grupo de recursos para você.

Para atualizar uma pilha de implantação no escopo do grupo de gerenciamento:

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

Use o comando Novo

Você recebe um aviso semelhante ao seguinte:

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)

Para obter mais informações, consulte Criar pilhas de implantação.

Controle o descolamento e a exclusão

Um recurso desanexado (ou recurso não gerenciado) refere-se a um recurso que não é rastreado ou gerenciado pela pilha de implantação, mas ainda existe no Azure.

Para instruir o Azure a excluir recursos não gerenciados, atualize a pilha com o comando create stack com a opção a seguir. Para obter mais informações, consulte Criar pilha de implantação.

Use a ActionOnUnmanage opção para definir o que acontece com os recursos que não são mais gerenciados depois que uma pilha é atualizada ou excluída. Os valores permitidos são:

  • deleteAll: use excluir em vez de desanexar para recursos gerenciados e grupos de recursos.
  • deleteResources: use excluir em vez de desanexar apenas para recursos gerenciados.
  • detachAll: Desanexe os recursos gerenciados e os grupos de recursos.

Por exemplo:

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

Aviso

Ao excluir grupos de recursos com a opção action-on-unmanage definida como DeleteAll, os grupos de recursos gerenciados e todos os recursos contidos neles também serão excluídos.

Manipular o erro de pilha fora de sincronia

Ao atualizar ou excluir uma pilha de implantação, você pode encontrar o seguinte erro de pilha fora de sincronização, indicando que a lista de recursos de pilha não está sincronizada corretamente.

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.

Você pode obter uma lista dos recursos do portal do Azure ou reimplantar o arquivo Bicep implantado atualmente com os mesmos parâmetros. A saída mostra os recursos gerenciados

...
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

Depois de revisar e verificar a lista de recursos na pilha, você pode executar novamente o comando com a BypassStackOutOfSyncError opção no Azure PowerShell (ou bypass-stack-out-of-sync-error na CLI do Azure). Essa opção só deve ser usada depois de revisar completamente a lista de recursos na pilha antes de executar novamente o comando. Essa opção nunca deve ser usada por padrão.

Excluir pilhas de implantação

A ActionOnUnmanage opção define a ação para os recursos que não são mais gerenciados. O switch tem os seguintes valores:

  • DeleteAll: Exclua os recursos e os grupos de recursos.
  • DeleteResources: Exclua apenas os recursos.
  • DetachAll: Desanexe os recursos.

Mesmo que você especifique a opção excluir tudo, os recursos não gerenciados dentro do grupo de recursos onde a pilha de implantação está localizada impedem que os recursos não gerenciados e o próprio grupo de recursos sejam excluídos.

Para excluir recursos da pilha de implantação no escopo do grupo de recursos:

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

Para excluir recursos da pilha de implantação no escopo da assinatura:

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

Para excluir recursos da pilha de implantação no escopo do grupo de gerenciamento:

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

Exibir recursos gerenciados na pilha de implantação

O serviço de pilha de implantação ainda não tem uma interface gráfica do usuário (GUI) do portal do Azure. Para exibir os recursos gerenciados dentro de uma pilha de implantação, use os seguintes comandos do Azure Powershell/CLI do Azure:

Para exibir recursos gerenciados no escopo do grupo de recursos:

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

Para exibir recursos gerenciados no escopo da assinatura:

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

Para exibir recursos gerenciados no escopo do grupo de gerenciamento:

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

Adicionar recursos à pilha de implantação

Para adicionar um recurso gerenciado, adicione a definição de recurso aos arquivos Bicep subjacentes e execute o comando update ou execute novamente o comando create. Para obter mais informações, consulte Atualizar pilhas de implantação.

Excluir recursos gerenciados da pilha de implantação

Para excluir um recurso gerenciado, remova a definição de recurso dos arquivos Bicep subjacentes e execute o comando update ou execute novamente o comando create. Para obter mais informações, consulte Atualizar pilhas de implantação.

Proteja os recursos gerenciados

Você pode atribuir permissões específicas aos recursos gerenciados de uma pilha de implantação para impedir que entidades de segurança não autorizadas as excluam ou atualizem. Essas permissões são chamadas de configurações de negação. Você deseja armazenar pilhas no escopo pai. Por exemplo, para proteger recursos em uma assinatura, você deve colocar a pilha no escopo pai, que é o grupo de gerenciamento pai imediato.

A configuração de negação só se aplica às operações do plano de controle, não às operações do plano de dados. Por exemplo, contas de armazenamento e cofres de chaves são criados por meio do plano de controle, permitindo que sejam gerenciados por uma pilha de implantação. No entanto, recursos filho como segredos ou contêineres de blob, que são criados através do plano de dados, não podem ser gerenciados por uma pilha de implantação.

A configuração de negação só se aplica a recursos criados explicitamente, não aos criados implicitamente. Por exemplo, um cluster AKS gerenciado cria vários outros serviços para suportá-lo, como uma máquina virtual. Nesse caso, como a máquina virtual não está definida no arquivo Bicep e é um recurso criado implicitamente, ela não está sujeita às configurações de negação da pilha de implantação.

Nota

A versão mais recente requer permissões específicas no escopo da pilha para:

  • Crie ou atualize uma pilha de implantação e configure a configuração de negação para um valor diferente de None.
  • Atualize ou exclua uma pilha de implantação com uma configuração de negação existente de um valor diferente de None.

Use as funções internas da pilha de implantação para conceder permissões.

O Azure PowerShell inclui estes parâmetros para personalizar a atribuição de negação:

  • DenySettingsMode: Define as operações que são proibidas nos recursos gerenciados para proteção contra entidades de segurança não autorizadas que tentam excluí-las ou atualizá-las. Esta restrição aplica-se a todos, a menos que o acesso seja explicitamente concedido. Os valores incluem: None, DenyDeletee DenyWriteAndDelete.
  • DenySettingsApplyToChildScopes: Quando especificado, a configuração do modo de configuração de negação também se aplica ao escopo filho dos recursos gerenciados. Por exemplo, um arquivo Bicep define um recurso Microsoft.Sql/servers (pai) e um recurso Microsoft.Sql/servers/databases (filho). Se uma pilha de implantação for criada usando o arquivo Bicep com a configuração habilitada DenySettingsApplyToChildScopes e a DenySettingsMode definida como DenyWriteAndDelete, você não poderá adicionar recursos filho adicionais ao recurso Microsoft.Sql/servers ou ao recurso Microsoft.Sql/servers/databases .
  • DenySettingsExcludedAction: Lista de operações de gerenciamento baseadas em função que são excluídas das configurações de negação. São permitidas até 200 ações.
  • DenySettingsExcludedPrincipal: Lista de IDs principais do Microsoft Entra excluídas do bloqueio. São permitidos até cinco diretores.

Para aplicar configurações de negação no escopo do grupo de recursos:

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>"

Para aplicar configurações de negação no escopo da assinatura:

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>"

Use o DeploymentResourceGroupName parâmetro para especificar o nome do grupo de recursos no qual a pilha de implantação é criada. Se um escopo não for especificado, ele usará o escopo da pilha de implantação.

Para aplicar configurações de negação no escopo do grupo de gerenciamento:

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>"

Use o DeploymentSubscriptionId parâmetro para especificar a ID da assinatura na qual a pilha de implantação é criada. Se um escopo não for especificado, ele usará o escopo da pilha de implantação.

Desanexar recursos gerenciados da pilha de implantação

Por padrão, as pilhas de implantação desanexam e não excluem recursos não gerenciados quando eles não estão mais contidos no escopo de gerenciamento da pilha. Para obter mais informações, consulte Atualizar pilhas de implantação.

Exportar modelos de pilhas de implantação

Você pode exportar os recursos de uma pilha de implantação para uma saída JSON. Você pode canalizar a saída para um arquivo.

Para exportar uma pilha de implantação no escopo do grupo de recursos:

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

Para exportar uma pilha de implantação no escopo da assinatura:

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

Para exportar uma pilha de implantação no escopo do grupo de gerenciamento:

Save-AzManagementGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ManagementGroupId "<management-group-id>"

Próximos passos

Para passar por um início rápido, consulte Guia de início rápido: criar uma pilha de implantação.