Delen via


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 vmSizeniet. 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 maxValuegeeft 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 _artifactsLocationSasTokenopneemt, 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 een string.
  • _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 een secureString.
  • _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 adminUserNamewaarde 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, skuof 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, skuof 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 secureObjectlijst * 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 CustomScriptgebruikt 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 listKeysof 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