Testovací případy pro šablony ARM
Tento článek popisuje testy, které se spouští pomocí testovací sady nástrojů šablon pro šablony Azure Resource Manager (šablony ARM). Poskytuje příklady úspěšného nebo neúspěšného testu a obsahuje název každého testu. Další informace o tom, jak spouštět testy nebo jak spustit konkrétní test, najdete v tématu Parametry testu.
Použití správného schématu
Název testu: Schéma DeploymentTemplate je správné
V šabloně musíte zadat platnou hodnotu schématu.
Následující příklad selže , protože schéma je neplatné.
{
"$schema": "https://schema.management.azure.com/schemas/2019-01-01/deploymentTemplate.json#",
}
Následující příklad zobrazuje upozornění , protože verze 2015-01-01
schématu je zastaralá a není zachována.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
}
Následující příklad předá s použitím platného schématu.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
}
Vlastnost šablony schema
musí být nastavena na jedno z následujících schémat:
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
Musí se použít deklarované parametry.
Název testu: Na parametry se musí odkazovat
Tento test vyhledá parametry, které se nepoužívají v šabloně, nebo parametry, které se nepoužívají v platném výrazu.
Pokud chcete omezit nejasnosti v šabloně, odstraňte všechny parametry, které jsou definované, ale nepoužívají se. Odstranění nepoužívaných parametrů zjednodušuje nasazení šablon, protože nemusíte zadávat zbytečné hodnoty.
V bicepu použijte pravidlo Linter – žádné nepoužívané parametry.
Následující příklad selže , protože výrazu, který odkazuje na parametr, chybí úvodní hranatá závorka ([
).
"resources": [
{
"location": " parameters('location')]"
}
]
Následující příklad projde , protože výraz je platný.
"resources": [
{
"location": "[parameters('location')]"
}
]
Zabezpečené parametry nemůžou mít pevně zakódované výchozí nastavení.
Název testu: Parametry zabezpečeného řetězce nemůžou mít výchozí
Nezadávejte pevně zakódovanou výchozí hodnotu zabezpečeného parametru v šabloně. Zabezpečený parametr může mít prázdný řetězec jako výchozí hodnotu nebo použít funkci newGuid ve výrazu.
Používáte typy secureString
nebo secureObject
u parametrů, které obsahují citlivé hodnoty, jako jsou hesla. Pokud parametr používá zabezpečený typ, hodnota parametru se nezaprotokoluje ani neukládá v historii nasazení. Tato akce zabrání uživateli se zlými úmysly zjistit citlivou hodnotu.
Když zadáte výchozí hodnotu, může ji zjistit každý, kdo má přístup k šabloně nebo historii nasazení.
V Nástroji Bicep použijte výchozí parametr Linter rule – secure.
Následující příklad selže.
"parameters": {
"adminPassword": {
"defaultValue": "HardcodedPassword",
"type": "secureString"
}
}
Následuje následující příklad.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
Následující příklad projde , protože newGuid
se používá funkce.
"parameters": {
"secureParameter": {
"type": "secureString",
"defaultValue": "[newGuid()]"
}
}
Adresy URL prostředí nelze pevně zakódovat.
Název testu: DeploymentTemplate nesmí obsahovat pevně zakódovaný identifikátor URI
V šabloně nezakódujte pevně adresy URL prostředí. Místo toho použijte funkci prostředí k dynamickému získání těchto adres URL během nasazení. Seznam blokovaných hostitelů ADRES URL najdete v testovacím případu.
V Bicepu použijte pravidlo Linter – žádná pevně zakódovaná adresa URL prostředí.
Následující příklad selže , protože adresa URL je pevně zakódovaná.
"variables":{
"AzureURL":"https://management.azure.com"
}
Test také selže při použití s concat nebo URI.
"variables":{
"AzureSchemaURL1": "[concat('https://','gallery.azure.com')]",
"AzureSchemaURL2": "[uri('gallery.azure.com','test')]"
}
Následující příklad je úspěšný.
"variables": {
"AzureSchemaURL": "[environment().gallery]"
}
Umístění používá parametr
Název testu: Umístění by nemělo být pevně zakódované
Pokud chcete nastavit umístění prostředku, šablony by měly mít parametr s názvem location
s typem nastaveným na string
. V hlavní šabloně azuredeploy.json nebo mainTemplate.json může tento parametr nastavit výchozí umístění skupiny prostředků. V propojených nebo vnořených šablonách by parametr location neměl mít výchozí umístění.
Uživatelé šablon můžou mít omezený přístup k oblastem, ve kterých můžou vytvářet prostředky. Pevně zakódované umístění prostředku může uživatelům bránit ve vytváření prostředku. Výraz "[resourceGroup().location]"
může blokovat uživatele, pokud se skupina prostředků vytvořila v oblasti, ke které uživatel nemá přístup. Blokovaní uživatelé nebudou moct šablonu použít.
Zadáním parametru location
, který je výchozím nastavením umístění skupiny prostředků, můžou uživatelé použít výchozí hodnotu, pokud je to vhodné, ale také zadat jiné umístění.
V Bicepu použijte pravidlo Linter – žádné výrazy umístění mimo výchozí hodnoty parametrů.
Následující příklad selže , protože je prostředek location
nastavený na 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"
}
}
]
}
Další příklad používá parametr, location
ale selže , protože parametr ve výchozím nastavení je pevně zakódované umístění.
{
"$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": {}
}
Následující příklad předá , když se šablona použije jako hlavní šablona. Vytvořte parametr, který nastaví výchozí umístění skupiny prostředků, ale umožní uživatelům zadat jinou hodnotu.
{
"$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": {}
}
Poznámka
Pokud se předchozí příklad použije jako propojená šablona, test selže. Při použití jako propojené šablony odeberte výchozí hodnotu.
Prostředky by měly mít umístění
Název testu: Prostředky by měly mít umístění
Umístění prostředku by mělo být nastavené na výraz šablony nebo global
. Výraz šablony obvykle používá location
parametr popsaný v tématu Location uses parameter.
V nástroji Bicep použijte pravidlo Linter – žádná pevně zakódovaná umístění.
Následující příklad selže , location
protože není výraz nebo global
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"functions": [],
"variables": {},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "westus",
"kind": "StorageV2",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
}
}
],
"outputs": {}
}
Následující příklad projde , protože prostředek location
je nastavený na 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": {}
}
Další příklad také projde , protože location
parametr používá výraz. Prostředek location
používá hodnotu výrazu.
{
"$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": {}
}
Velikost virtuálního počítače používá parametr
Název testu: Velikost virtuálního počítače by měla být parametrem
Nezakódujte pevně hardwareProfile
objekt .vmSize
Test selže, pokud hardwareProfile
je vynechán nebo obsahuje pevně zakódovanou hodnotu. Zadejte parametr, aby uživatelé šablony mohli upravit velikost nasazeného virtuálního počítače. Další informace najdete v tématu Microsoft.Compute virtualMachines.
Následující příklad selže , hardwareProfile
protože objekt vmSize
je pevně zakódovaná hodnota.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
"name": "demoVM",
"location": "[parameters('location')]",
"properties": {
"hardwareProfile": {
"vmSize": "Standard_D2_v3"
}
}
}
]
Příklad se předá , když parametr určuje hodnotu pro vmSize
:
"parameters": {
"vmSizeParameter": {
"type": "string",
"defaultValue": "Standard_D2_v3",
"metadata": {
"description": "Size for the virtual machine."
}
}
}
hardwareProfile
Potom použije výraz pro vmSize
k odkazu na hodnotu parametru:
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
"name": "demoVM",
"location": "[parameters('location')]",
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('vmSizeParameter')]"
}
}
}
]
Minimální a maximální hodnoty jsou čísla.
Název testu: Minimální a maximální hodnota jsou čísla
Když definujete parametr s minValue
a maxValue
, zadejte je jako čísla. Musíte použít minValue
a maxValue
jako pár, jinak test selže.
Následující příklad selže , protože minValue
a maxValue
jsou řetězce.
"exampleParameter": {
"type": "int",
"minValue": "0",
"maxValue": "10"
}
Následující příklad selže , protože se používá pouze minValue
.
"exampleParameter": {
"type": "int",
"minValue": 0
}
Následující příklad předá , protože minValue
a maxValue
jsou čísla.
"exampleParameter": {
"type": "int",
"minValue": 0,
"maxValue": 10
}
Správně definovaný parametr Artifacts
Název testu: parametr artifacts
Pokud zahrnete parametry pro _artifactsLocation
a _artifactsLocationSasToken
, použijte správné výchozí hodnoty a typy. Aby bylo možné tento test projít, musí být splněny následující podmínky:
- Pokud zadáte jeden parametr, musíte zadat druhý.
_artifactsLocation
musí být .string
_artifactsLocation
musí mít výchozí hodnotu v hlavní šabloně._artifactsLocation
ve vnořené šabloně nemůže mít výchozí hodnotu._artifactsLocation
Výchozí hodnota musí obsahovat adresu"[deployment().properties.templateLink.uri]"
URL nezpracovaného úložiště nebo ._artifactsLocationSasToken
musí být .secureString
_artifactsLocationSasToken
může mít pouze prázdný řetězec pro svou výchozí hodnotu._artifactsLocationSasToken
ve vnořené šabloně nemůže mít výchozí hodnotu.
V Bicepu použijte pravidlo Linter – parametry artefaktů.
Musí se použít deklarované proměnné.
Název testu: Proměnné musí být odkazovány
Tento test vyhledá proměnné, které se nepoužívají v šabloně nebo se nepoužívají v platném výrazu. Pokud chcete omezit nejasnosti v šabloně, odstraňte všechny proměnné, které jsou definované, ale nepoužívají se.
Proměnné, které používají copy
element k iteraci hodnot, musí být odkazovány. Další informace najdete v tématu Iterace proměnných v šablonách ARM.
V nástroji Bicep použijte pravidlo Linter – žádné nepoužívané proměnné.
Následující příklad selže , protože proměnná, která používá copy
element, není odkazována.
{
"$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": {}
}
Následující příklad selže , protože výraz, který odkazuje na proměnnou, chybí úvodní hranatá závorka ([
).
"outputs": {
"outputVariable": {
"type": "string",
"value": " variables('varExample')]"
}
}
Následující příklad předá, protože proměnná je odkazována v 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')]"
}
}
}
Následující příklad projde , protože výraz je platný.
"outputs": {
"outputVariable": {
"type": "string",
"value": "[variables('varExample')]"
}
}
Dynamická proměnná by neměla používat concat
Název testu: Odkazy na dynamické proměnné by neměly používat concat
Někdy je potřeba dynamicky vytvořit proměnnou na základě hodnoty jiné proměnné nebo parametru. Při nastavování hodnoty nepoužívejte funkci concat . Místo toho použijte objekt, který obsahuje dostupné možnosti, a dynamicky získejte jednu z vlastností z objektu během nasazení.
Následující příklad je úspěšný. Proměnná se currentImage
dynamicky nastavuje během nasazování.
{
"$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')]"
}
}
}
Použití nejnovější verze rozhraní API
Název testu: apiVersions should Be Recent
Verze rozhraní API pro každý prostředek by měla používat nejnovější verzi, která je pevně zakódovaná jako řetězec. Test vyhodnotí verzi rozhraní API ve vaší šabloně s verzemi poskytovatele prostředků v mezipaměti sady nástrojů. Verze rozhraní API, která je starší než dva roky od data spuštění testu, se považuje za nejnovější. Nepoužívejte verzi Preview, pokud je k dispozici novější verze.
Upozornění, že se nenašla verze rozhraní API, jenom značí, že tato verze není součástí mezipaměti sady nástrojů. Pomocí nejnovější verze rozhraní API, která se doporučuje, můžete vygenerovat upozornění.
Přečtěte si další informace o mezipaměti sady nástrojů.
V Bicepu použijte pravidlo Linter – použijte nejnovější verze rozhraní API.
Následující příklad selže , protože verze rozhraní API je starší než dva roky.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2019-06-01",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Následující příklad selže , protože pokud je k dispozici novější verze, použije se verze Preview.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2020-08-01-preview",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Následující příklad je úspěšný , protože se jedná o nedávnou verzi, která není ve verzi Preview.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-02-01",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Použití pevně zakódované verze rozhraní API
Název testu: Zprostředkovatelé apiVersions nejsou povoleny
Verze rozhraní API pro typ prostředku určuje, které vlastnosti jsou k dispozici. V šabloně zadejte pevně zakódovanou verzi rozhraní API. Nenačítejte verzi rozhraní API určenou během nasazení, protože nebudete vědět, které vlastnosti jsou k dispozici.
Následující příklad selže.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "[providers('Microsoft.Compute', 'virtualMachines').apiVersions[0]]",
...
}
]
Následující příklad je úspěšný.
"resources": [
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
...
}
]
Vlastnosti nemohou být prázdné.
Název testu: Šablona by neměla obsahovat prázdné hodnoty
Nezakódujte vlastnosti na prázdnou hodnotu. Mezi prázdné hodnoty patří řetězce s hodnotou null a prázdné řetězce, objekty nebo pole. Pokud je vlastnost nastavená na prázdnou hodnotu, odeberte ji ze šablony. Vlastnost můžete během nasazení nastavit na prázdnou hodnotu, například pomocí parametru.
Vlastnost template
ve vnořené šabloně může obsahovat prázdné vlastnosti. Další informace o vnořených šablonách najdete v tématu Nasazení Microsoft.Resources.
Následující příklad selže , protože existují prázdné vlastnosti.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-01-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"sku": {},
"kind": ""
}
]
Následující příklad předá, protože vlastnosti obsahují hodnoty.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2021-01-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"kind": "Storage"
}
]
Použití funkcí ID prostředku
Název testu: ID by se měly odvozovat z ID prostředků
Při zadávání ID prostředku použijte jednu z funkcí ID prostředku. Povolené funkce jsou:
Nepoužívejte funkci concat k vytvoření ID prostředku.
V Bicepu použijte pravidlo Linter – použijte funkce ID prostředku.
Následující příklad selže.
"networkSecurityGroup": {
"id": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/networkSecurityGroups/', variables('networkSecurityGroupName'))]"
}
Následuje následující příklad.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Funkce ResourceId má správné parametry.
Název testu: Id prostředku by neměly obsahovat
Při generování ID prostředků nepoužívejte pro volitelné parametry nepotřebné funkce. Funkce resourceId ve výchozím nastavení používá aktuální předplatné a skupinu prostředků. Tyto hodnoty nemusíte zadávat.
Následující příklad selže , protože nemusíte zadávat ID aktuálního předplatného a název skupiny prostředků.
"networkSecurityGroup": {
"id": "[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Následuje následující příklad.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Tento test se vztahuje na:
Pro reference
a list*
test selže , když použijete concat
k vytvoření ID prostředku.
dependsNa osvědčených postupech
Název testu: Závisí na osvědčených postupech
Při nastavování závislostí nasazení nepoužívejte k testování podmínky funkci if . Pokud jeden prostředek závisí na prostředku, který je podmíněně nasazený, nastavte závislost stejně jako u jakéhokoli prostředku. Pokud podmíněný prostředek není nasazený, Azure Resource Manager ho automaticky odebere z požadovaných závislostí.
Element dependsOn
nemůže začínat funkcí concat .
V nástroji Bicep použijte pravidlo Linter – žádné zbytečné závisléNa položkách.
Následující příklad selže , protože obsahuje if
funkci.
"dependsOn": [
"[if(equals(parameters('newOrExisting'),'new'), variables('storageAccountName'), '')]"
]
Následující příklad selže , protože začíná na concat
.
"dependsOn": [
"[concat(variables('storageAccountName'))]"
]
Následující příklad je úspěšný.
"dependsOn": [
"[variables('storageAccountName')]"
]
Vnořená nebo propojená nasazení nemůžou používat ladění.
Název testu: Prostředky nasazení se nesmí ladit
Když definujete vnořenou nebo propojenou šablonu s typem Microsoft.Resources/deployments
prostředku, můžete povolit ladění. Ladění se používá, když potřebujete otestovat šablonu, ale můžete zveřejnit citlivé informace. Před tím, než se šablona použije v produkčním prostředí, vypněte ladění. Objekt můžete odebrat debugSetting
nebo změnit detailLevel
vlastnost na none
.
Následující příklad selže.
"debugSetting": {
"detailLevel": "requestContent"
}
Následující příklad je úspěšný.
"debugSetting": {
"detailLevel": "none"
}
Správa uživatelská jména nemůžou být literálová hodnota
Název testu: adminUživatelské jméno by nemělo být literál
Při nastavování adminUserName
nepoužívejte hodnotu literálu. Vytvořte parametr pro uživatelské jméno a pomocí výrazu odkazujte na hodnotu parametru.
V Bicepu použijte pravidlo Linter – uživatelské jméno správce by nemělo být literál.
Následující příklad selže s hodnotou literálu.
"osProfile": {
"adminUserName": "myAdmin"
}
Následující příklad předá s výrazem.
"osProfile": {
"adminUsername": "[parameters('adminUsername')]"
}
Použití nejnovější image virtuálního počítače
Název testu: Image virtuálních počítačů by měly používat nejnovější verzi
Tento test je zakázaný, ale výstup ukazuje, že byl úspěšný. Osvědčeným postupem je v šabloně zkontrolovat následující kritéria:
Pokud vaše šablona obsahuje virtuální počítač s imagí, ujistěte se, že používá nejnovější verzi image.
V Bicep použijte pravidlo Linter – použijte stabilní image virtuálního počítače.
Použití stabilních imagí virtuálních počítačů
Název testu: Virtual Machines by nemělo být ve verzi Preview
Virtuální počítače by neměly používat image ve verzi Preview. Test zkontroluje , storageProfile
aby ověřil, že imageReference
nepoužívá řetězec, který obsahuje náhled. A tento náhled se nepoužívá ve imageReference
vlastnostech offer
, sku
nebo version
.
Další informace o imageReference
vlastnosti naleznete v tématu Microsoft.Compute virtualMachines a Microsoft.Compute virtualMachineScaleSets.
V Bicep použijte pravidlo Linter – použijte stabilní image virtuálního počítače.
Následující příklad selže , protože imageReference
je řetězec, který obsahuje náhled.
"properties": {
"storageProfile": {
"imageReference": "latest-preview"
}
}
Následující příklad selže při použití verze Preview v offer
, sku
nebo version
.
"properties": {
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer_preview",
"sku": "16.04-LTS-preview",
"version": "preview"
}
}
}
Následující příklad je úspěšný.
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "16.04-LTS",
"version": "latest"
}
}
Nepoužívat rozšíření ManagedIdentity
Název testu: ManagedIdentityExtension se nesmí použít.
Nepoužívejte rozšíření na ManagedIdentity
virtuální počítač. Rozšíření bylo zastaralé v roce 2019 a už by se nemělo používat.
Výstupy nemůžou obsahovat tajné kódy.
Název testu: Výstupy nesmí obsahovat tajné kódy
Do oddílu outputs
nezahrnujte žádné hodnoty, které by potenciálně zpřístupnily tajné kódy. Například zabezpečené parametry typu secureString
nebo secureObject
, nebo list* funkce, jako listKeys
je .
Výstup ze šablony je uložený v historii nasazení, takže uživatel se zlými úmysly může tuto informaci najít.
V nástroji Bicep použijte pravidlo Linter – výstupy by neměly obsahovat tajné kódy.
Následující příklad selže , protože obsahuje ve výstupní hodnotě parametr secure.
{
"$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'))]"
}
}
}
Následující příklad selže , protože ve výstupech používá funkci list* .
{
"$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')]"
}
}
}
Použití protectedSettings pro tajné kódy commandToExecute
Název testu: CommandToExecute musí používat ProtectedSettings pro tajné kódy.
U prostředků s typem CustomScript
použijte zašifrovaný protectedSettings
, pokud commandToExecute
obsahují tajná data, jako je heslo. Například tajná data lze použít v zabezpečených parametrech typu secureString
nebo secureObject
, list* funkcích, jako listKeys
jsou , nebo vlastní skripty.
Nepoužívejte v objektu settings
tajná data, protože používá prostý text. Další informace najdete v tématu Microsoft.Compute virtualMachines/extensions, Windows nebo Linux.
V Nástroji Bicep použijte pravidlo Linter – pro tajné kódy commandToExecute použijte protectedSettings.
Následující příklad selže , protože settings
se používá commandToExecute
s parametrem secure.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Následující příklad selže , protože settings
se používá commandToExecute
s listKeys
funkcí .
"properties": {
"type": "CustomScript",
"settings": {
"commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
}
}
Následující příklad předá , protože protectedSettings
používá commandToExecute
s parametrem secure.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"protectedSettings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Následující příklad předá , protože protectedSettings
se používá commandToExecute
s listKeys
funkcí.
"properties": {
"type": "CustomScript",
"protectedSettings": {
"commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
}
}
Použití nejnovějších verzí rozhraní API v referenčních funkcích
Název testu: apiVersions by měly být nedávné v referenčních funkcích
Verze rozhraní API použitá v referenční funkci musí být nejnovější, a ne ve verzi Preview. Test vyhodnotí verzi rozhraní API ve vaší šabloně s verzemi poskytovatele prostředků v mezipaměti sady nástrojů. Verze rozhraní API, která je starší než dva roky od data spuštění testu, se považuje za nejnovější.
Upozornění, že se nenašla verze rozhraní API, jenom indikuje, že verze není součástí mezipaměti sady nástrojů. Použití nejnovější verze rozhraní API, která se doporučuje, může vygenerovat upozornění.
Přečtěte si další informace o mezipaměti sady nástrojů.
Následující příklad selže , protože verze rozhraní API je starší než dva roky.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01')]"
}
}
Následující příklad selže , protože verze rozhraní API je verze Preview.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2020-08-01-preview')]"
}
}
Následující příklad je úspěšný , protože verze rozhraní API je starší než dva roky a nejedná se o verzi Preview.
"outputs": {
"stgAcct": {
"type": "string",
"value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-02-01')]"
}
}
Použití typu a názvu ve funkcích resourceId
Název testu: Prostředky by neměly být nejednoznačné
Tento test je zakázaný, ale výstup ukazuje, že byl úspěšný. Osvědčeným postupem je v šabloně zkontrolovat následující kritéria:
ResourceId musí obsahovat typ prostředku a název prostředku. Tento test vyhledá všechny funkce šablony resourceId
a ověří, že se prostředek používá v šabloně se správnou syntaxí. V opačném případě je funkce považována za nejednoznačný.
Například resourceId
funkce je považována za nejednoznačný:
- Když se prostředek v šabloně nenajde a nezadáte skupinu prostředků.
- Pokud prostředek obsahuje podmínku a nezadáte skupinu prostředků.
- Pokud související prostředek obsahuje některé, ale ne všechny segmenty názvů, Například podřízený prostředek obsahuje více než jeden segment názvů. Další informace najdete v poznámkách resourceId.
Použití vnitřního rozsahu pro vnořené parametry zabezpečení nasazení
Název testu: Zabezpečené parametry ve vnořených nasazeních
Pomocí objektu vnořené šablony expressionEvaluationOptions
s oborem inner
můžete vyhodnotit výrazy, které obsahují zabezpečené parametry funkcí typu secureString
nebo secureObject
list* , jako listKeys
je . Pokud se outer
použije obor, výrazy se vyhodnocují jako prostý text v rámci oboru nadřazené šablony. Zabezpečená hodnota je pak viditelná pro každého, kdo má přístup k historii nasazení. Výchozí hodnota atributu expressionEvaluationOptions
je outer
.
Další informace o vnořených šablonách najdete v tématech Nasazení Microsoft.Resources a Obor vyhodnocení výrazů ve vnořených šablonách.
V Bicep použijte pravidlo Linter – zabezpečené parametry ve vnořeném nasazení.
Následující příklad selže , protože expressionEvaluationOptions
používá outer
obor k vyhodnocení zabezpečených parametrů nebo list*
funkcí.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate",
"properties": {
"expressionEvaluationOptions": {
"scope": "outer"
}
}
}
]
Následující příklad předá, protože expressionEvaluationOptions
používá inner
obor k vyhodnocení zabezpečených parametrů nebo list*
funkcí.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
}
}
}
]
Další kroky
- Informace o spuštění testovací sady nástrojů najdete v tématu Použití testovací sady nástrojů pro šablony ARM.
- Modul Learn, který se zabývá používáním testovací sady nástrojů, najdete v tématu Změny ve verzi Preview a ověřování prostředků Azure pomocí citlivostní analýzy a testovací sady nástrojů pro šablony ARM.
- Informace o testování souborů parametrů najdete v tématu Testovací případy pro soubory parametrů.
- Testy createUiDefinition najdete v tématu Testovací případy pro createUiDefinition.json.
- Další informace o testech pro všechny soubory najdete v tématu Testovací případy pro všechny soubory.