Testcases voor ARM-sjablonen
In dit artikel worden tests beschreven die worden uitgevoerd met de sjabloontest-toolkit voor Azure Resource Manager-sjablonen (ARM-sjablonen). Het bevat voorbeelden die de test passeren of mislukken en bevat de naam van elke test. Zie Testparameters voor meer informatie over het uitvoeren van tests of het uitvoeren van een specifieke test.
Het juiste schema gebruiken
Testnaam: DeploymentTemplate-schema is juist
In uw sjabloon moet u een geldige schemawaarde opgeven.
Het volgende voorbeeld mislukt omdat het schema ongeldig is.
{
"$schema": "https://schema.management.azure.com/schemas/2019-01-01/deploymentTemplate.json#",
}
In het volgende voorbeeld wordt een waarschuwing weergegeven omdat de schemaversie 2015-01-01
is afgeschaft en niet wordt onderhouden.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
}
In het volgende voorbeeld wordt een geldig schema gebruikt .
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
}
De eigenschap van schema
de sjabloon moet worden ingesteld op een van de volgende schema's:
https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#
https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#
https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#
https://schema.management.azure.com/schemas/2019-08-01/tenantDeploymentTemplate.json#
https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json
Gedeclareerde parameters moeten worden gebruikt
Testnaam: Er moet naar parameters worden verwezen
Met deze test worden parameters gevonden die niet worden gebruikt in de sjabloon of parameters die niet worden gebruikt in een geldige expressie.
Als u verwarring in uw sjabloon wilt verminderen, verwijdert u alle parameters die zijn gedefinieerd maar niet worden gebruikt. Het elimineren van ongebruikte parameters vereenvoudigt sjabloonimplementaties omdat u geen onnodige waarden hoeft op te geven.
Gebruik in Bicep de Linter-regel- geen ongebruikte parameters.
Het volgende voorbeeld mislukt omdat de expressie die verwijst naar een parameter de voorloophaak[
() ontbreekt.
"resources": [
{
"location": " parameters('location')]"
}
]
Het volgende voorbeeld wordt doorgegeven omdat de expressie geldig is.
"resources": [
{
"location": "[parameters('location')]"
}
]
Beveiligde parameters kunnen niet standaard in code zijn vastgelegd
Testnaam: Parameters voor beveiligde tekenreeksen kunnen niet standaard zijn
Geef geen in code vastgelegde standaardwaarde op voor een beveiligde parameter in uw sjabloon. Een beveiligde parameter kan een lege tekenreeks hebben als een standaardwaarde of de functie newGuid gebruiken in een expressie.
U gebruikt de typen secureString
of secureObject
parameters die gevoelige waarden bevatten, zoals wachtwoorden. Wanneer een parameter een beveiligd type gebruikt, wordt de waarde van de parameter niet geregistreerd of opgeslagen in de implementatiegeschiedenis. Met deze actie voorkomt u dat een kwaadwillende gebruiker de gevoelige waarde ontdekt.
Wanneer u een standaardwaarde opgeeft, kan die waarde worden gedetecteerd door iedereen die toegang heeft tot de sjabloon of de implementatiegeschiedenis.
Gebruik in Bicep de Linter-regel - standaardwaarde voor beveiligde parameters.
Het volgende voorbeeld mislukt.
"parameters": {
"adminPassword": {
"defaultValue": "HardcodedPassword",
"type": "secureString"
}
}
Het volgende voorbeeld wordt doorgegeven.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
Het volgende voorbeeld wordt doorgegeven omdat de newGuid
functie wordt gebruikt.
"parameters": {
"secureParameter": {
"type": "secureString",
"defaultValue": "[newGuid()]"
}
}
Omgevings-URL's kunnen niet in code worden vastgelegd
Testnaam: DeploymentTemplate mag geen vastgelegde URI bevatten
Codeer geen URL's voor de omgeving in uw sjabloon. Gebruik in plaats daarvan de omgevingsfunctie om deze URL's dynamisch op te halen tijdens de implementatie. Zie de testcase voor een lijst met de URL-hosts die worden geblokkeerd.
Gebruik in Bicep de Linter-regel- geen in code vastgelegde omgevings-URL.
Het volgende voorbeeld mislukt omdat de URL in code is vastgelegd.
"variables":{
"AzureURL":"https://management.azure.com"
}
De test mislukt ook bij gebruik met concat of URI.
"variables":{
"AzureSchemaURL1": "[concat('https://','gallery.azure.com')]",
"AzureSchemaURL2": "[uri('gallery.azure.com','test')]"
}
Het volgende voorbeeld wordt doorgegeven.
"variables": {
"AzureSchemaURL": "[environment().gallery]"
}
Locatie maakt gebruik van parameter
Testnaam: Locatie mag niet hardcoded zijn
Als u de locatie van een resource wilt instellen, moeten uw sjablonen een parameter hebben met de naam location
van het type dat is ingesteld op string
. In de hoofdsjabloon kan azuredeploy.json of mainTemplate.json deze parameter standaard de locatie van de resourcegroep instellen. In gekoppelde of geneste sjablonen mag de locatieparameter geen standaardlocatie hebben.
Sjabloongebruikers hebben mogelijk beperkte toegang tot regio's waar ze resources kunnen maken. Een in code vastgelegde resourcelocatie kan verhinderen dat gebruikers een resource maken. De "[resourceGroup().location]"
expressie kan gebruikers blokkeren als de resourcegroep is gemaakt in een regio die de gebruiker niet kan openen. Gebruikers die zijn geblokkeerd, kunnen de sjabloon niet gebruiken.
Door een location
parameter op te geven die standaard is ingesteld op de locatie van de resourcegroep, kunnen gebruikers de standaardwaarde gebruiken wanneer ze handig zijn, maar ook een andere locatie opgeven.
Gebruik in Bicep de Linter-regel: geen locatie-expressies buiten de standaardwaarden van de parameter.
Het volgende voorbeeld mislukt omdat de resource location
is ingesteld op resourceGroup().location
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "[resourceGroup().location]",
"kind": "StorageV2",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
}
}
]
}
In het volgende voorbeeld wordt een location
parameter gebruikt, maar mislukt omdat de parameter standaard wordt ingesteld op een in code vastgelegde locatie.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "westus"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"kind": "StorageV2",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
}
}
],
"outputs": {}
}
In het volgende voorbeeld wordt doorgegeven wanneer de sjabloon wordt gebruikt als hoofdsjabloon. Maak een parameter die standaard is ingesteld op de locatie van de resourcegroep, maar waarmee gebruikers een andere waarde kunnen opgeven.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for the resources."
}
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"kind": "StorageV2",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
}
}
],
"outputs": {}
}
Notitie
Als het voorgaande voorbeeld wordt gebruikt als een gekoppelde sjabloon, mislukt de test. Wanneer u als gekoppelde sjabloon wordt gebruikt, verwijdert u de standaardwaarde.
Resources moeten de locatie hebben
Testnaam: Resources moeten locatie hebben
De locatie voor een resource moet worden ingesteld op een sjabloonexpressie of global
. Voor de sjabloonexpressie wordt doorgaans de location
parameter gebruikt die wordt beschreven in Location.
Gebruik in Bicep de Linter-regel - geen vastgelegde locaties.
Het volgende voorbeeld mislukt omdat het location
geen expressie is of global
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"functions": [],
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "westus",
"kind": "StorageV2",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
}
}
],
"outputs": {}
}
Het volgende voorbeeld wordt doorgegeven omdat de resource location
is ingesteld op global
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"functions": [],
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "global",
"kind": "StorageV2",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
}
}
],
"outputs": {}
}
Het volgende voorbeeld wordt ook doorgegeven omdat de location
parameter gebruikmaakt van een expressie. De resource location
gebruikt de waarde van de expressie.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for the resources."
}
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"kind": "StorageV2",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
}
}
],
"outputs": {}
}
VM-grootte maakt gebruik van parameter
Testnaam: VM-grootte moet een parameter zijn
Codeer het hardwareProfile
object vmSize
niet. De test mislukt wanneer de hardwareProfile
test wordt weggelaten of een in code vastgelegde waarde bevat. Geef een parameter op, zodat gebruikers van uw sjabloon de grootte van de geïmplementeerde virtuele machine kunnen wijzigen. Zie Microsoft.Compute virtualMachines voor meer informatie.
Het volgende voorbeeld mislukt omdat het hardwareProfile
object vmSize
een in code vastgelegde waarde is.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
"name": "demoVM",
"location": "[parameters('location')]",
"properties": {
"hardwareProfile": {
"vmSize": "Standard_D2_v3"
}
}
}
]
Het voorbeeld wordt doorgegeven wanneer een parameter een waarde opgeeft voor vmSize
:
"parameters": {
"vmSizeParameter": {
"type": "string",
"defaultValue": "Standard_D2_v3",
"metadata": {
"description": "Size for the virtual machine."
}
}
}
hardwareProfile
Vervolgens gebruikt u een expressie om vmSize
te verwijzen naar de waarde van de parameter:
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
"name": "demoVM",
"location": "[parameters('location')]",
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('vmSizeParameter')]"
}
}
}
]
Minimum- en maximumwaarden zijn getallen
Testnaam: Minimum- en Maximumwaarde zijn getallen
Wanneer u een parameter definieert met minValue
en maxValue
geeft u deze op als getallen. U moet gebruiken minValue
en maxValue
als een paar of als de test mislukt.
Het volgende voorbeeld mislukt omdat minValue
en maxValue
tekenreeksen zijn.
"exampleParameter": {
"type": "int",
"minValue": "0",
"maxValue": "10"
}
Het volgende voorbeeld mislukt omdat alleen minValue
wordt gebruikt.
"exampleParameter": {
"type": "int",
"minValue": 0
}
Het volgende voorbeeld wordt doorgegeven omdat minValue
en maxValue
getallen zijn.
"exampleParameter": {
"type": "int",
"minValue": 0,
"maxValue": 10
}
Parameter artefacten correct gedefinieerd
Testnaam: parameter artefacten
Wanneer u parameters voor _artifactsLocation
en _artifactsLocationSasToken
opneemt, gebruikt u de juiste standaardinstellingen en typen. Aan de volgende voorwaarden moet worden voldaan om deze test door te geven:
- Als u één parameter opgeeft, moet u de andere opgeven.
_artifactsLocation
moet eenstring
._artifactsLocation
moet een standaardwaarde hebben in de hoofdsjabloon._artifactsLocation
kan geen standaardwaarde hebben in een geneste sjabloon._artifactsLocation
moet de URL van de onbewerkte opslagplaats hebben"[deployment().properties.templateLink.uri]"
voor de standaardwaarde._artifactsLocationSasToken
moet eensecureString
._artifactsLocationSasToken
mag alleen een lege tekenreeks hebben voor de standaardwaarde._artifactsLocationSasToken
kan geen standaardwaarde hebben in een geneste sjabloon.
Gebruik in Bicep de Linter-regel - artefactparameters.
Gedeclareerde variabelen moeten worden gebruikt
Testnaam: Naar variabelen moet worden verwezen
Met deze test worden variabelen gevonden die niet worden gebruikt in de sjabloon of die niet worden gebruikt in een geldige expressie. Als u verwarring in uw sjabloon wilt verminderen, verwijdert u alle variabelen die zijn gedefinieerd, maar niet worden gebruikt.
Er moet worden verwezen naar variabelen die gebruikmaken van het copy
element om waarden te herhalen. Zie Variabele iteratie in ARM-sjablonen voor meer informatie.
Gebruik in Bicep de Linter-regel- geen ongebruikte variabelen.
Het volgende voorbeeld mislukt omdat er niet naar de variabele wordt verwezen die gebruikmaakt van het copy
element.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"itemCount": {
"type": "int",
"defaultValue": 5
}
},
"variables": {
"copy": [
{
"name": "stringArray",
"count": "[parameters('itemCount')]",
"input": "[concat('item', copyIndex('stringArray', 1))]"
}
]
},
"resources": [],
"outputs": {}
}
Het volgende voorbeeld mislukt omdat de expressie die verwijst naar een variabele de voorloophaak[
() ontbreekt.
"outputs": {
"outputVariable": {
"type": "string",
"value": " variables('varExample')]"
}
}
Het volgende voorbeeld wordt doorgegeven omdat naar de variabele wordt verwezen in outputs
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"itemCount": {
"type": "int",
"defaultValue": 5
}
},
"variables": {
"copy": [
{
"name": "stringArray",
"count": "[parameters('itemCount')]",
"input": "[concat('item', copyIndex('stringArray', 1))]"
}
]
},
"resources": [],
"outputs": {
"arrayResult": {
"type": "array",
"value": "[variables('stringArray')]"
}
}
}
Het volgende voorbeeld wordt doorgegeven omdat de expressie geldig is.
"outputs": {
"outputVariable": {
"type": "string",
"value": "[variables('varExample')]"
}
}
Dynamische variabele mag geen samenvoeging gebruiken
Testnaam: Dynamische variabeleverwijzingen mogen geen concat gebruiken
Soms moet u dynamisch een variabele maken op basis van de waarde van een andere variabele of parameter. Gebruik de samenvoegfunctie niet bij het instellen van de waarde. Gebruik in plaats daarvan een object dat de beschikbare opties bevat en dynamisch een van de eigenschappen van het object op te halen tijdens de implementatie.
Het volgende voorbeeld wordt doorgegeven. De currentImage
variabele wordt dynamisch ingesteld tijdens de implementatie.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"osType": {
"type": "string",
"allowedValues": [
"Windows",
"Linux"
]
}
},
"variables": {
"imageOS": {
"Windows": {
"image": "Windows Image"
},
"Linux": {
"image": "Linux Image"
}
},
"currentImage": "[variables('imageOS')[parameters('osType')].image]"
},
"resources": [],
"outputs": {
"result": {
"type": "string",
"value": "[variables('currentImage')]"
}
}
}
Recente API-versie gebruiken
Testnaam: apiVersions moeten recent zijn
De API-versie voor elke resource moet een recente versie gebruiken die in code is vastgelegd als een tekenreeks. De test evalueert de API-versie in uw sjabloon op basis van de versies van de resourceprovider in de cache van de toolkit. Een API-versie die minder dan twee jaar oud is vanaf de datum waarop de test is uitgevoerd, wordt beschouwd als recent. Gebruik geen preview-versie wanneer er een recentere versie beschikbaar is.
Een waarschuwing dat er geen API-versie is gevonden, geeft alleen aan dat de versie niet is opgenomen in de cache van de toolkit. Met behulp van de nieuwste versie van een API, die wordt aanbevolen, kan de waarschuwing worden gegenereerd.
Meer informatie over de cache van de toolkit.
Gebruik in Bicep de Linter-regel : gebruik recente API-versies.
Het volgende voorbeeld mislukt omdat de API-versie meer dan twee jaar oud is.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2019-06-01",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Het volgende voorbeeld mislukt omdat er een preview-versie wordt gebruikt wanneer er een nieuwere versie beschikbaar is.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2020-08-01-preview",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Het volgende voorbeeld wordt doorgegeven omdat het een recente versie is die geen preview-versie is.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Vastgelegde API-versie gebruiken
Testnaam: Providers apiVersions is niet toegestaan
De API-versie voor een resourcetype bepaalt welke eigenschappen beschikbaar zijn. Geef een in code vastgelegde API-versie op in uw sjabloon. Haal geen API-versie op die tijdens de implementatie wordt bepaald, omdat u niet weet welke eigenschappen beschikbaar zijn.
Het volgende voorbeeld mislukt.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "[providers('Microsoft.Compute', 'virtualMachines').apiVersions[0]]",
...
}
]
Het volgende voorbeeld wordt doorgegeven.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
...
}
]
Eigenschappen kunnen niet leeg zijn
Testnaam: Sjabloon mag geen lege waarden bevatten
Code-eigenschappen niet op een lege waarde toepassen. Lege waarden omvatten null- en lege tekenreeksen, objecten of matrices. Als een eigenschap is ingesteld op een lege waarde, verwijdert u die eigenschap uit uw sjabloon. U kunt een eigenschap instellen op een lege waarde tijdens de implementatie, bijvoorbeeld via een parameter.
De template
eigenschap in een geneste sjabloon kan lege eigenschappen bevatten. Zie Microsoft.Resources-implementaties voor meer informatie over geneste sjablonen.
Het volgende voorbeeld mislukt omdat er lege eigenschappen zijn.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-01-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"sku": {},
"kind": ""
}
]
Het volgende voorbeeld wordt doorgegeven omdat de eigenschappen waarden bevatten.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-01-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"kind": "Storage"
}
]
Resource-id-functies gebruiken
Testnaam: id's moeten worden afgeleid van resource-id's
Wanneer u een resource-id opgeeft, gebruikt u een van de resource-id-functies. De toegestane functies zijn:
Gebruik de samenvoegfunctie niet om een resource-id te maken.
Gebruik in Bicep de Linter-regel - gebruik resource-id-functies.
Het volgende voorbeeld mislukt.
"networkSecurityGroup": {
"id": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/networkSecurityGroups/', variables('networkSecurityGroupName'))]"
}
Het volgende voorbeeld wordt doorgegeven.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
De functie ResourceId heeft de juiste parameters
Testnaam: ResourceIds mogen niet bevatten
Bij het genereren van resource-id's gebruikt u geen overbodige functies voor optionele parameters. De resourceId-functie maakt standaard gebruik van het huidige abonnement en de resourcegroep. U hoeft deze waarden niet op te geven.
Het volgende voorbeeld mislukt omdat u de huidige abonnements-id en resourcegroepnaam niet hoeft op te geven.
"networkSecurityGroup": {
"id": "[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Het volgende voorbeeld wordt doorgegeven.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Deze test is van toepassing op:
De reference
test mislukt wanneer u concat
de resource-id maakt.list*
dependsOn best practices
Testnaam: Best Practices voor DependsOn
Wanneer u de implementatieafhankelijkheden instelt, gebruikt u de if-functie niet om een voorwaarde te testen. Als één resource afhankelijk is van een resource die voorwaardelijk is geïmplementeerd, stelt u de afhankelijkheid in zoals bij elke resource. Wanneer een voorwaardelijke resource niet wordt geïmplementeerd, verwijdert Azure Resource Manager deze automatisch uit de vereiste afhankelijkheden.
Het dependsOn
element kan niet beginnen met een samenvoegfunctie .
Gebruik in Bicep de Linter-regel- geen overbodige dependsOn-vermeldingen.
Het volgende voorbeeld mislukt omdat deze een if
functie bevat.
"dependsOn": [
"[if(equals(parameters('newOrExisting'),'new'), variables('storageAccountName'), '')]"
]
Het volgende voorbeeld mislukt omdat het begint met concat
.
"dependsOn": [
"[concat(variables('storageAccountName'))]"
]
Het volgende voorbeeld wordt doorgegeven.
"dependsOn": [
"[variables('storageAccountName')]"
]
Geneste of gekoppelde implementaties kunnen geen foutopsporing gebruiken
Testnaam: Implementatiebronnen mogen geen fouten opsporen
Wanneer u een geneste of gekoppelde sjabloon definieert met het Microsoft.Resources/deployments
resourcetype, kunt u foutopsporing inschakelen. Foutopsporing wordt gebruikt wanneer u een sjabloon wilt testen, maar gevoelige informatie beschikbaar kunt maken. Schakel de foutopsporing uit voordat de sjabloon in productie wordt gebruikt. U kunt het debugSetting
object verwijderen of de detailLevel
eigenschap wijzigen in none
.
Het volgende voorbeeld mislukt.
"debugSetting": {
"detailLevel": "requestContent"
}
Het volgende voorbeeld wordt doorgegeven.
"debugSetting": {
"detailLevel": "none"
}
Namen van beheerdersgebruikers kunnen geen letterlijke waarde zijn
Testnaam: adminUsername mag geen letterlijke naam zijn
Gebruik bij het instellen van een adminUserName
waarde geen letterlijke waarde. Maak een parameter voor de gebruikersnaam en gebruik een expressie om te verwijzen naar de waarde van de parameter.
Gebruik in Bicep de Linter-regel: gebruikersnaam van beheerder mag niet letterlijk zijn.
Het volgende voorbeeld mislukt met een letterlijke waarde.
"osProfile": {
"adminUserName": "myAdmin"
}
In het volgende voorbeeld wordt een expressie doorgegeven .
"osProfile": {
"adminUsername": "[parameters('adminUsername')]"
}
Meest recente VM-installatiekopieën gebruiken
Testnaam: VM-installatiekopieën moeten de nieuwste versie gebruiken
Deze test is uitgeschakeld, maar de uitvoer laat zien dat deze is geslaagd. De aanbevolen procedure is om uw sjabloon te controleren op de volgende criteria:
Als uw sjabloon een virtuele machine met een installatiekopieën bevat, controleert u of deze de nieuwste versie van de installatiekopieën gebruikt.
Gebruik in Bicep de Linter-regel- gebruik stabiele VM-installatiekopieën.
Stabiele VM-installatiekopieën gebruiken
Testnaam: Virtuele machines mogen geen preview zijn
Virtuele machines mogen geen preview-installatiekopieën gebruiken. De test controleert of storageProfile
de imageReference
test geen tekenreeks gebruikt die preview bevat. En die preview wordt niet gebruikt in de imageReference
eigenschappen offer
, sku
of version
.
Zie Microsoft.Compute virtualMachines en Microsoft.Compute virtualMachineScaleSets voor meer informatie over de imageReference
eigenschap.
Gebruik in Bicep de Linter-regel- gebruik stabiele VM-installatiekopieën.
Het volgende voorbeeld mislukt omdat imageReference
dit een tekenreeks is die een voorbeeld bevat.
"properties": {
"storageProfile": {
"imageReference": "latest-preview"
}
}
Het volgende voorbeeld mislukt wanneer preview wordt gebruikt in offer
, sku
of version
.
"properties": {
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer_preview",
"sku": "16.04-LTS-preview",
"version": "preview"
}
}
}
Het volgende voorbeeld wordt doorgegeven.
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "16.04-LTS",
"version": "latest"
}
}
Gebruik de ManagedIdentity-extensie niet
Testnaam: ManagedIdentityExtension mag niet worden gebruikt
Pas de ManagedIdentity
extensie niet toe op een virtuele machine. De extensie is in 2019 afgeschaft en mag niet meer worden gebruikt.
Uitvoer kan geen geheimen bevatten
Testnaam: Uitvoer mag geen geheimen bevatten
Neem geen waarden op in de outputs
sectie die mogelijk geheimen blootstelt. Beveilig bijvoorbeeld parameters van het type secureString
of secureObject
lijst * functies zoals listKeys
.
De uitvoer van een sjabloon wordt opgeslagen in de implementatiegeschiedenis, zodat een kwaadwillende gebruiker die informatie kan vinden.
Gebruik in Bicep de Linter-regel: uitvoer mag geen geheimen bevatten.
Het volgende voorbeeld mislukt omdat deze een beveiligde parameter in een uitvoerwaarde bevat.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"secureParam": {
"type": "secureString"
}
},
"functions": [],
"variables": {},
"resources": [],
"outputs": {
"badResult": {
"type": "string",
"value": "[concat('this is the value ', parameters('secureParam'))]"
}
}
}
Het volgende voorbeeld mislukt omdat er een lijst* -functie wordt gebruikt in de uitvoer.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageName": {
"type": "string"
}
},
"functions": [],
"variables": {},
"resources": [],
"outputs": {
"badResult": {
"type": "object",
"value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
}
}
}
ProtectedSettings gebruiken voor commandToExecute-geheimen
Testnaam: CommandToExecute moet ProtectedSettings gebruiken voor geheimen
Voor resources met type CustomScript
gebruikt u de versleutelde protectedSettings
gegevens commandToExecute
, zoals een wachtwoord. Geheime gegevens kunnen bijvoorbeeld worden gebruikt in beveiligde parameters van het type secureString
of secureObject
, list* -functies zoals listKeys
of aangepaste scripts.
Gebruik geen geheime gegevens in het settings
object omdat er duidelijke tekst wordt gebruikt. Zie Microsoft.Compute virtualMachines/extensions, Windows of Linux voor meer informatie.
Gebruik in Bicep de Linter-regel - gebruik protectedSettings voor commandToExecute-geheimen.
Het volgende voorbeeld mislukt omdat settings
deze wordt gebruikt commandToExecute
met een beveiligde parameter.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Het volgende voorbeeld mislukt omdat settings
deze wordt gebruikt commandToExecute
met een listKeys
functie.
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
}
}
Het volgende voorbeeld wordt doorgegeven omdat protectedSettings
deze wordt gebruikt commandToExecute
met een beveiligde parameter.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"protectedSettings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Het volgende voorbeeld wordt doorgegeven omdat protectedSettings
deze wordt gebruikt commandToExecute
met een listKeys
functie.
"properties": {
"type": "CustomScript",
"protectedSettings": {
"commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
}
}
Recente API-versies gebruiken in referentiefuncties
Testnaam: apiVersions moeten recent zijn in referentiefuncties
De API-versie die in een referentiefunctie wordt gebruikt, moet recent zijn en geen preview-versie. De test evalueert de API-versie in uw sjabloon op basis van de versies van de resourceprovider in de cache van de toolkit. Een API-versie die minder dan twee jaar oud is vanaf de datum waarop de test is uitgevoerd, wordt beschouwd als recent.
Een waarschuwing dat er geen API-versie is gevonden, geeft alleen aan dat de versie niet is opgenomen in de cache van de toolkit. Met behulp van de nieuwste versie van een API, die wordt aanbevolen, kan de waarschuwing worden gegenereerd.
Meer informatie over de cache van de toolkit.
Het volgende voorbeeld mislukt omdat de API-versie meer dan twee jaar oud is.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01')]"
}
}
Het volgende voorbeeld mislukt omdat de API-versie een preview-versie is.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2020-08-01-preview')]"
}
}
Het volgende voorbeeld wordt doorgegeven omdat de API-versie minder dan twee jaar oud is en geen preview-versie is.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-02-01')]"
}
}
Type en naam gebruiken in resourceId-functies
Testnaam: Resources mogen niet dubbelzinnig zijn
Deze test is uitgeschakeld, maar de uitvoer laat zien dat deze is geslaagd. De aanbevolen procedure is om uw sjabloon te controleren op de volgende criteria:
Een resource-id moet een resourcetype en resourcenaam bevatten. Met deze test worden alle functies van resourceId
de sjabloon gevonden en wordt gecontroleerd of de resource in de sjabloon wordt gebruikt met de juiste syntaxis. Anders wordt de functie als dubbelzinnig beschouwd.
Een functie wordt bijvoorbeeld resourceId
als dubbelzinnig beschouwd:
- Wanneer een resource niet wordt gevonden in de sjabloon en er geen resourcegroep is opgegeven.
- Als een resource een voorwaarde bevat en er geen resourcegroep is opgegeven.
- Als een gerelateerde resource enkele, maar niet alle naamsegmenten bevat. Een onderliggende resource bevat bijvoorbeeld meer dan één naamsegment. Zie de opmerkingen van resourceId voor meer informatie.
Binnenbereik gebruiken voor beveiligde parameters voor geneste implementatie
Testnaam: Beveiligde params in geneste implementaties
Gebruik het object van expressionEvaluationOptions
de geneste sjabloon met inner
bereik om expressies te evalueren die beveiligde parameters van het type secureString
of secureObject
lijst* bevatten, zoals listKeys
. Als het outer
bereik wordt gebruikt, worden expressies geëvalueerd in duidelijke tekst binnen het bereik van de bovenliggende sjabloon. De veilige waarde is vervolgens zichtbaar voor iedereen met toegang tot de implementatiegeschiedenis. De standaardwaarde expressionEvaluationOptions
is outer
.
Zie Microsoft.Resources-implementaties en evaluatiebereik expressies in geneste sjablonen voor meer informatie over geneste sjablonen.
Gebruik in Bicep de Linter-regel : beveiligde params in geneste implementatie.
Het volgende voorbeeld mislukt omdat expressionEvaluationOptions
het bereik wordt gebruikt outer
om beveiligde parameters of list*
functies te evalueren.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate",
"properties": {
"expressionEvaluationOptions": {
"scope": "outer"
}
}
}
]
In het volgende voorbeeld wordt het inner
expressionEvaluationOptions
bereik doorgegeven om beveiligde parameters of list*
functies te evalueren.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
}
}
}
]
Volgende stappen
- Zie Test-toolkit voor ARM-sjablonen gebruiken voor meer informatie over het uitvoeren van de test-toolkit.
- Voor een Learn-module die betrekking heeft op het gebruik van de test-toolkit, raadpleegt u Preview-wijzigingen en valideert u Azure-resources met behulp van what-if en de test-toolkit voor ARM-sjablonen.
- Zie Testcases voor parameterbestanden om parameterbestanden te testen.
- Zie Testcases voor createUiDefinition.json voor createUiDefinition-tests.
- Zie Testcases voor alle bestanden voor meer informatie over tests voor alle bestanden.