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 slagen of slagen voor de test 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 de schema
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: Naar parameters moet 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 voorkomen, 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 naar een parameter verwijst, het vierkante voorloophaakje ([
) ontbreekt.
"resources": [
{
"location": " parameters('location')]"
}
]
Het volgende voorbeeld wordt doorgegeven omdat de expressie geldig is.
"resources": [
{
"location": "[parameters('location')]"
}
]
Beveiligde parameters kunnen geen in code vastgelegde standaardwaarden hebben
Testnaam: Veilige tekenreeksparameters kunnen geen standaardwaarde hebben
Geef geen in code vastgelegde standaardwaarde op voor een beveiligde parameter in uw sjabloon. Een beveiligde parameter kan een lege tekenreeks als standaardwaarde hebben of de functie newGuid in een expressie gebruiken.
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 kan detecteren.
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 veilige parameter.
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 in code vastgelegde URI bevatten
Maak geen vaste code voor omgevings-URL's 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 zijn geblokkeerd.
Gebruik in Bicep de Linter-regel : geen vastgelegde omgevings-URL.
Het volgende voorbeeld mislukt omdat de URL in code is vastgelegd.
"variables":{
"AzureURL":"https://management.azure.com"
}
De test mislukt ook wanneer deze wordt gebruikt 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 de parameter
Testnaam: Locatie mag niet worden vastgelegd
Als u de locatie van een resource wilt instellen, moeten uw sjablonen een parameter met de naam location
hebben, waarbij het type is ingesteld op string
. In de hoofdsjabloon, azuredeploy.json of mainTemplate.json, kan deze parameter standaard worden ingesteld op de locatie van de resourcegroep. 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 kunnen maken. De "[resourceGroup().location]"
expressie kan gebruikers blokkeren als de resourcegroep is gemaakt in een regio waar de gebruiker geen toegang toe heeft. Gebruikers die zijn geblokkeerd, kunnen de sjabloon niet gebruiken.
Door een location
parameter op te geven die standaard wordt ingesteld op de locatie van de resourcegroep, kunnen gebruikers de standaardwaarde gebruiken wanneer dit handig is, maar ook een andere locatie opgeven.
In Bicep gebruikt u 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 deze 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": {}
}
Het volgende voorbeeld wordt doorgegeven wanneer de sjabloon wordt gebruikt als de hoofdsjabloon. Maak een parameter die standaard wordt 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 deze wordt gebruikt als een gekoppelde sjabloon, verwijdert u de standaardwaarde.
Resources moeten locatie hebben
Testnaam: Resources moeten locatie hebben
De locatie voor een resource moet worden ingesteld op een sjabloonexpressie of global
. De sjabloonexpressie gebruikt doorgaans de location
parameter die wordt beschreven in Locatie gebruikt parameter.
Gebruik in Bicep de Linter-regel - geen vastgelegde locaties.
Het volgende voorbeeld mislukt omdat de location
geen expressie of global
is.
{
"$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 een expressie gebruikt. 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 de code van het hardwareProfile
object vmSize
niet. De test mislukt wanneer de hardwareProfile
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 de waarde van vmSize
het hardwareProfile
object 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."
}
}
}
Gebruikt vervolgens hardwareProfile
een expressie voor vmSize
om 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 en maxValue
als paar gebruikenminValue
, anders mislukt de test.
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
}
In 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 standaardwaarden en typen. Voor deze test moet aan de volgende voorwaarden worden voldaan:
- Als u één parameter opgeeft, moet u de andere opgeven.
_artifactsLocation
moet eenstring
zijn._artifactsLocation
moet een standaardwaarde hebben in de hoofdsjabloon._artifactsLocation
kan geen standaardwaarde hebben in een geneste sjabloon._artifactsLocation
moet of de URL van de onbewerkte opslagplaats hebben"[deployment().properties.templateLink.uri]"
voor de standaardwaarde._artifactsLocationSasToken
moet eensecureString
zijn._artifactsLocationSasToken
kan alleen een lege tekenreeks hebben voor de standaardwaarde._artifactsLocationSasToken
kan geen standaardwaarde hebben in een geneste sjabloon.
Gebruik in Bicep Linter-regel - artefactenparameters.
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 voorkomen, verwijdert u alle variabelen die zijn gedefinieerd maar niet worden gebruikt.
Er moet worden verwezen naar variabelen die het copy
element gebruiken 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 niet wordt verwezen naar de variabele 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 in de expressie die verwijst naar een variabele de vierkante 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 gebruik maken van concat
Testnaam: dynamische variabeleverwijzingen mogen geen gebruik maken van Concat
Soms moet u dynamisch een variabele maken op basis van de waarde van een andere variabele of parameter. Gebruik de functie concat niet bij het instellen van de waarde. Gebruik in plaats daarvan een object dat de beschikbare opties bevat en haal tijdens de implementatie dynamisch een van de eigenschappen van het object op.
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 als recent beschouwd. Gebruik geen preview-versie wanneer 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. Het gebruik van de nieuwste versie van een API, die wordt aanbevolen, kan de waarschuwing genereren.
Meer informatie over de toolkit-cache.
Gebruik in Bicep 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 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')]"
}
]
In code 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 mogen niet leeg zijn
Testnaam: Sjabloon mag geen lege waarden bevatten
Codeer eigenschappen niet naar een lege waarde. Lege waarden zijn null en lege tekenreeksen, objecten of matrices. Als een eigenschap is ingesteld op een lege waarde, verwijdert u die eigenschap uit de 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 functie concat niet om een resource-id te maken.
Gebruik in Bicep Linter-regel - 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 is geslaagd.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
ResourceId-functie heeft de juiste parameters
Testnaam: ResourceIds mogen niet bevatten
Gebruik bij het genereren van resource-id's geen onnodige functies voor optionele parameters. De functie resourceId maakt standaard gebruik van het huidige abonnement en de huidige 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 is geslaagd.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Deze test is van toepassing op:
Voor reference
en list*
mislukt de test wanneer u gebruikt concat
om de resource-id samen te stellen.
dependsOn best practices
Testnaam: DependsOn Best Practices
Gebruik bij het instellen van de implementatieafhankelijkheden niet de functie if om een voorwaarde te testen. Als één resource afhankelijk is van een resource die voorwaardelijk is geïmplementeerd, stelt u de afhankelijkheid in op 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 onnodige dependsOn-vermeldingen.
Het volgende voorbeeld mislukt omdat het een if
functie bevat.
"dependsOn": [
"[if(equals(parameters('newOrExisting'),'new'), variables('storageAccountName'), '')]"
]
Het volgende voorbeeld mislukt omdat deze begint met concat
.
"dependsOn": [
"[concat(variables('storageAccountName'))]"
]
Het volgende voorbeeld wordt doorgegeven.
"dependsOn": [
"[variables('storageAccountName')]"
]
Geneste of gekoppelde implementaties kunnen geen gebruik maken van foutopsporing
Testnaam: Implementatieresources mogen geen foutopsporing zijn
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 moet testen, maar gevoelige informatie beschikbaar kan maken. Schakel 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"
}
Beheer gebruikersnamen mogen geen letterlijke waarde zijn
Testnaam: adminUsername mag geen letterlijke naam zijn
Gebruik bij het instellen van een adminUserName
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. De gebruikersnaam van de beheerder mag niet letterlijk zijn.
Het volgende voorbeeld mislukt met een letterlijke waarde.
"osProfile": {
"adminUserName": "myAdmin"
}
Het volgende voorbeeld wordt doorgegeven met een expressie.
"osProfile": {
"adminUsername": "[parameters('adminUsername')]"
}
Nieuwste 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: Virtual Machines mag geen voorbeeld zijn
Virtuele machines mogen geen voorbeeldafbeeldingen gebruiken. Met de storageProfile
test wordt gecontroleerd of er imageReference
geen tekenreeks wordt gebruikt die een voorbeeld bevat. En dat voorbeeld wordt niet gebruikt in de imageReference
eigenschappen offer
, sku
of version
.
Zie Microsoft.Compute virtualMachines en Microsoft.Compute virtualMachineScaleSets voor meer informatie over imageReference
de eigenschap.
Gebruik in Bicep de Linter-regel - gebruik stabiele VM-installatiekopieën.
Het volgende voorbeeld mislukt omdat imageReference
het een tekenreeks is die een voorbeeld bevat.
"properties": {
"storageProfile": {
"imageReference": "latest-preview"
}
}
Het volgende voorbeeld mislukt wanneer een voorbeeld 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"
}
}
De ManagedIdentity-extensie niet gebruiken
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 mag geen geheimen bevatten
Testnaam: uitvoer mag geen geheimen bevatten
Neem geen waarden op in de outputs
sectie die mogelijk geheimen beschikbaar maakt. Bijvoorbeeld beveiligde parameters van het type secureString
of secureObject
, of 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 bevat in een uitvoerwaarde.
{
"$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 in de uitvoer een lijst*- functie wordt gebruikt.
{
"$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 het type CustomScript
gebruikt u de versleutelde protectedSettings
wanneer commandToExecute
geheime gegevens, zoals een wachtwoord, zijn opgenomen. Geheime gegevens kunnen bijvoorbeeld worden gebruikt in beveiligde parameters van het type secureString
of secureObject
, lijst*- functies zoals listKeys
, of aangepaste scripts.
Gebruik geen geheime gegevens in het settings
object omdat hierin tekst wordt gebruikt. Zie Microsoft.Compute virtualMachines/extensions, Windows of Linux voor meer informatie.
Gebruik in Bicep de Linter-regel - gebruik protectedInstellingen voor commandToExecute-geheimen.
Het volgende voorbeeld mislukt omdat settings
wordt gebruikt commandToExecute
met een beveiligde parameter.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Het volgende voorbeeld mislukt omdat settings
wordt gebruikt commandToExecute
met een listKeys
functie.
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
}
}
In het volgende voorbeeld wordt doorgegeven omdat protectedSettings
wordt gebruikt commandToExecute
met een beveiligde parameter.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"protectedSettings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
In het volgende voorbeeld wordt doorgegeven omdat protectedSettings
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 verwijzingsfunctie 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 als recent beschouwd.
Een waarschuwing dat er geen API-versie is gevonden, geeft alleen aan dat de versie niet is opgenomen in de cache van de toolkit. Het gebruik van de nieuwste versie van een API, die wordt aanbevolen, kan de waarschuwing genereren.
Meer informatie over de toolkit-cache.
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')]"
}
}
In 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 resourceId moet een resourcetype en resourcenaam bevatten. Met deze test worden alle functies van resourceId
de sjabloon gevonden en wordt gecontroleerd of de resource wordt gebruikt in de sjabloon met de juiste syntaxis. Anders wordt de functie als dubbelzinnig beschouwd.
Een resourceId
functie wordt bijvoorbeeld als dubbelzinnig beschouwd:
- Wanneer er geen resource 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 opmerkingen bij resourceId voor meer informatie.
Binnenste bereik gebruiken voor beveiligde parameters voor geneste implementatie
Testnaam: Beveiligde parameters 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*- functies bevatten, zoals listKeys
. Als het outer
bereik wordt gebruikt, worden expressies geëvalueerd in tekst zonder opmaak binnen het bereik van de bovenliggende sjabloon. De beveiligde waarde is vervolgens zichtbaar voor iedereen met toegang tot de implementatiegeschiedenis. De standaardwaarde van expressionEvaluationOptions
is outer
.
Zie Microsoft.Resources-implementaties en Evaluatiebereik voor expressies in geneste sjablonen voor meer informatie over geneste sjablonen.
In Bicep gebruikt u Linter-regel - beveiligde parameters 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 hetexpressionEvaluationOptions
bereik gebruikt inner
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.
- Zie Wijzigingen bekijken en Azure-resources valideren met behulp van wat-als en de test-toolkit voor ARM-sjablonen voor een Learn-module die het gebruik van de test-toolkit behandelt.
- Zie Testcases voor parameterbestanden als u parameterbestanden wilt testen.
- Zie Testcases voor createUiDefinition.json voor createUiDefinition-tests.
- Zie Testcases voor alle bestanden voor meer informatie over tests voor alle bestanden.