Condividi tramite


Stack di distribuzione

Uno stack di distribuzione di Azure è una risorsa che consente di gestire un gruppo di risorse di Azure come una singola unità coesa. Quando un file Bicep o un modello JSON ARM viene inviato a uno stack di distribuzione, definisce le risorse gestite dallo stack. Se una risorsa precedentemente inclusa nel modello viene rimossa, verrà scollegata o eliminata in base al comportamento actionOnUnmanage specificato dello stack di distribuzione. L'accesso allo stack di distribuzione può essere limitato usando il controllo degli accessi in base al ruolo di Azure (RBAC), come per altre risorse di Azure.

Per creare e aggiornare uno stack di distribuzione, puoi usare l'interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure insieme ai file Bicep. Questi file Bicep vengono transpilati in modelli JSON ARM, che vengono quindi distribuiti come oggetto di distribuzione dallo stack. Lo stack di distribuzione offre funzionalità aggiuntive oltre alle risorse di distribuzione conosciute, che fungono da superset di tali funzionalità.

Microsoft.Resources/deploymentStacks è il tipo di risorsa per gli stack di distribuzione. È costituito da un modello principale che può eseguire aggiornamenti da 1 a molti tra gli ambiti delle risorse descritte e bloccare eventuali modifiche indesiderate a tali risorse.

Quando pianifichi la tua distribuzione e determini quali gruppi di risorse devono far parte dello stesso stack, è importante considerare il ciclo di vita della gestione di tali risorse, che include la creazione, l'aggiornamento e l'eliminazione. Per esempio, supponiamo che occorra effettuare il provisioning di alcune macchine virtuali di test per vari team di applicazioni in ambiti di gruppi di risorse diversi. In questo caso, puoi usare uno stack di distribuzione per creare questi ambienti di test e aggiornare le configurazioni delle macchine virtuali di test tramite gli aggiornamenti successivi allo stack di distribuzione. Dopo aver completato il progetto, potrebbe essere necessario rimuovere o eliminare tutte le risorse create, ad esempio le macchine virtuali di test. Usando uno stack di distribuzione, le risorse gestite possono essere facilmente rimosse specificando il flag di eliminazione appropriato. Questo approccio semplificato consente di risparmiare tempo durante la pulizia dell'ambiente, perché implica un singolo aggiornamento alla risorsa stack anziché una modifica o rimozione individuale di ogni macchina virtuale di test in vari ambiti del gruppo di risorse.

Gli stack di distribuzione richiedono Azure PowerShell versione 12.0.0 o successiva o l'interfaccia della riga di comando di Azure versione 2.61.0 o successiva.

Per creare il tuo primo stack di distribuzione, usa Avvio rapido: Creare lo stack di distribuzione.

Perché usare gli stack di distribuzione?

I processi di distribuzione offrono i vantaggi seguenti:

  • Provisioning e gestione delle risorse semplificati in ambiti diversi come entità unificata.
  • Prevenzione delle modifiche indesiderate alle risorse gestite tramite nega impostazioni.
  • Pulizia efficiente dell'ambiente usando flag di eliminazione durante gli aggiornamenti dello stack di distribuzione.
  • Uso di modelli standard, ad esempio Bicep, modelli di ARM o specifiche di modello per gli stack di distribuzione.

Limitazioni note

  • Le risorse create in modo implicito non vengono gestite dallo stack di distribuzione. Pertanto, non è possibile eseguire assegnazioni di rifiuto o pulizia.
  • Le assegnazioni di rifiuto non supportano i tag.
  • Le assegnazioni di rifiuto non sono supportate nell'ambito del gruppo di gestione. Tuttavia, sono supportate in uno stack di gruppi di gestione se la distribuzione punta all'ambito della sottoscrizione.
  • Gli stack di distribuzione non possono eliminare segreti di Key Vault. Se si rimuovono segreti di Key Vault da un modello, assicurarsi di eseguire anche il comando di aggiornamento/eliminazione dello stack di distribuzione con la modalità di scollegamento.

Problemi noti

  • L’eliminazione di gruppi di risorse attualmente ignora le assegnazioni di negazione. Quando si crea uno stack di distribuzione nell'ambito del gruppo di risorse, il file Bicep non contiene la definizione per il gruppo di risorse. Nonostante l'impostazione di assegnazione di negazione, è possibile eliminare il gruppo di risorse e lo stack in esso contenuto. Tuttavia, se un blocco è attivo in qualsiasi risorsa all'interno del gruppo, l'operazione di eliminazione ha esito negativo.
  • Il supporto della simulazione non è ancora disponibile.
  • Uno stack con ambito gruppo di gestione non può essere distribuito in un altro gruppo di gestione. Può essere distribuito solo nel gruppo di gestione dello stack stesso o in una sottoscrizione figlio.
  • La guida per i comandi di PowerShell indica un valore DeleteResourcesAndResourcesGroups per l'opzione ActionOnUnmanage. Quando viene usato questo valore, il comando scollega le risorse e i gruppi di risorse gestiti. Questo valore verrà rimosso nel prossimo aggiornamento. Non usare questo valore.
  • In alcuni casi, i cmdlet New e Set di Azure PowerShell possono restituire un errore generico di convalida del modello che non è molto chiaro. Questo bug verrà corretto nella prossima versione, ma per il momento, se l'errore non è chiaro, è possibile eseguire il cmdlet in modalità di debug per visualizzare un errore più dettagliato nella risposta non elaborata.
  • Gli stack di distribuzione non sono supportati dal provider Microsoft Graph.

Ruoli predefiniti

Avviso

L'imposizione dell'autorizzazione di Controllo degli accessi in base al ruolo Microsoft.Resources/deploymentStacks/manageDenySetting/action è in fase di implementazione in più aree, inclusi i cloud per enti pubblici.

Esistono due ruoli predefiniti per lo stack di distribuzione:

  • Collaboratore dello stack di distribuzione di Azure: consente agli utenti di gestire gli stack di distribuzione, ma non di creare o eliminare assegnazioni di rifiuto all'interno degli stack di distribuzione.
  • Proprietario dello stack di distribuzione di Azure: consente agli utenti di gestire gli stack di distribuzione, inclusi quelli con assegnazioni di rifiuto.

Creare stack di distribuzione

È possibile creare una risorsa dello stack di distribuzione nell'ambito del gruppo di risorse, della sottoscrizione o del gruppo di gestione. Il modello passato in uno stack di distribuzione definisce le risorse da creare o aggiornare nell'ambito di destinazione specificato per la distribuzione del modello.

  • Uno stack nell'ambito del gruppo di risorse può distribuire il modello passato allo stesso ambito del gruppo di risorse in cui è presente lo stack di distribuzione.
  • Uno stack nell'ambito della sottoscrizione può distribuire il modello passato a un ambito del gruppo di risorse (se specificato) o allo stesso ambito della sottoscrizione in cui è presente lo stack di distribuzione.
  • Uno stack nell'ambito del gruppo di gestione può distribuire il modello passato all'ambito della sottoscrizione specificato.

È importante notare che, se esiste uno stack di distribuzione, esiste anche l'assegnazione di negazione creata con la funzionalità nega impostazioni. Ad esempio, creando uno stack di distribuzione nell'ambito della sottoscrizione che distribuisce il modello nell'ambito del gruppo di risorse e con la modalità nega impostazioni DenyDelete, puoi effettuare facilmente il provisioning delle risorse gestite al gruppo di risorse specificato e bloccare i tentativi di eliminazione a tali risorse. Usando questo approccio, migliori anche la sicurezza dello stack di distribuzione separandola a livello di sottoscrizione, anziché a livello di gruppo di risorse. Questa separazione garantisce che i team di sviluppo che lavorano con le risorse sottoposte a provisioning abbiano visibilità e accesso in scrittura solo ai gruppi di risorse, mentre lo stack di distribuzione rimane isolato a un livello superiore. Ciò riduce al minimo il numero di utenti che possono modificare uno stack di distribuzione e apportare modifiche all'assegnazione di rifiuto. Per altre informazioni, vedi Proteggere la risorsa gestita dall'eliminazione.

I comandi create-stack possono essere usati anche per aggiornare gli stack di distribuzione.

Per creare uno stack di distribuzione nell'ambito del gruppo di risorse:

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

Per creare uno stack di distribuzione nell'ambito della sottoscrizione:

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

Il parametro DeploymentResourceGroupName specifica il gruppo di risorse usato per archiviare le risorse gestite. Se il parametro non viene specificato, le risorse gestite vengono archiviate nell'ambito della sottoscrizione.

Per creare uno stack di distribuzione nell'ambito del gruppo di gestione:

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

Il parametro deploymentSubscriptionId specifica la sottoscrizione usata per archiviare le risorse gestite. Se il parametro non viene specificato, le risorse gestite vengono archiviate nell'ambito del gruppo di gestione.

Elenca stack di distribuzione

Per elencare le risorse dello stack di distribuzione nell'ambito del gruppo di risorse:

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

Per elencare le risorse dello stack di distribuzione nell'ambito della sottoscrizione:

Get-AzSubscriptionDeploymentStack

Per elencare le risorse dello stack di distribuzione nell'ambito del gruppo di gestione:

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

Aggiornare gli stack di distribuzione

Per aggiornare uno stack di distribuzione, che può comportare l'aggiunta o l'eliminazione di una risorsa gestita, devi apportare modifiche ai file Bicep sottostanti. Dopo aver apportato le modifiche, hai due opzioni per aggiornare lo stack di distribuzione: eseguire il comando update o rieseguire il comando create.

L'elenco delle risorse gestite può essere controllato completamente tramite lo schema progettuale IaC (Infrastruttura come codice).

Usare il comando Imposta

Per aggiornare uno stack di distribuzione nell'ambito del gruppo di risorse:

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

Per aggiornare uno stack di distribuzione nell'ambito della sottoscrizione:

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

Il parametro DeploymentResourceGroupName specifica il gruppo di risorse usato per archiviare le risorse dello stack di distribuzione. Se non si specifica un nome di gruppo di risorse, il servizio stack di distribuzione creerà automaticamente un nuovo gruppo di risorse.

Per aggiornare uno stack di distribuzione nell'ambito del gruppo di gestione:

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

Usa il comando Nuovo

Verrà visualizzato un avviso simile al seguente:

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)

Per ulteriori informazioni, vedi Creare stack di distribuzione.

Controllare lo scollegamento e l'eliminazione

Come risorsa scollegata (o risorsa non gestita) si intende una risorsa non rilevata o gestita dallo stack di distribuzione, ma che esiste ancora in Azure.

Per indicare ad Azure di eliminare le risorse non gestite, aggiornare lo stack con il comando create stack con l'opzione seguente. Per ulteriori informazioni, vedi Creare stack di distribuzione.

Usare l'opzione ActionOnUnmanage per definire cosa accade alle risorse non più gestite dopo l'aggiornamento o l'eliminazione di uno stack. I valori consentiti sono i seguenti:

  • deleteAll: usa delete (elimina) anziché detach (scollega) per le risorse gestite e i gruppi di risorse.
  • deleteResources: usa delete (elimina) anziché detach (scollega) per le sole risorse gestite.
  • detachAll: scollega le risorse e i gruppi di risorse gestiti.

Ad esempio:

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

Avviso

Quando si eliminano gruppi di risorse con l'opzione action-on-unmanage impostata su DeleteAll, verranno eliminati anche i gruppi di risorse gestite e tutte le risorse contenute in tali gruppi.

Gestire l'errore di stack non sincronizzato

Quando si aggiorna o si elimina uno stack di distribuzione, è possibile che venga visualizzato l'errore di stack non sincronizzato seguente, a indicare che l'elenco di risorse dello stack non è sincronizzato correttamente.

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.

È possibile ottenere un elenco delle risorse dal portale di Azure o ridistribuire il file Bicep attualmente distribuito con gli stessi parametri. L'output mostra le risorse gestite

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

Dopo aver esaminato e verificato l'elenco delle risorse nello stack, è possibile eseguire di nuovo il comando con l'opzione BypassStackOutOfSyncError in Azure PowerShell (o bypass-stack-out-of-sync-error nell'interfaccia della riga di comando di Azure). Questa opzione deve essere usata solo dopo aver esaminato attentamente l'elenco delle risorse nello stack prima di eseguire nuovamente il comando. Questa opzione non deve mai essere usata per impostazione predefinita.

Eliminare gli stack di distribuzione

L'opzione ActionOnUnmanage definisce l'azione da eseguire per le risorse che non sono più gestite. L'opzione ha i valori seguenti:

  • DeleteAll: eliminare sia le risorse che i gruppi di risorse.
  • DeleteResources: eliminare solo le risorse.
  • DetachAll: scollega le risorse.

Anche se si specifica l'opzione DeleteAll, se sono presenti risorse non gestite all'interno del gruppo di risorse in cui si trova lo stack di distribuzione, sia la risorsa non gestita che il gruppo di risorse stesso non verranno eliminati.

Per eliminare le risorse dello stack di distribuzione nell'ambito del gruppo di risorse:

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

Per eliminare le risorse dello stack di distribuzione nell'ambito della sottoscrizione:

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

Per eliminare le risorse dello stack di distribuzione nell'ambito del gruppo di gestione:

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

Visualizza le risorse gestite nello stack di distribuzione

Il servizio stack di distribuzione non ha ancora un'interfaccia utente grafica (GUI) del portale di Azure. Per visualizzare le risorse gestite all'interno di uno stack di distribuzione, usa i seguenti comandi di Azure PowerShell/interfaccia della riga di comando di Azure:

Per visualizzare le risorse gestite nell'ambito del gruppo di risorse:

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

Per visualizzare le risorse gestite nell'ambito della sottoscrizione:

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

Per visualizzare le risorse gestite nell'ambito del gruppo di gestione:

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

Aggiungi risorse allo stack di distribuzione

Per aggiungere una risorsa gestita, aggiungi la definizione di risorsa ai file Bicep sottostanti e quindi esegui di nuovo il comando update o riesegui il comando create. Per ulteriori informazioni, vedi Aggiornare stack di distribuzione.

Eliminare le risorse gestite dallo stack di distribuzione

Per eliminare una risorsa gestita, rimuovi la definizione della risorsa dai file Bicep sottostanti e quindi riesegui il comando di aggiornamento o riesegui il comando create. Per ulteriori informazioni, vedi Aggiornare stack di distribuzione.

Proteggere le risorse gestite

È possibile assegnare autorizzazioni specifiche alle risorse gestite di uno stack di distribuzione per impedire alle entità di sicurezza non autorizzate di eliminarle o aggiornarle. Queste autorizzazioni vengono definite impostazioni di rifiuto. Si vuole archiviare lo stack in un ambito padre. Ad esempio, per proteggere le risorse in una sottoscrizione, è necessario posizionare lo stack nell'ambito padre, ovvero il gruppo di gestione padre diretto.

L'impostazione di rifiuto si applica solo alle operazioni del piano di controllo, non alle operazioni del piano dati. Ad esempio, gli account di archiviazione e le istanze di Key Vault vengono creati tramite il piano di controllo e questo consente di gestirli tramite uno stack di distribuzione. Le risorse figlio create tramite il piano dati, come segreti o contenitori BLOB, non possono tuttavia essere gestite tramite uno stack di distribuzione.

L'impostazione di rifiuto si applica solo alle risorse create in modo esplicito, non a quelle create in modo implicito. Ad esempio, un cluster del servizio Azure Kubernetes gestito crea svariati altri servizi di supporto, ad esempio una macchina virtuale. In questo caso, poiché la macchina virtuale non è definita nel file Bicep ed è una risorsa creata in modo implicito, non è soggetta alle impostazioni di rifiuto dello stack di distribuzione.

Nota

La versione più recente richiede autorizzazioni specifiche nell'ambito dello stack per:

  • Creare o aggiornare uno stack di distribuzione e configurare l'impostazione di rifiuto su un valore diverso da None.
  • Aggiornare o eliminare uno stack di distribuzione con un'impostazione di rifiuto esistente con un valore diverso da None.

Usare i ruoli predefiniti dello stack di distribuzione per concedere le autorizzazioni.

Azure PowerShell include questi parametri per personalizzare l'assegnazione di rifiuto:

  • DenySettingsMode: definisce le operazioni non consentite nelle risorse gestite per proteggersi da entità di sicurezza non autorizzate che tentano di eliminarle o aggiornarle. Questa restrizione si applica a tutti, a meno che non venga concesso l'accesso esplicitamente. I valori includono: None, DenyDeletee DenyWriteAndDelete.
  • DenySettingsApplyToChildScopes: se specificato, la configurazione della modalità dell'impostazione di rifiuto si applica anche all'ambito figlio delle risorse gestite. Ad esempio, un file Bicep definisce una risorsa Microsoft.Sql/servers (padre) e una risorsa Microsoft.Sql/servers/databases (figlio). Se si crea uno stack di distribuzione usando il file Bicep con l'impostazione DenySettingsApplyToChildScopes abilitata e DenySettingsMode impostato su DenyWriteAndDelete, non è possibile aggiungere altre risorse figlio alla risorsa Microsoft.Sql/servers o alla risorsa Microsoft.Sql/servers/databases.
  • DenySettingsExcludedAction: elenco di operazioni di gestione basate sui ruoli escluse dalle impostazioni di negazione. Sono consentite fino a 200 azioni.
  • DenySettingsExcludedPrincipal: elenco degli IDs Microsoft Entra esclusi dal blocco. Sono consentite fino a cinque entità di sicurezza.

Per applicare le impostazioni di negazione nell'ambito del gruppo di risorse:

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

Per applicare le impostazioni di negazione nell'ambito della sottoscrizione:

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

Usa il parametro DeploymentResourceGroupName per specificare il nome del gruppo di risorse in cui viene creato lo stack di distribuzione. Se non viene specificato un ambito, usa l'ambito dello stack di distribuzione.

Per applicare le impostazioni di negazione nell'ambito del gruppo di gestione:

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

Usa il parametro DeploymentSubscriptionId per specificare l'ID sottoscrizione in cui viene creato lo stack di distribuzione. Se non viene specificato un ambito, usa l'ambito dello stack di distribuzione.

Scollegare le risorse gestite dallo stack di distribuzione

Per impostazione predefinita, gli stack di distribuzione si scollegano e non eliminano le risorse non gestite quando non sono più contenuti nell'ambito di gestione dello stack. Per ulteriori informazioni, vedi Aggiornare stack di distribuzione.

Esportare modelli da stack di distribuzione

Puoi esportare le risorse da uno stack di distribuzione in un output JSON. Puoi reindirizzare l'output a un file.

Per esportare uno stack di distribuzione nell'ambito del gruppo di risorse:

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

Per esportare uno stack di distribuzione nell'ambito della sottoscrizione:

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

Per esportare uno stack di distribuzione nell'ambito del gruppo di gestione:

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

Passaggi successivi

Per una guida introduttiva, vedi Avvio rapido: Creare uno stack di distribuzione.