Risolvere errori dovuti a modelli non validi

Questo articolo illustra come risolvere gli errori di modello non valido per i file Bicep e i modelli di Azure Resource Manager (modelli ARM). L'errore può verificarsi per diverse ragioni, come un errore di sintassi, un valore di parametro non valido o una dipendenza circolare.

Sintomo

Quando viene implementato un modello, compare un errore che indica:

Code=InvalidTemplate
Message=<varies>

Il messaggio di errore dipende dal tipo di errore.

Causa

Questo errore può essere causato da diversi tipi di errori. In genere si riferisce a errori di sintassi o strutturali nel modello.

Soluzione 1: errore di sintassi

Se viene visualizzato un messaggio di errore che indica che la convalida del modello non è riuscita, potrebbe trattarsi di un problema di sintassi nel modello.

Code=InvalidTemplate
Message=Deployment template validation failed

Dato che le espressioni dei modelli hanno molti elementi, potrebbero verificarsi errori di sintassi. Ad esempio, l'assegnazione del nome per un account di archiviazione include coppie di virgolette singole o doppie, parentesi graffe, parentesi quadre e parentesi tonde. Le espressioni contengono anche funzioni e caratteri come simboli del dollaro, virgole e punti.

name: 'storage${uniqueString(resourceGroup().id)}'

In caso di questo tipo di errore, esaminare attentamente la sintassi dell'espressione. Per identificare gli errori del modello, si possono usare Visual Studio Code con l’estensione Bicep più recente o Strumenti di Azure Resource Manager.

Soluzione 2: lunghezza di uno o più segmenti non valida

Un altro errore di modello non valido si verifica quando il formato del nome della risorsa non è corretto. Per risolvere l'errore, consultare Risolvere gli errori relativi alla mancata corrispondenza di nome e tipo.

Soluzione 3: parametro non valido

È possibile specificare i valori consentiti di un parametro in un modello. Se durante l’implementazione si specifica un valore non consentito, comparirà un messaggio di errore simile al seguente:

Code=InvalidTemplate;
Message=Deployment template validation failed: 'The provided value {parameter value}
for the template parameter {parameter name} is not valid. The parameter value is not
part of the allowed values

Controllare i valori di parametro consentiti nel modello e indicare un valore consentito durante l’implementazione. Per ulteriori informazioni, consultare i valori consentiti di Bicep o modello di ARM.

Soluzione 4: troppi gruppi di risorse di destinazione

Questo errore può essere visualizzato nelle distribuzioni precedenti perché esisteva il limite di cinque gruppi di risorse di destinazione in una singola distribuzione. Nel maggio 2020 il limite è stato aumentato a 800 gruppi di risorse. Per ulteriori informazioni, vedere come implementare più gruppi di risorse per Bicep o modelli ARM.

Soluzione 5: rilevamento di una dipendenza circolare

Questo errore viene visualizzato quando le dipendenze tra le risorse impediscono l'avvio della distribuzione. A causa di una combinazione di interdipendenze, due o più risorse attendono altre risorse che sono a propria volta in attesa. Ad esempio, resource1 dipende da resource3, resource2 dipende da resource1 e resource3 dipende da resource2. È in genere possibile risolvere questo problema rimuovendo le dipendenze non necessarie.

Bicep crea una dipendenza implicita quando una risorsa usa il nome simbolico di un'altra risorsa. Una dipendenza esplicita che usa dependsOn non è in genere necessaria. Per ulteriori informazioni, consultare dipendenze di Bicep.

Per risolvere una dipendenza circolare:

  1. Nel modello trovare la risorsa identificata nella dipendenza circolare.
  2. Per verificare da quali risorse tale risorsa dipende, esaminare la proprietà dependsOn ed eventuali usi delle funzioni reference o resourceId.
  3. Esaminare tali risorse per verificare da quali risorse dipendono. Seguire le dipendenze finché non si rileva una risorsa che dipende dalla risorsa originale.
  4. Per le risorse coinvolte nella dipendenza circolare, esaminare attentamente tutte le occorrenze della proprietà dependsOn per identificare eventuali dipendenze non necessarie. Per risolvere i problemi di implementazione, rimuovere le dipendenze circolari. Anziché eliminare il codice, è possibile usare commenti per far sì che il codice non venga eseguito durante l’implementazione successiva. Si possono usare commenti a riga singola (//) o a più righe (/* ... */) in modelli ARM o file Bicep.
  5. Ridistribuire il modello.

La rimozione di valori dalla proprietà dependsOn può causare errori durante l’Implementazione del modello. Se si riceve un errore, riaggiungere la dipendenza nel modello. Se sono stati usati commenti per bypassare il codice in un modello, i commenti possono essere rimossi per ripristinare il codice.

Se con questo approccio non si risolve la dipendenza circolare, provare a spostare parte della logica di distribuzione in risorse figlio, ad esempio estensioni o impostazioni di configurazione. Configurare tali risorse figlio in modo che vengano distribuite dopo le risorse coinvolte nella dipendenza circolare. Si supponga, ad esempio, di distribuire due macchine virtuali e che sia necessario impostare in ognuna proprietà che fanno riferimento all'altra. È possibile eseguire la distribuzione nell'ordine seguente:

  1. vm1
  2. vm2
  3. L'estensione in VM 1 dipende da VM 1 e VM 2. L'estensione imposta in VM 1 valori ottenuti da VM 2.
  4. L'estensione in VM 2 dipende da VM 1 e VM 2. L'estensione imposta in VM 2 valori ottenuti da VM 1.

Lo stesso approccio è applicabile alle app del servizio app. Provare a spostare i valori di configurazione in una risorsa figlio della risorsa app. È possibile distribuire due app Web nell'ordine seguente:

  1. App Web 1
  2. App Web 2
  3. La configurazione di webapp1 dipende da webapp1 e webapp2. Contiene impostazioni dell'app con valori di App Web 2.
  4. La configurazione di webapp2 dipende da webapp1 e webapp2. Contiene impostazioni dell'app con valori di App Web 1.

Soluzione 6: Convalidare la sintassi per modelli esportati

Dopo aver implementato le risorse in Azure, è possibile esportare il file JSON del modello di Resource Manager e modificarlo per altre implementazioni. È consigliabile convalidare la sintassi corretta del modello esportato prima di usarlo per implementare le risorse.

È possibile esportare un modello dal portale, dall’interfaccia della riga di comando di Azure o da Azure PowerShell. Che il modello sia stato esportato dalla risorsa/gruppo di risorse o dalla cronologia di implementazione, ci sono procedure consigliate da seguire.

Dopo aver esportato un modello di Resource Manager, è possibile decompilare il modello JSON in Bicep. Quindi, usare le procedure consigliate e il linter per convalidare il codice.

Per ulteriori informazioni, vedi i seguenti articoli: