Pilas de implementación

Una pila de implementación de Azure es un recurso que permite administrar un grupo de recursos de Azure como una sola unidad cohesiva. Cuando envía un archivo Bicep o una plantilla ARM JSON a una pila de despliegue, define los recursos que gestiona la pila. Si se elimina un recurso incluido previamente en la plantilla, se desprenderá o eliminará en función del comportamiento actionOnUnmanage especificado de la pila de despliegue. El acceso a la pila de despliegue puede restringirse mediante el control de acceso basado en roles de Azure (Azure RBAC), de forma similar a otros recursos de Azure.

Para crear y actualizar una pila de implementación, puede usar la CLI de Azure, Azure PowerShell o Azure Portal junto con los archivos de Bicep. Estos archivos de Bicep se traducen en plantillas JSON de ARM, que luego la pila implementa como un objeto de implementación. La pila de implementación ofrece funcionalidades adicionales más allá de los recursos de implementación conocidos, que sirven como un superconjunto de esas funcionalidades.

Microsoft.Resources/deploymentStacks es el tipo de recurso para las pilas de implementación. Consta de una plantilla principal que puede realizar actualizaciones de 1 a varios entre ámbitos en los recursos que describe y bloquear los cambios no deseados en esos recursos.

Al planear la implementación y determinar qué grupos de recursos deben formar parte de la misma pila, es importante tener en cuenta el ciclo de vida de administración de esos recursos, lo que incluye la creación, actualización y eliminación. Por ejemplo, supongamos que necesita aprovisionar algunas máquinas virtuales (VM) de prueba para varios equipos de aplicaciones en diferentes ámbitos de grupos de recursos. En este caso, se puede usar una pila de implementación para crear estos entornos de prueba y actualizar las configuraciones de las máquinas virtuales de prueba mediante actualizaciones posteriores de la pila de implementación. Después de completar el proyecto, puede ser necesario quitar o eliminar los recursos creados, como las máquinas virtuales de prueba. Mediante el uso de una pila de implementación, los recursos administrados se pueden quitar fácilmente especificando la marca de eliminación adecuada. Este enfoque simplificado ahorra tiempo durante la limpieza del entorno, ya que implica una única actualización del recurso de la pila en lugar de modificar o quitar individualmente cada máquina virtual de prueba en varios ámbitos de grupos de recursos.

Las pilas de implementación requieren Azure PowerShell versión 12.0.0 o posterior o la CLI de Azure versión 2.61.0 o posterior.

Para crear la primera pila de implementación, consulte Inicio rápido: creación de una pila de implementación.

¿Por qué usar pilas de implementación?

Las pilas de implementación proporcionan las siguientes ventajas:

  • Aprovisionamiento y gestión racionalizados de recursos en diferentes ámbitos como una entidad unificada.
  • Prevención de modificaciones no deseadas en los recursos gestionados mediante la configuración de denegación.
  • Limpieza eficaz del entorno mediante banderas de borrado durante las actualizaciones de la pila de despliegue.
  • Uso de plantillas estándar como Bicep, plantillas ARM o especificaciones de plantillas para sus pilas de despliegue.

Restricciones conocidas

  • La pila de implementación no administra los recursos creados implícitamente. Por lo tanto, no es posible negar asignaciones ni realizar limpiezas.
  • Las asignaciones de denegación no admiten etiquetas.
  • Las asignaciones de denegación no se admiten en el ámbito del grupo de gestión. Sin embargo, se admiten en una pila de grupos de gestión si el despliegue apunta al ámbito de la suscripción.
  • Las pilas de despliegue no pueden borrar los secretos del almacén de claves. Si va a quitar secretos del almacén de claves de una plantilla, asegúrese de ejecutar también el comando update/delete de la pila de implementación con el modo de desasociación.

Problemas conocidos

  • Actualmente, la eliminación de grupos de recursos pasa por alto las asignaciones denegadas. Al crear una pila de implementación en el ámbito del grupo de recursos, el archivo de Bicep no contiene la definición del grupo de recursos. A pesar de la configuración de denegación de asignación, es posible eliminar el grupo de recursos y su pila contenida. Sin embargo, si un bloqueo está activo en cualquier recurso del grupo, se producirá un error en la operación de eliminación.
  • La compatibilidad con what-if aún no está disponible.
  • Una pila de ámbito de grupo de administración está restringida a implementar en otro grupo de administración. Solo se puede implementar en el grupo de administración de la propia pila o en una suscripción secundaria.
  • La ayuda del comando de PowerShell muestra un valor DeleteResourcesAndResourcesGroups para el modificador ActionOnUnmanage. Cuando se usa este valor, el comando desasocia los recursos administrados y los grupos de recursos. Este valor se quitará en la siguiente actualización. No use este valor.
  • En algunos casos, los cmdlets New y Set de Azure PowerShell pueden devolver un error de validación de plantilla genérico poco claro. Este error se corregirá en la próxima versión, pero por ahora, si el error no está claro, puede ejecutar el cmdlet en modo de depuración para más detalles sobre el error en la respuesta sin procesar.
  • El proveedor de Microsoft Graph no admite las pilas de implementación.

Roles integrados

Advertencia

El cumplimiento del permiso de RBAC Microsoft.Resources/deploymentStacks/manageDenySetting/action se está implementando en regiones, incluidas las nubes gubernamentales.

Hay dos roles integrados para la pila de implementación:

  • Colaborador de la pila de implementación de Azure: permite a los usuarios administrar pilas de implementación, pero no pueden crear ni eliminar asignaciones de denegación dentro de las pilas de implementación.
  • Propietario de la pila de implementación de Azure: permite a los usuarios administrar pilas de implementación, incluidas las que tienen asignaciones de denegación.

Creación de pilas de implementación

Se puede crear un recurso de pila de implementación en el ámbito del grupo de recursos, la suscripción o el grupo de administración. La plantilla que se pasa a una pila de implementación define los recursos que se van a crear o actualizar en el ámbito de destino especificado para la implementación de la plantilla.

  • Una pila en el ámbito del grupo de recursos puede implementar la plantilla que se pasa al mismo ámbito del grupo de recursos donde existe la pila de implementación.
  • Una pila en el ámbito de la suscripción puede implementar la plantilla que se pasa a un ámbito del grupo de recursos (si se especifica) o al mismo ámbito de la suscripción donde existe la pila de implementación.
  • Una pila en el ámbito del grupo de administración puede implementar la plantilla pasada al ámbito de suscripción especificado.

Es importante tener en cuenta que donde existe una pila de implementación, también existe la asignación de denegación creada con la funcionalidad de configuración de denegación. Por ejemplo, mediante la creación de una pila de implementación en el ámbito de la suscripción que implementa la plantilla en el ámbito del grupo de recursos y con el modo DenyDelete de configuración de denegación, puede aprovisionar fácilmente recursos administrados en el grupo de recursos especificado y bloquear los intentos de eliminación de esos recursos. Al usar este método, también se mejora la seguridad de la pila de implementación separándola en el nivel de suscripción, en lugar del nivel de grupo de recursos. Esta separación garantiza que los equipos de desarrollo que trabajan con los recursos aprovisionados solo tengan acceso de visibilidad y escritura a los grupos de recursos, mientras que la pila de implementación permanece aislada en un nivel superior. Esto minimiza el número de usuarios que pueden editar una pila de implementación y realizar cambios en su asignación de denegación. Para obtener más información, consulte Protección de recursos administrados frente a la eliminación.

Los comandos create-stack también se pueden usar para actualizar las pilas de implementación.

Para crear una pila de implementación en el ámbito del grupo de recursos:

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

Para crear una pila de implementación en el ámbito de la suscripción:

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

El parámetro DeploymentResourceGroupName especifica el grupo de recursos usado para almacenar los recursos administrados. Si no se especifica el parámetro , los recursos administrados se almacenan en el ámbito de la suscripción.

Para crear una pila de implementación en el ámbito del grupo de administración:

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

El parámetro deploymentSubscriptionId especifica la suscripción usada para almacenar los recursos administrados. Si no se especifica el parámetro, los recursos administrados se almacenan en el ámbito del grupo de administración.

Enumeración de las pilas de implementación

Para enumerar los recursos de pila de implementación en el ámbito del grupo de recursos:

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

Para enumerar los recursos de la pila de implementación en el ámbito de la suscripción:

Get-AzSubscriptionDeploymentStack

Para enumerar los recursos de pila de implementación en el ámbito del grupo de administración:

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

Actualización de las pilas de implementación

Para actualizar una pila de implementación, que puede implicar agregar o eliminar un recurso administrado, debe realizar cambios en los archivos de Bicep subyacentes. Una vez realizadas las modificaciones, tiene dos opciones para actualizar la pila de implementación: ejecute el comando update o vuelva a ejecutar el comando create.

La lista de recursos administrados se puede controlar completamente mediante el modelo de diseño de infraestructura como código (IaC).

Uso del comando Set

Para actualizar una pila de implementación en el ámbito del grupo de recursos:

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

Para crear una pila de implementación en el ámbito de la suscripción:

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

El parámetro DeploymentResourceGroupName especifica el grupo de recursos usado para almacenar los recursos de la pila de implementación. Si no especifica un nombre de grupo de recursos, el servicio de la pila de implementación creará automáticamente un nuevo grupo de recursos.

Para actualizar una pila de implementación en el ámbito del grupo de administración:

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

Uso del comando New

Recibirá una advertencia similar a la siguiente:

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 obtener más información, consulte Creación de pilas de implementación.

Control de la desasociación y la eliminación

Un recurso desasociado (o un recurso no administrado) hace referencia a un recurso que la pila de implementación no administra ni realiza un seguimiento, pero que sigue existiendo en Azure.

Para indicar a Azure que elimine recursos no administrados, actualice la pila con el comando create stack con el modificador siguiente. Para obtener más información, consulte Creación de pilas de implementación.

Use el modificador ActionOnUnmanage para definir lo que sucede con los recursos que ya no se administran después de actualizar o eliminar una pila. Los valores permitidos son:

  • deleteAll: use delete en lugar de detach para los recursos administrados y los grupos de recursos.
  • deleteResources: use delete en lugar de detach para los recursos administrados solamente.
  • detachAll: desasociar los recursos administrados y los grupos de recursos.

Por ejemplo:

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

Advertencia

Al eliminar grupos de recursos con el modificador action-on-unmanage establecido en DeleteAll, también se eliminarán los grupos de recursos administrados y todos los recursos contenidos en ellos.

Control del error de pila fuera de sincronización

Al actualizar o eliminar una pila de implementación, es posible que encuentre el siguiente error de pila fuera de sincronización, lo que indica que la lista de recursos de pila no está sincronizada correctamente.

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.

Puede obtener una lista de los recursos de Azure Portal o volver a implementar el archivo bicep implementado actualmente con los mismos parámetros. La salida muestra los recursos administrados

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

Después de revisar y comprobar la lista de recursos de la pila, puede volver a ejecutar el comando con el BypassStackOutOfSyncError modificador en Azure PowerShell (o bypass-stack-out-of-sync-error en la CLI de Azure). Este modificador solo se debe usar después de revisar exhaustivamente la lista de recursos de la pila antes de volver a ejecutar el comando. Este modificador nunca debe usarse de forma predeterminada.

Eliminación de implementación

El modificador ActionOnUnmanage define la acción para los recursos que ya no se administran. El modificador tiene los siguientes valores:

  • DeleteAll: Elimina recursos y grupos de recursos.
  • DeleteResources: Elimina solo los recursos.
  • DetachAll: desasociar los recursos.

Incluso si especifica el modificador delete-all, los recursos no gestionados dentro del grupo de recursos donde se encuentra la pila de despliegue impide que se eliminen tanto los recursos no gestionados como el propio grupo de recursos.

Para eliminar los recursos de pila de implementación en el ámbito del grupo de recursos:

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

Para eliminar los recursos de la pila de implementación en el ámbito de la suscripción:

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

Para eliminar los recursos de pila de implementación en el ámbito del grupo de administración:

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

Visualización de recursos administrados en la pila de implementación

El servicio de pila de implementación aún no tiene una interfaz gráfica de usuario (GUI) de Azure Portal. Para ver los recursos administrados dentro de una pila de implementación, use los siguientes comandos de Azure Powershell o la CLI de Azure:

Para ver los recursos administrados en el ámbito del grupo de recursos:

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

Para ver los recursos administrados en el ámbito de la suscripción:

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

Para ver los recursos administrados en el ámbito del grupo de administración:

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

Adición de recursos a la pila de implementación

Para agregar un recurso administrado, agregue la definición de recurso a los archivos de Bicep subyacentes y, a continuación, ejecute el comando update o vuelva a ejecutar el comando create. Para obtener más información, consulte Actualización de las pilas de implementación.

Eliminación de recursos administrados de la pila de implementación

Para eliminar un recurso administrado, quite la definición de recurso de los archivos de Bicep subyacentes y, a continuación, ejecute el comando update o vuelva a ejecutar el comando create. Para obtener más información, consulte Actualización de las pilas de implementación.

Protección de recursos administrados

Puede asignar permisos específicos a los recursos administrados de una pila de implementación para evitar que las entidades de seguridad no autorizadas los eliminen o actualicen. Estos permisos se conocen como configuración de denegación. Quiere almacenar pilas en el ámbito primario. Por ejemplo, para proteger los recursos de una suscripción, debe colocar la pila en el ámbito primario, que es el grupo de administración primario inmediato.

La configuración de denegación solo se aplica a las operaciones del plano de control, no a las operaciones del plano de datos. Por ejemplo, las cuentas de almacenamiento y los almacenes de claves se crean a través del plano de control, lo que les permite administrarlas mediante una pila de implementación. Sin embargo, los recursos secundarios, como secretos o contenedores de blobs, que se crean a través del plano de datos, no se pueden administrar mediante una pila de implementación.

La configuración de denegación solo se aplica a los recursos creados explícitamente, no a los creados implícitamente. Por ejemplo, un clúster de AKS administrado crea otros servicios múltiples para admitirlo, como una máquina virtual. En este caso, dado que la máquina virtual no está definida en el archivo de Bicep y es un recurso creado implícitamente, no está sujeto a la configuración de denegación de la pila de implementación.

Nota:

La versión más reciente requiere permisos específicos en el ámbito de la pila para:

  • Crear o actualizar una pila de implementación y configurar la configuración de denegación en un valor distinto de None.
  • Actualizar o eliminar una pila de implementación con una configuración de denegación existente de un valor distinto de None.

Use los roles integrados de la pila de implementación para conceder permisos.

El PowerShell de Azure incluye estos parámetros para personalizar la asignación de denegaciones:

  • DenySettingsMode: define las operaciones prohibidas en los recursos administrados para proteger contra entidades de seguridad no autorizadas que intentan eliminarlos o actualizarlos. Esta restricción se aplica a todos a menos que se conceda acceso explícitamente. Estos valores incluyen: None, DenyDelete y DenyWriteAndDelete.
  • DenySettingsApplyToChildScopes: cuando se especifica, la configuración del modo de configuración de denegación también se aplica al ámbito secundario de los recursos administrados. Por ejemplo, un archivo de Bicep define un recurso Microsoft.Sql/servers (primario) y un recurso Microsoft.Sql/servers/databases (secundario). Si se crea una pila de implementación mediante el archivo de Bicep con la configuración DenySettingsApplyToChildScopes habilitada y el DenySettingsMode establecido en DenyWriteAndDelete, no se pueden agregar recursos secundarios adicionales al recurso Microsoft.Sql/servers ni al recurso Microsoft.Sql/servers/databases.
  • DenySettingsExcludedAction: lista de operaciones de administración basadas en roles que se excluyen de la configuración de denegación. Se permiten hasta 200 acciones.
  • DenySettingsExcludedPrincipal: lista de id. de entidad de seguridad de Microsoft Entra excluidos del bloqueo. Se permiten hasta cinco entidades de seguridad.

Para aplicar la configuración de denegación en el ámbito del 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 la configuración de denegación en el ámbito de la suscripción:

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 el parámetro DeploymentResourceGroupName para especificar el nombre del grupo de recursos en el que se creará la pila de implementación. Si no se especifica un ámbito, se usa el ámbito de la pila de implementación.

Para aplicar la configuración de denegación en el ámbito del grupo de administración:

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 el parámetro DeploymentSubscriptionId para especificar el id. de suscripción en el que se creará la pila de implementación. Si no se especifica un ámbito, se usa el ámbito de la pila de implementación.

Desasociación de recursos administrados de la pila de implementación

De forma predeterminada, las pilas de implementación desasocian y no eliminan los recursos no administrados cuando ya no están incluidos en el ámbito de administración de la pila. Para obtener más información, consulte Actualización de las pilas de implementación.

Exportación de plantillas desde pilas de implementación

Puede exportar los recursos de una pila de implementación a una salida JSON. Puede canalizar la salida a un archivo.

Para exportar una pila de implementación en el ámbito del grupo de recursos:

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

Para exportar una pila de implementación en el ámbito de la suscripción:

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

Para exportar una pila de implementación en el ámbito del grupo de administración:

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

Pasos siguientes

Para ver un inicio rápido, consulte Inicio rápido: Creación de una pila de implementación.