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 Typ string 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 Typ secureString 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 settingscommandToExecute 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 protectedSettingscommandToExecute mit einem sicheren Parameter verwendet.

"parameters": {
  "adminPassword": {
    "type": "secureString"
  }
}
...
"properties": {
  "type": "CustomScript",
  "protectedSettings": {
    "commandToExecute": "[parameters('adminPassword')]"
  }
}

Das folgende Beispiel besteht den Test, weil protectedSettingscommandToExecute 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