Testfälle für ARM-Vorlagen
In diesem Artikel werden die Tests beschrieben, die mit dem Vorlagen-Testtoolkit für Azure Resource Manager-Vorlagen (ARM-Vorlagen) ausgeführt werden. Er enthält Beispiele, bei denen der Test bestanden oder nicht bestanden wird, und umfasst den Namen des jeweiligen Tests. Weitere Informationen zur Ausführungsweise von Tests oder eines bestimmten Tests finden Sie unter Testparameter.
Verwendung des richtigen Schemas
Testname: DeploymentTemplate Schema Is Correct
Sie müssen in Ihrer Vorlage einen gültigen Schemawert angeben.
Das folgende Beispiel besteht den Test nicht, weil das Schema ungültig ist.
{
"$schema": "https://schema.management.azure.com/schemas/2019-01-01/deploymentTemplate.json#",
}
Im folgenden Beispiel wird eine Warnung angezeigt, da die Schemaversion 2015-01-01
veraltet ist und nicht gepflegt wird.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
}
Das folgende Beispiel besteht den Test, indem es ein gültiges Schema verwendet.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
}
Die schema
-Eigenschaft der Vorlage muss auf eins der folgenden Schemas festgelegt sein:
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
Verwendung deklarierter Parameter
Testname: Parameters Must Be Referenced
Dieser Test sucht nach Parametern, die nicht in der Vorlage verwendet werden, oder nach Parametern, die nicht in einem gültigen Ausdruck verwendet werden.
Löschen Sie alle Parameter, die definiert sind, aber nicht verwendet werden, um Ihre Vorlage übersichtlicher zu machen. Das Beseitigen nicht verwendeter Parameter vereinfacht die Bereitstellung von Vorlagen, da Sie keine unnötigen Werte angeben müssen.
Verwenden Sie in Bicep Linter-Regel – keine nicht verwendeten Parameter.
Das folgende Beispiel besteht den Test nicht, weil in dem Ausdruck, der auf einen Parameter verweist, die führende eckige Klammer ([
) fehlt.
"resources": [
{
"location": " parameters('location')]"
}
]
Das folgende Beispiel besteht den Test, weil der Ausdruck gültig ist.
"resources": [
{
"location": "[parameters('location')]"
}
]
Keine hartcodierten Standardwerte für sichere Parameter
Testname: Secure String Parameters Cannot Have Default
Stellen Sie keinen hartcodierten Standardwert für einen sicheren Parameter in Ihrer Vorlage bereit. Ein sicherer Parameter kann eine leere Zeichenfolge als Standardwert aufweisen oder die newGuid-Funktion in einem Ausdruck verwenden.
Für Parameter, die vertrauliche Werte enthalten (z. B. Kennwörter), verwenden Sie die Typen secureString
oder secureObject
. Der Wert von Parametern mit einem sicheren Typ wird nicht protokolliert oder im Bereitstellungsverlauf gespeichert. Dadurch wird verhindert, dass der sensible Wert von einem böswilligen Benutzer entdeckt wird.
Wenn Sie einen Standardwert angeben, ist dieser Wert für jeden Benutzer sichtbar, der Zugriff auf die Vorlage oder den Bereitstellungsverlauf hat.
Verwenden Sie in Bicep Linter-Regel – sicherer Parameterstandard.
Das folgende Beispiel besteht den Test nicht.
"parameters": {
"adminPassword": {
"defaultValue": "HardcodedPassword",
"type": "secureString"
}
}
Das nächste Beispiel besteht den Test.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
Das folgende Beispiel besteht den Test, weil die newGuid
-Funktion verwendet wird.
"parameters": {
"secureParameter": {
"type": "secureString",
"defaultValue": "[newGuid()]"
}
}
Umgebungs-URLs können nicht hartcodiert werden
Testname: DeploymentTemplate Must Not Contain Hardcoded Uri
Die Umgebungs-URLs in Ihrer Vorlage dürfen nicht hartcodiert werden. Verwenden Sie stattdessen die Umgebungsfunktion, um diese URLs während der Bereitstellung dynamisch abzurufen. Eine Liste der blockierten URL-Hosts finden Sie im Artikel zum Testfall.
Verwenden Sie in Bicep Linter-Regel – keine hartcodierte Umgebungs-URL.
Das folgende Beispiel besteht den Test nicht, weil die URL hartcodiert ist.
"variables":{
"AzureURL":"https://management.azure.com"
}
Der Test ist auch bei Verwendung von concat oder urinicht erfolgreich.
"variables":{
"AzureSchemaURL1": "[concat('https://','gallery.azure.com')]",
"AzureSchemaURL2": "[uri('gallery.azure.com','test')]"
}
Das folgende Beispiel besteht den Test.
"variables": {
"AzureSchemaURL": "[environment().gallery]"
}
Verwendung eines Parameters für den Speicherort
Testname: Location Should Not Be Hardcoded
Um den Ort einer Ressource festzulegen, sollten Ihre Vorlagen über einen Parameter mit dem Namen location
verfügen, dessen Typ auf string
festgelegt ist. In der Hauptvorlage azuredeploy.json oder mainTemplate.json kann dieser Parameter standardmäßig auf den Standort der Ressourcengruppe festgelegt werden. In verknüpften oder geschachtelten Vorlagen sollte der location-Parameter keinen Standardstandort aufweisen.
Vorlagenbenutzer haben möglicherweise eingeschränkten Zugriff auf Regionen, in denen sie Ressourcen erstellen können. Ein hartcodierter Ressourcenstandort hindert Benutzer möglicherweise daran, eine Ressource zu erstellen. Der Ausdruck "[resourceGroup().location]"
könnte Benutzer blockieren, wenn die Ressourcengruppe in einer Region erstellt wurde, auf die der Benutzer nicht zugreifen kann. Blockierte Benutzer können die Vorlage nicht verwenden.
Wenn Sie einen location
-Parameter angeben, der als Standardwert den Standort der Ressourcengruppe aufweist, können die Benutzer den Standardwert verwenden oder einen anderen Standort angeben.
Verwenden Sie in Bicep Linter-Regel – Keine Speicherortausdrücke außerhalb von Parameterstandardwerten.
Das folgende Beispiel besteht den Test nicht, weil der location
der Ressource auf resourceGroup().location
festgelegt ist.
{
"$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"
}
}
]
}
Im nächsten Beispiel wird ein location
-Parameter verwendet, aber der Test wird nicht bestanden, da der Standardwert des Parameters ein hartcodierter Standort ist.
{
"$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": {}
}
Das folgende Beispiel besteht den Test, wenn die Vorlage als Hauptvorlage verwendet wird. Erstellen Sie einen Parameter, dessen Standardwert der Ressourcengruppenstandort ist, Benutzern jedoch die Angabe eines anderen Werts ermöglicht.
{
"$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": {}
}
Hinweis
Wenn das vorherige Beispiel als verknüpfte Vorlage verwendet wird, wird der Test nicht bestanden. Wenn Sie die Verwendung als verknüpfte Vorlage planen, entfernen Sie den Standardwert.
Verwendung eines Speicherorts für Ressourcen
Testname: Resources Should Have Location
Der Speicherort für eine Ressource sollte auf einen Vorlagenausdruck oder global
festgelegt werden. Der Vorlagenausdruck verwendet in der Regel den unter Standort verwendet Parameter beschriebenen location
-Parameter.
Verwenden Sie in Bicep Linter-Regel – Keine hartcodierten Speicherorte.
Das folgende Beispiel besteht den Test nicht, weil der location
kein Ausdruck oder global
ist.
{
"$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": {}
}
Das folgende Beispiel besteht den Test, weil der location
der Ressource auf global
festgelegt ist.
{
"$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": {}
}
Das nächste Beispiel besteht den Test ebenfalls, weil der location
-Parameter einen Ausdruck verwendet. Die Ressource location
verwendet den Wert des Ausdrucks.
{
"$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": {}
}
Verwendung eines Parameters für die VM-Größe
Testname: VM Size Should Be A Parameter
Die vmSize
des hardwareProfile
des Objekts darf nicht hartcodiert werden. Der Test wird nicht bestanden, wenn das hardwareProfile
ausgelassen wird oder einen hartcodierten Wert enthält. Stellen Sie einen Parameter bereit, damit Benutzer Ihrer Vorlage die Größe der bereitgestellten VM ändern können. Weitere Informationen finden Sie unter Microsoft.Compute virtualMachines.
Das folgende Beispiel besteht den Test nicht, weil die vmSize
des hardwareProfile
des Objekts ein hartcodierter Wert ist.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
"name": "demoVM",
"location": "[parameters('location')]",
"properties": {
"hardwareProfile": {
"vmSize": "Standard_D2_v3"
}
}
}
]
Das Beispiel besteht den Test, wenn ein Parameter einen Wert für vmSize
angibt:
"parameters": {
"vmSizeParameter": {
"type": "string",
"defaultValue": "Standard_D2_v3",
"metadata": {
"description": "Size for the virtual machine."
}
}
}
Dann verwendet hardwareProfile
einen Ausdruck für vmSize
, um auf den Wert des Parameters zu verweisen:
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
"name": "demoVM",
"location": "[parameters('location')]",
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('vmSizeParameter')]"
}
}
}
]
Angabe von Mindest- und Maximalwerten als Zahlen
Testname: Min And Max Value Are Numbers
Wenn Sie einen Parameter mit minValue
und maxValue
definieren, geben Sie diese als Zahlen an. Sie müssen minValue
und maxValue
als Paar verwenden, sonst wird der Test nicht bestanden.
Das folgenden Beispiel besteht den Test nicht, weil minValue
und maxValue
Zeichenfolgen sind.
"exampleParameter": {
"type": "int",
"minValue": "0",
"maxValue": "10"
}
Das folgende Beispiel besteht den Test nicht, weil nur minValue
verwendet wird.
"exampleParameter": {
"type": "int",
"minValue": 0
}
Das folgenden Beispiel besteht den Test, weil minValue
und maxValue
Zahlen sind.
"exampleParameter": {
"type": "int",
"minValue": 0,
"maxValue": 10
}
Korrekte Definition von Artefaktparametern
Testname: artifacts parameter
Wenn Sie Parameter für _artifactsLocation
und _artifactsLocationSasToken
hinzufügen, müssen Sie die richtigen Standardwerte und Typen verwenden. Die folgenden Bedingungen müssen erfüllt sein, damit dieser Test erfolgreich ist:
- Wenn Sie einen Parameter bereitstellen, müssen Sie auch den anderen Parameter angeben.
_artifactsLocation
muss vom Typstring
sein._artifactsLocation
muss in der Hauptvorlage über einen Standardwert verfügen._artifactsLocation
darf in einer geschachtelten Vorlage keinen Standardwert haben._artifactsLocation
muss entweder"[deployment().properties.templateLink.uri]"
oder die Basis-URL des Repositorys als Standardwert aufweisen._artifactsLocationSasToken
muss vom TypsecureString
sein._artifactsLocationSasToken
darf nur eine leere Zeichenfolge als Standardwert aufweisen._artifactsLocationSasToken
darf in einer geschachtelten Vorlage keinen Standardwert haben.
Verwenden Sie in Bicep Linter-Regel – Artefaktparameter.
Verwendung deklarierter Variablen
Testname: Variables Must Be Referenced
Dieser Test sucht nach Variablen, die nicht in der Vorlage oder nicht in einem gültigen Ausdruck verwendet werden. Löschen Sie alle Variablen, die definiert sind, aber nicht verwendet werden, um Ihre Vorlage übersichtlicher zu machen.
Auf Variablen, die das copy
-Element zum Iterieren von Werten verwenden, muss verwiesen werden. Weitere Informationen finden Sie unter Variableniteration in ARM-Vorlagen.
Verwenden Sie in Bicep Linter-Regel – keine nicht verwendeten Variablen.
Das folgende Beispiel besteht den Test nicht, weil auf die Variable, die das copy
-Element verwendet, nicht verwiesen wird.
{
"$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": {}
}
Das folgende Beispiel besteht den Test nicht, weil in dem Ausdruck, der auf eine Variable verweist, die führende eckige Klammer ([
) fehlt.
"outputs": {
"outputVariable": {
"type": "string",
"value": " variables('varExample')]"
}
}
Das folgende Beispiel besteht den Test, weil in outputs
auf die Variable verwiesen wird.
{
"$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')]"
}
}
}
Das folgende Beispiel besteht den Test, weil der Ausdruck gültig ist.
"outputs": {
"outputVariable": {
"type": "string",
"value": "[variables('varExample')]"
}
}
Keine Verwendung der concat-Funktion für dynamische Variablen
Testname: Dynamic Variable References Should Not Use Concat
Manchmal müssen Sie eine Variable dynamisch auf Grundlage des Werts einer anderen Variablen oder eines anderen Parameters erstellen. Verwenden Sie beim Festlegen des Werts nicht die concat-Funktion. Verwenden Sie stattdessen ein Objekt, das die verfügbaren Optionen enthält, und rufen Sie während der Bereitstellung dynamisch eine der Eigenschaften aus dem Objekt ab.
Das folgende Beispiel besteht den Test. Die Variable currentImage
wird während der Bereitstellung dynamisch festgelegt.
{
"$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')]"
}
}
}
Verwendung einer aktuellen API-Version
Testname: apiVersions Should Be Recent
Für jede Ressource muss eine aktuelle API-Version verwendet werden, die als Zeichenfolge hartcodiert ist. Der Test wertet die API-Version in Ihrer Vorlage anhand der Versionen des Ressourcenanbieters im Cache des Toolkits aus. Eine API-Version, die ab dem Datum der Testausführung weniger als zwei Jahre alt ist, gilt als aktuell. Verwenden Sie keine Vorschauversion, wenn eine neuere Version verfügbar ist.
Eine Warnung, dass keine API-Version gefunden wurde, zeigt nur an, dass die Version nicht im Cache des Toolkits enthalten ist. Wenn Sie die neueste Version einer API verwenden, was empfohlen wird, kann dies eine Warnung generieren.
Weitere Informationen zum Toolkitcache.
Verwenden Sie in Bicep Linter-Regel – Aktuelle API-Versionen verwenden.
Das folgende Beispiel besteht den Test nicht, weil die API-Version älter als zwei Jahre ist.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2019-06-01",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Das folgende Beispiel besteht den Test nicht, weil eine Vorschauversion verwendet wird, obwohl eine neuere Version verfügbar ist.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2020-08-01-preview",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Das folgende Beispiel besteht den Test, weil es sich um eine neue Version handelt, die keine Vorschauversion ist.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Verwenden einer hartcodierten API-Version
Testname: Providers apiVersions Is Not Permitted
Die API-Version für einen Ressourcentyp bestimmt, welche Eigenschaften verfügbar sind. Stellen Sie in Ihrer Vorlage eine hartcodierte API-Version bereit. Rufen Sie keine API-Version ab, die während der Bereitstellung bestimmt wird, da Sie dann nicht wissen, welche Eigenschaften verfügbar sind.
Das folgende Beispiel besteht den Test nicht.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "[providers('Microsoft.Compute', 'virtualMachines').apiVersions[0]]",
...
}
]
Das folgende Beispiel besteht den Test.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
...
}
]
Keine leeren Eigenschaften
Testname: Template Should Not Contain Blanks
Eigenschaften dürfen nicht auf einen leeren Wert hartcodiert werden. Leere Werte sind NULL sowie leere Zeichenfolgen, Objekte oder Arrays. Wenn eine Eigenschaft auf einen leeren Wert festgelegt wird, entfernen Sie diese Eigenschaft aus der Vorlage. Sie können eine Eigenschaft während der Bereitstellung auf einen leeren Wert festlegen, z. B. über einen Parameter.
Die template
-Eigenschaft in einer geschachtelten Vorlage kann leere Eigenschaften enthalten. Weitere Informationen zu geschachtelten Vorlagen finden Sie unter Microsoft.Resources deployments.
Das folgende Beispiel besteht den Test nicht, weil leere Eigenschaften vorhanden sind.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-01-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"sku": {},
"kind": ""
}
]
Das folgende Beispiel besteht den Test, weil die Eigenschaften Werte umfassen.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-01-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"kind": "Storage"
}
]
Verwendung von Ressourcen-ID-Funktionen
Testname: IDs Should Be Derived From ResourceIDs
Verwenden Sie eine der Ressourcen-ID-Funktionen, wenn Sie eine Ressourcen-ID angeben. Folgende Funktionen sind zulässig:
Verwenden Sie nicht die concat-Funktion, um eine Ressourcen-ID zu erstellen.
Verwenden Sie in Bicep Linter-Regel – Ressourcen-ID-Funktionen verwenden.
Das folgende Beispiel besteht den Test nicht.
"networkSecurityGroup": {
"id": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/networkSecurityGroups/', variables('networkSecurityGroupName'))]"
}
Das nächste Beispiel besteht den Test.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Korrekte Parameter für die resourceId-Funktion
Testname: ResourceIds should not contain
Verwenden Sie keine unnötigen Funktionen für optionale Parameter, wenn Sie Ressourcen-IDs generieren. Die resourceId-Funktion verwendet standardmäßig das aktuelle Abonnement und die aktuelle Ressourcengruppe. Sie müssen diese Werte nicht angeben.
Im folgenden Beispiel wird der Test nicht bestanden, weil Sie die aktuelle Abonnement-ID und den aktuellen Ressourcengruppennamen nicht angeben müssen.
"networkSecurityGroup": {
"id": "[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Das nächste Beispiel besteht den Test.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Dieser Test gilt für Folgendes:
Bei reference
und list*
ist der Test nicht erfolgreich, wenn Sie concat
zum Erstellen der Ressourcen-ID verwenden.
dependsOn best practices
Testname: DependsOn Best Practices
Verwenden Sie beim Festlegen der Bereitstellungsabhängigkeiten nicht die if-Funktion, um eine Bedingung zu testen. Wenn eine Ressource von einer Ressource abhängig ist, die bedingt bereitgestellt wird, legen Sie die Abhängigkeit wie bei jeder beliebigen Ressource fest. Wenn eine bedingte Ressource nicht bereitgestellt wurde, entfernt Azure Resource Manager sie automatisch aus den erforderlichen Abhängigkeiten.
Das dependsOn
-Element kann nicht mit einer concat-Funktion beginnen.
Verwenden Sie in Bicep Linter-Regel – Keine unnötigen dependsOn-Einträge.
Das folgende Beispiel besteht den Test nicht, weil es eine if
-Funktion enthält.
"dependsOn": [
"[if(equals(parameters('newOrExisting'),'new'), variables('storageAccountName'), '')]"
]
Das folgende Beispiel besteht den Test nicht, weil es mit concat
beginnt.
"dependsOn": [
"[concat(variables('storageAccountName'))]"
]
Das folgende Beispiel besteht den Test.
"dependsOn": [
"[variables('storageAccountName')]"
]
Keine Verwendung von „debug“ für geschachtelte oder verknüpfte Bereitstellungen
Testname: Deployment Resources Must Not Be Debug
Wenn Sie eine geschachtelte oder verknüpfte Vorlage mit dem Ressourcentyp Microsoft.Resources/deployments
definieren, können Sie das Debuggen aktivieren. Debuggen wird verwendet, wenn Sie eine Vorlage testen müssen, aber vertrauliche Informationen verfügbar machen können. Bevor die Vorlage in der Produktion verwendet wird, deaktivieren Sie das Debuggen. Sie können das debugSetting
-Objekt entfernen oder die detailLevel
-Eigenschaft auf none
ändern.
Das folgende Beispiel besteht den Test nicht.
"debugSetting": {
"detailLevel": "requestContent"
}
Das folgende Beispiel besteht den Test.
"debugSetting": {
"detailLevel": "none"
}
Keine Literalwerte für Administratorbenutzernamen
Testname: adminUsername Should Not Be A Literal
Verwenden Sie beim Festlegen eines adminUserName
keinen Literalwert. Erstellen Sie einen Parameter für den Benutzernamen, und verwenden Sie einen Ausdruck, um auf den Wert des Parameters zu verweisen.
Verwenden Sie in Bicep Linter-Regel – Administratorbenutzername darf nicht literal sein.
Das folgende Beispiel besteht den Test nicht wegen eines Literalwerts.
"osProfile": {
"adminUserName": "myAdmin"
}
Das folgende Beispiel besteht den Test wegen eines Ausdrucks.
"osProfile": {
"adminUsername": "[parameters('adminUsername')]"
}
Verwendung des aktuellen VM-Images
Testname: VM Images Should Use Latest Version
Dieser Test ist deaktiviert, aber die Ausgabe zeigt, dass er bestanden wurde. Die bewährte Methode besteht darin, Ihre Vorlage auf die folgenden Kriterien zu überprüfen:
Wenn Ihre Vorlage eine VM mit einem Image enthält, müssen Sie sicherstellen, dass es sich um die aktuelle Imageversion handelt.
Verwenden Sie in Bicep Linter-Regel – Stabiles VM-Image verwenden.
Verwendung stabiler VM-Images
Testname: Virtual Machines Should Not Be Preview
Für VMs sollten keine Vorschauimages verwendet werden. Der Test Überprüft das storageProfile
, um zu verifizieren, dass die imageReference
keine Zeichenfolge verwendet, die preview (Vorschau) enthält. Und dass preview (Vorschau) nicht in den imageReference
-Eigenschaften offer
, sku
oder version
verwendet wird.
Weitere Informationen zur imageReference
-Eigenschaft finden Sie unter Microsoft.Compute virtualMachines und Microsoft.Compute virtualMachineScaleSets.
Verwenden Sie in Bicep Linter-Regel – Stabiles VM-Image verwenden.
Das folgende Beispiel besteht den Test nicht, weil imageReference
eine Zeichenfolge ist, die preview enthält.
"properties": {
"storageProfile": {
"imageReference": "latest-preview"
}
}
Das folgende Beispiel besteht den Test nicht, wenn preview in offer
, sku
oder version
verwendet wird.
"properties": {
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer_preview",
"sku": "16.04-LTS-preview",
"version": "preview"
}
}
}
Das folgende Beispiel besteht den Test.
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "16.04-LTS",
"version": "latest"
}
}
Keine Verwendung der ManagedIdentity-Erweiterung
Testname: ManagedIdentityExtension must not be used
Wenden Sie die ManagedIdentity
-Erweiterung nicht auf eine VM an. Die Erweiterung wurde 2019 eingestellt und sollte nicht mehr verwendet werden.
Keine Geheimnisse in Ausgaben
Testname: Outputs Must Not Contain Secrets
Fügen Sie dem Abschnitt outputs
keine Werte hinzu, durch die möglicherweise Geheimnisse offengelegt werden. Zum Beispiel sichere Parameter vom Typ secureString
oder secureObject
bzw. list*-Funktionen wie listKeys
.
Die Ausgabe einer Vorlage wird im Bereitstellungsverlauf gespeichert. Die Informationen können daher von einem böswilligen Benutzer gefunden werden.
Verwenden Sie in Bicep Linter-Regel – Ausgaben dürfen keine Geheimnisse enthalten.
Im folgenden Beispiel wir der Test nicht bestanden, weil ein Ausgabewert einen sicheren Parameter enthält.
{
"$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'))]"
}
}
}
Im folgenden Beispiel ist der Test nicht erfolgreich, weil eine list*-Funktion in den Ausgaben verwendet wird.
{
"$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')]"
}
}
}
Verwenden von „protectedSettings“ für „commandToExecute“-Geheimnisse
Testname: „CommandToExecute“ muss „ProtectedSettings“ für Geheimnisse verwenden
Verwenden Sie für Ressourcen vom Typ CustomScript
die verschlüsselten protectedSettings
, wenn commandToExecute
Geheimnisdaten wie z. B. ein Kennwort enthält. Beispielsweise können Geheimnisdaten in sicheren Parametern des Typs secureString
oder secureObject
, in list*-Funktionen wie listKeys
oder in benutzerdefinierten Skripts verwendet werden.
Verwenden Sie keine Geheimnisdaten im settings
-Objekt, da dieses Klartext verwendet. Weitere Informationen finden Sie unter Microsoft.Compute virtualMachines/extensions, Windows oder Linux.
Verwenden Sie in Bicep Linter-Regel – „protectedSettings“ für commandToExecute-Geheimnisse verwenden.
Das folgende Beispiel besteht den Test nicht, weil der settings
in einem sicheren Parameter commandToExecute
verwendet.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Das folgende Beispiel besteht den Test nicht, weil settings
commandToExecute
mit einer listKeys
-Funktion verwendet.
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
}
}
Das folgende Beispiel besteht den Test, weil protectedSettings
commandToExecute
mit einem sicheren Parameter verwendet.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"protectedSettings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Das folgende Beispiel besteht den Test, weil protectedSettings
commandToExecute
mit einer listKeys
-Funktion verwendet.
"properties": {
"type": "CustomScript",
"protectedSettings": {
"commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
}
}
Verwenden aktueller API-Versionen in Referenzfunktionen
Testname: apiVersions Should Be Recent in Reference Functions (apiVersions sollten aktuell in Referenzfunktionen sein)
Die API-Version, die in einer reference-Funktion verwendet wird, muss aktuell sein und darf keine Vorschauversion sein. Der Test wertet die API-Version in Ihrer Vorlage anhand der Versionen des Ressourcenanbieters im Cache des Toolkits aus. Eine API-Version, die ab dem Datum der Testausführung weniger als zwei Jahre alt ist, gilt als aktuell.
Eine Warnung, dass keine API-Version gefunden wurde, zeigt nur an, dass die Version nicht im Cache des Toolkits enthalten ist. Wenn Sie die neueste Version einer API verwenden, was empfohlen wird, kann dies eine Warnung generieren.
Weitere Informationen zum Toolkitcache.
Das folgende Beispiel besteht den Test nicht, weil die API-Version älter als zwei Jahre ist.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01')]"
}
}
Das folgende Beispiel besteht den Test nicht, weil die API-Version eine Vorschauversion ist.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2020-08-01-preview')]"
}
}
Das folgende Beispiel besteht den Test, weil die API-Version weniger als zwei Jahre alt und keine Vorschauversion ist.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-02-01')]"
}
}
Verwenden von Typ und Name in resourceId-Funktionen
Testname: Resources Should Not Be Ambiguous (Ressourcen sollten nicht mehrdeutig sein)
Dieser Test ist deaktiviert, aber die Ausgabe zeigt, dass er bestanden wurde. Die bewährte Methode besteht darin, Ihre Vorlage auf die folgenden Kriterien zu überprüfen:
Eine resourceId muss einen Ressourcentyp und einen Ressourcennamen enthalten. Dieser Test sucht alle resourceId
-Funktionen der Vorlage und überprüft, ob die Ressource in der Vorlage mit der richtigen Syntax verwendet wird. Andernfalls gilt die Funktion als mehrdeutig.
Beispielsweise gilt eine resourceId
-Funktion als mehrdeutig:
- Wenn keine Ressource in der Vorlage gefunden wird und keine Ressourcengruppe angegeben ist.
- Wenn eine Ressource eine Bedingung enthält und keine Ressourcengruppe angegeben ist.
- Wenn eine verwandte Ressource einige, aber nicht alle Namenssegmente enthält. Eine untergeordnete Ressource enthält beispielsweise mehr als ein Namenssegment. Weitere Informationen finden Sie unter resourceId Hinweise.
Verwenden des inneren Bereichs für sichere Parameter bei geschachtelter Bereitstellung
Testname: Secure Params In Nested Deployments (Sichere Parameter in geschachtelten Bereitstellungen)
Verwenden Sie das Objekt expressionEvaluationOptions
der geschachtelten Vorlage mit dem Bereich inner
, um Ausdrücke auszuwerten, die sichere Parameter vom Typ secureString
oder secureObject
bzw. list*-Funktionen wie listKeys
enthalten. Wenn der Bereich outer
verwendet wird, werden Ausdrücke im Bereich der übergeordneten Vorlage als Klartext ausgewertet. Der sichere Wert ist dann für alle Benutzer sichtbar, die Zugriff auf den Bereitstellungsverlauf haben. Der Standardwert von expressionEvaluationOptions
ist outer
.
Weitere Informationen zu geschachtelten Vorlagen finden Sie unter Microsoft.Resources deployments und Auswertungsbereich von Ausdrücken in geschachtelten Vorlagen.
Verwenden Sie in Bicep Linter-Regel – Sichere Parameter in geschachtelter Bereitstellung.
Das folgende Beispiel besteht den Test nicht, weil expressionEvaluationOptions
den Bereich outer
zum Auswerten sicherer Parameter oder list*
-Funktionen verwendet.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate",
"properties": {
"expressionEvaluationOptions": {
"scope": "outer"
}
}
}
]
Das folgende Beispiel besteht den Test, weil expressionEvaluationOptions
den Bereich inner
zum Auswerten sicherer Parameter oder von list*
-Funktionen verwendet.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
}
}
}
]
Nächste Schritte
- Weitere Informationen zum Ausführen des Testtoolkits finden Sie unter Verwenden des Resource Manager-Vorlagen-Testtoolkits.
- Ein Lernmodul, das die Verwendung des Test-Toolkits abdeckt, finden Sie unter Vorschau auf Änderungen und Validierung von Azure-Ressourcen mithilfe von Was-wäre-wenn und dem Test-Toolkit für ARM-Vorlagen.
- Informationen zum Testen von Parameterdateien finden Sie unter Testfälle für Parameterdateien.
- Unter Testfälle für „createUiDefinition.json“ finden Sie createUiDefinition-Tests.
- Informationen zu Tests für alle Dateien finden Sie unter Testfälle für alle Dateien.