Fouten met een ongeldige sjabloon oplossen

In dit artikel wordt beschreven hoe u ongeldige sjabloonfouten voor Bicep-bestanden en Azure Resource Manager-sjablonen (ARM-sjablonen) kunt oplossen. De fout treedt om verschillende redenen op, zoals een syntaxisfout, ongeldige parameterwaarde of kringafhankelijkheid.

Symptoom

Wanneer een sjabloon wordt geïmplementeerd, ontvangt u een foutbericht dat aangeeft:

Code=InvalidTemplate
Message=<varies>

Het foutbericht is afhankelijk van het type fout.

Oorzaak

Deze fout kan het gevolg zijn van verschillende soorten fouten. Ze hebben meestal betrekking op een syntaxis- of structurele fout in de sjabloon.

Oplossing 1: Syntaxisfout

Als u een foutbericht ontvangt dat aangeeft dat de validatie van de sjabloon is mislukt, is er mogelijk een syntaxisprobleem in de sjabloon.

Code=InvalidTemplate
Message=Deployment template validation failed

Syntaxisfouten kunnen optreden omdat sjabloonexpressies veel elementen bevatten. De naamtoewijzing voor een opslagaccount bevat bijvoorbeeld paren van enkele of dubbele aanhalingstekens, accolades, vierkante haken en haakjes. Expressies bevatten ook functies en tekens zoals dollartekens, komma's en puntjes.

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

Wanneer u dit type fout ontvangt, controleert u de syntaxis van de expressie. Als u sjabloonfouten wilt identificeren, kunt u Visual Studio Code gebruiken met de meest recente Bicep-extensie of de Azure Resource Manager Tools-extensie.

Oplossing 2: Onjuiste segmentlengten

Er treedt nog een ongeldige sjabloonfout op wanneer de resourcenaam niet de juiste indeling heeft. Zie Fouten oplossen voor niet-overeenkomende namen en typen om deze fout op te lossen.

Oplossing 3: Parameter is ongeldig

U kunt de toegestane waarden van een parameter opgeven in een sjabloon. Als u tijdens de implementatie een waarde opgeeft die geen toegestane waarde is, ontvangt u een bericht dat lijkt op de volgende fout:

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

Controleer de sjabloon voor de toegestane waarden van de parameter en gebruik een toegestane waarde tijdens de implementatie. Zie toegestane waarden voor Bicep- of ARM-sjablonen voor meer informatie.

Oplossing 4: Te veel doelresourcegroepen

Mogelijk ziet u deze fout in eerdere implementaties omdat u in één implementatie was beperkt tot vijf doelresourcegroepen. In mei 2020 is die limiet verhoogd tot 800 resourcegroepen. Zie Implementeren in meerdere resourcegroepen voor Bicep - of ARM-sjablonen voor meer informatie.

Oplossing 5: Kringafhankelijkheid gedetecteerd

Deze fout wordt weergegeven wanneer resources van elkaar afhankelijk zijn op een manier die voorkomt dat de implementatie wordt gestart. Een combinatie van onderlinge afhankelijkheden zorgt ervoor dat twee of meer resources wachten op andere resources die ook wachten. Is bijvoorbeeld resource1 afhankelijk van resource3, resource2 afhankelijk van resource1en resource3 afhankelijk van resource2. U kunt dit probleem meestal oplossen door onnodige afhankelijkheden te verwijderen.

Bicep maakt een impliciete afhankelijkheid wanneer een resource de symbolische naam van een andere resource gebruikt. Een expliciete afhankelijkheid die gewoonlijk wordt gebruikt dependsOn , is niet nodig. Zie Bicep-afhankelijkheden voor meer informatie.

Een kringafhankelijkheid oplossen:

  1. Zoek in uw sjabloon de resource die is geïdentificeerd in de kringafhankelijkheid.
  2. Bekijk voor die resource de dependsOn eigenschap en eventuele toepassingen van de reference functies of resourceId om te zien van welke resources deze afhankelijk zijn.
  3. Bekijk deze resources om te zien van welke resources ze afhankelijk zijn. Volg de afhankelijkheden totdat u een resource ziet die afhankelijk is van de oorspronkelijke resource.
  4. Voor de resources die betrokken zijn bij de kringafhankelijkheid, moet u zorgvuldig alle toepassingen van de dependsOn eigenschap onderzoeken om eventuele afhankelijkheden te identificeren die niet nodig zijn. Verwijder de kringafhankelijkheden om problemen met de implementatie op te lossen. In plaats van de code te verwijderen, kunt u opmerkingen gebruiken zodat de code niet wordt uitgevoerd tijdens de volgende implementatie. U kunt opmerkingen met één regel (//) of opmerkingen met meerdere regels (/* ... */) gebruiken in ARM-sjablonen of Bicep-bestanden .
  5. Implementeer de sjabloon opnieuw.

Het verwijderen van waarden uit de dependsOn eigenschap kan fouten veroorzaken bij het implementeren van de sjabloon. Als er een fout optreedt, voegt u de afhankelijkheid weer toe aan de sjabloon. Als u opmerkingen hebt gebruikt om code in uw sjabloon over te slaan, kunt u de opmerkingen verwijderen om de code te herstellen.

Als deze benadering de kringafhankelijkheid niet oplost, kunt u een deel van uw implementatielogica verplaatsen naar onderliggende resources (zoals extensies of configuratie-instellingen). Configureer deze onderliggende resources om te implementeren na de resources die betrokken zijn bij de kringafhankelijkheid. Stel dat u twee virtuele machines implementeert, maar dat u eigenschappen moet instellen voor elke virtuele machine die naar de andere verwijst. U kunt ze in de volgende volgorde implementeren:

  1. vm1
  2. vm2
  3. Extensie op vm1 is afhankelijk van vm1 en vm2. De extensie stelt waarden in op vm1 die worden opgehaald van vm2.
  4. De extensie op vm2 is afhankelijk van vm1 en vm2. De extensie stelt waarden in op vm2 die worden opgehaald van vm1.

Dezelfde aanpak werkt voor App Service-apps. Overweeg configuratiewaarden te verplaatsen naar een onderliggende resource van de app-resource. U kunt twee web-apps in de volgende volgorde implementeren:

  1. webapp1
  2. webapp2
  3. De configuratie voor webapp1 is afhankelijk van webapp1 en webapp2. Het bevat app-instellingen met waarden uit webapp2.
  4. De configuratie voor webapp2 is afhankelijk van webapp1 en webapp2. Het bevat app-instellingen met waarden uit webapp1.

Oplossing 6: De syntaxis voor geëxporteerde sjablonen valideren

Nadat u resources in Azure hebt geïmplementeerd, kunt u de JSON van de ARM-sjabloon exporteren en wijzigen voor andere implementaties. U moet de geëxporteerde sjabloon valideren voor de juiste syntaxis voordat u deze gebruikt om resources te implementeren.

U kunt een sjabloon exporteren vanuit de portal, Azure CLI of Azure PowerShell. Er zijn aanbevelingen, ongeacht of u de sjabloon hebt geëxporteerd uit de resource of resourcegroep, of uit de implementatiegeschiedenis.

Nadat u een ARM-sjabloon hebt geëxporteerd, kunt u de JSON-sjabloon decompileren naar Bicep. Gebruik vervolgens best practices en de linter om uw code te valideren.

Ga naar de volgende artikelen voor meer informatie: