Risolvere i problemi comuni relativi all'uso di Terraform in Azure

Questo articolo elenca i problemi comuni e le possibili soluzioni quando si usa Terraform in Azure.

Se si verifica un problema specifico di Terraform, usare uno dei canali di supporto della community di HashiCorp.

Canali di supporto specifici di HashiCorp Terraform

Impossibile elencare lo stato di registrazione del provider

Messaggio di errore:

Errore: Impossibile elencare lo stato di registrazione del provider. Questo errore può verificarsi a causa di credenziali non valide o perché l'entità servizio non dispone dell'autorizzazione per usare l'API Resource Manager. Errore di Azure: resources.ProvidersClient#List: Errore nella risposta alla richiesta: StatusCode=403 -- Errore originale: autorest/azure: Il servizio ha restituito un errore. Status=403 Code="AuthorizationFailed" Message="Il client '00000000-0000-0000-0000-000000000000' con ID oggetto '00000000-0000-0000-0000-000000000000' non dispone dell'autorizzazione per eseguire l'azione 'Microsoft.Resources/subscriptions/providers/read' nell'ambito '/subscriptions/00000000-0000-0000-0000-000000000000' oppure l'ambito non è valido." Se l'accesso è stato concesso di recente, aggiornare le credenziali."

Sfondo: Se si eseguono comandi Terraform dalla Cloud Shell e si definiscono determinate variabili di ambiente Terraform/Azure, è possibile che vengano visualizzati conflitti. Nella tabella seguente sono elencate le variabili di ambiente e i valori Azure che rappresentano:

Variabile di ambiente valore di Azure
ARM_SUBSCRIPTION_ID ID sottoscrizione di Azure
ARM_TENANT_ID ID del tenant dell'account Microsoft
ARM_CLIENT_ID ID app del service principal di Azure
ARM_CLIENT_SECRET Password dell'entità servizio di Azure

Causa: a partire da questo articolo, lo script Terraform eseguito in Cloud Shell sovrascrive le ARM_SUBSCRIPTION_ID variabili di ambiente e ARM_TENANT_ID usando i valori della sottoscrizione corrente Azure. Di conseguenza, se l'entità servizio a cui fanno riferimento le variabili di ambiente non dispone dei diritti per la sottoscrizione corrente Azure, le operazioni di Terraform hanno esito negativo.

Errore durante l'acquisizione del blocco di stato

Messaggio di errore:

Errore: errore durante l'acquisizione del blocco di stato; Messaggio di errore: si sono verificati 2 errori:
* il BLOB di stato è già bloccato
* i metadati blob "terraformlockid" erano vuoti
Terraform ottiene un blocco dello stato per impedire che venga scritto contemporaneamente da parte di più utenti. Risolvere il problema precedente e riprovare. Per la maggior parte dei comandi, è possibile disabilitare il blocco con il flag "-lock=false", ma questo non è consigliato.

Sfondo: Se si eseguono comandi Terraform su un file di stato terraform e questo errore è l'unico messaggio visualizzato, potrebbero essere applicate le cause seguenti. Questo errore si applica ai file di stato locali e remoti.

Causa: Esistono due possibili cause per questo errore. La prima causa è che un comando Terraform è già in esecuzione sul file di stato e ha imposto un blocco, in modo che nulla si danneggi. La seconda causa potenziale è che si è verificata un'interruzione della connessione tra il file di stato e l'interfaccia della riga di comando durante l'esecuzione dei comandi. Questa interruzione si verifica più comunemente quando si usano file di stato remoti.

Risoluzione: Assicurarsi prima di tutto di non eseguire alcun comando nel file di stato. Se si usa un file di stato locale, verificare se sono presenti terminali che eseguono comandi. In alternativa, controllare le pipeline di distribuzione per verificare se un elemento in esecuzione potrebbe usare il file di stato. Se questa condizione non risolve il problema, è possibile che la seconda causa ha attivato l'errore. Per un file di stato remoto archiviato in un contenitore di un account di Archiviazione di Azure, puoi individuare il file e usare il pulsante Interrompi concessione.

Schermata che mostra il pulsante «Interrompi lease» del contenitore di Archiviazione di Azure.

Se si usano altri back-end per archiviare il file di stato, per consigli, vedere la documentazione di HashiCorp.

Errori VPN

Per informazioni sulla risoluzione degli errori VPN, vedere l'articolo Risolvere i problemi relativi a una connessione VPN ibrida.

Terraform prevede di eliminare e ricreare un account di archiviazione

Terraform potrebbe pianificare l'eliminazione e la ricreazione di un account di archiviazione di Azure in seguito a modifiche apportate da Azure all'account di archiviazione al di fuori di Terraform. Questo comportamento può verificarsi durante una conversione di ridondanza dell'account Archiviazione di Azure supportata in cui account_replication_type supera il limite tra il set non di zona (LRS, GRS, RA-GRS) e il set di zone (ZRS, GZRS, RA-GZRS).

Prima di applicare il piano, esaminare le modifiche proposte e verificare il motivo per cui Terraform considera necessaria la sostituzione dell'account di archiviazione. La ricreazione di un account di archiviazione può causare tempi di inattività o perdita di dati dell'applicazione.

Per ridurre questo rischio:

  • Disabilita l'approvazione automatica per le distribuzioni che gestiscono gli account di archiviazione e rivedi ogni terraform plan.
  • Configurare lifecycle nel blocco prevent_destroy = true della risorsa dell'account di archiviazione.
  • Prima di avviare la conversione, aggiungere account_replication_type temporaneamente a ignore_changes.
  • Dopo la conversione, eseguire terraform apply -refresh-only per aggiornare lo stato terraform, quindi aggiornare la configurazione di Terraform in modo che corrisponda all'account di archiviazione distribuito.
  • Rimuovere ignore_changes solo dopo l'esecuzione terraform plan e confermare che non segnala modifiche impreviste.

Per indicazioni dettagliate sulla conversione, vedere Impedire la deriva di Terraform per le risorse di Azure con stato.