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 globalis.

{
  "$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 vmSizeniet. 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 _artifactsLocationSasTokenopneemt, 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 een stringzijn.
  • _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 een secureStringzijn.
  • _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 adminUserNamegeen 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, skuof 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, 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"
  }
}

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 CustomScriptgebruikt 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 secureObjectlijst*- 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