Testovací případy pro šablony ARM
Tento článek popisuje testy, které se spouštějí pomocí testovací sady nástrojů šablon pro šablony Azure Resource Manageru (šablony ARM). Poskytuje příklady, které test projdou nebo selžou , a obsahuje název každého testu. Další informace o tom, jak spustit testy nebo jak spustit konkrétní test, naleznete v tématu Parametry testu.
Použít správné schéma
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 zobrazí 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á pomocí platného schématu.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
}
Vlastnost šablony schema
musí být nastavená 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
Deklarované parametry musí být použity.
Název testu: Parametry musí být odkazovány
Tento test vyhledá parametry, které se nepoužívají v šabloně nebo parametrech, které se nepoužívají v platném výrazu.
Abyste snížili nejasnost 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 nepotřebné hodnoty.
V Bicep použijte pravidlo Linter – žádné nepoužívané parametry.
Následující příklad selže , protože výraz, který odkazuje na parametr, chybí úvodní hranatá závorka ([
).
"resources": [
{
"location": " parameters('location')]"
}
]
Následující příklad předá , protože výraz je platný.
"resources": [
{
"location": "[parameters('location')]"
}
]
Zabezpečené parametry nemůžou mít pevně zakódované výchozí
Název testu: Parametry zabezpečeného řetězce nemůžou mít výchozí
Nezadávejte pevně zakódovanou výchozí hodnotu pro zabezpečený parametr 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
parametry, 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, bude tato hodnota zjistitelná kýmkoli, kdo má přístup k šabloně nebo historii nasazení.
V Bicep použijte pravidlo Linter – výchozí zabezpečený parametr.
Následující příklad selže.
"parameters": {
"adminPassword": {
"defaultValue": "HardcodedPassword",
"type": "secureString"
}
}
Následující příklad se předá.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
Následující příklad předá , protože newGuid
se používá funkce.
"parameters": {
"secureParameter": {
"type": "secureString",
"defaultValue": "[newGuid()]"
}
}
Adresy URL prostředí nemůžou být pevně zakódované.
Název testu: DeploymentTemplate nesmí obsahovat pevně zakódovaný identifikátor URI.
V šabloně nezakódujte pevně kódované adresy URL prostředí. Místo toho použijte funkci prostředí k dynamickému získání těchto adres URL během nasazování. Seznam blokovaných hostitelů URL najdete v testovacím případu.
V Bicep použijte pravidlo Linter – bez pevně zakódované adresy 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 concatem nebo identifikátorem URI.
"variables":{
"AzureSchemaURL1": "[concat('https://','gallery.azure.com')]",
"AzureSchemaURL2": "[uri('gallery.azure.com','test')]"
}
Následující příklad předá.
"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, měly by šablony mít parametr s názvem location
typu nastaveným na string
. V hlavní šabloně azuredeploy.json nebo mainTemplate.json může tento parametr výchozí umístění skupiny prostředků. V propojených nebo vnořených šablonách by parametr umístění neměl mít výchozí umístění.
Uživatelé šablon mohou mít omezený přístup k oblastem, kde mohou vytvářet prostředky. Pevně zakódované umístění prostředků může uživatelům blokovat vytváření prostředku. Výraz "[resourceGroup().location]"
může blokovat uživatele, pokud byla skupina prostředků vytvořená v oblasti, ke které uživatel nemá přístup. Uživatelé, kteří jsou blokovaní, nemůžou šablonu používat.
Poskytnutí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 Bicep 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á location
parametr, ale selže , protože parametr je ve výchozím nastavení 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ý ve výchozím nastavení odpovídá umístění skupiny prostředků, ale umožňuje 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. Pokud se používá jako propojená šablona, 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 nastaveno na výraz šablony nebo global
. Výraz šablony obvykle používá location
parametr popsaný v umístění.
V Bicep použijte pravidlo Linter – žádná pevně zakódovaná umístění.
Následující příklad selže, protože location
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 předá , 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é předá , 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 hardwareProfile
pevně objekt vmSize
. Test selže, pokud hardwareProfile
je vynechán nebo obsahuje pevně zakódovanou hodnotu. Zadejte parametr, aby uživatelé vaší šablony mohli upravit velikost nasazeného virtuálního počítače. Další informace naleznete v tématu Microsoft.Compute virtualMachines.
Následující příklad selže , protože hardwareProfile
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 předá, když parametr určuje hodnotu provmSize
:
"parameters": {
"vmSizeParameter": {
"type": "string",
"defaultValue": "Standard_D2_v3",
"metadata": {
"description": "Size for the virtual machine."
}
}
}
hardwareProfile
Potom pomocí výrazu odkazuje vmSize
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
zadáte je jako čísla. Musíte použít minValue
pár maxValue
nebo test selže.
Následující příklad selže , protože minValue
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 artefaktů
Pokud zahrnete parametry a _artifactsLocation
_artifactsLocationSasToken
použijete správné výchozí hodnoty a typy. Aby bylo možné absolvovat tento test, 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 hlavní šabloně výchozí hodnotu._artifactsLocation
V vnořené šabloně nemůže být výchozí hodnota._artifactsLocation
musí mít adresu"[deployment().properties.templateLink.uri]"
URL nezpracovaného úložiště pro výchozí hodnotu._artifactsLocationSasToken
musí být .secureString
_artifactsLocationSasToken
může mít prázdný řetězec pouze pro výchozí hodnotu._artifactsLocationSasToken
V vnořené šabloně nemůže být výchozí hodnota.
V Bicep použijte pravidlo Linter – parametry artefaktů.
Deklarované proměnné musí být použity.
Název testu: Proměnné musí být odkazovány
Tento test najde proměnné, které se v šabloně nepoužívají nebo se nepoužívají v platném výrazu. Pokud chcete v šabloně zmást, odstraňte všechny proměnné, které jsou definované, ale nepoužívají se.
Proměnné, které používají copy
prvek k iteraci hodnot, musí být odkazovány. Další informace najdete v tématu Iterace proměnných v šablonách ARM.
V 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
prvek, 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 předá , protože výraz je platný.
"outputs": {
"outputVariable": {
"type": "string",
"value": "[variables('varExample')]"
}
}
Dynamická proměnná by neměla používat zřetězení
Název testu: Odkazy na dynamické proměnné by neměly používat concat
Někdy potřebujete 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íská jednu z vlastností z objektu během nasazení.
Následující příklad předá. Proměnná currentImage
se během nasazování dynamicky nastavuje.
{
"$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 by měl být nedávný
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ě proti verzím 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 nedávnou. Pokud je k dispozici novější verze, nepoužívejte verzi Preview.
Upozornění, že verze rozhraní API nebyla nalezena, znamená to, že verze není součástí mezipaměti sady nástrojů. Pomocí 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ů.
V Bicep 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 verze Preview se používá, když je k dispozici novější verze.
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2020-08-01-preview",
"name": "storageaccount1",
"location": "[parameters('location')]"
}
]
Následující příklad se předá , protože se jedná o nejnovější verzi, která není verzí 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. Do šablony zadejte pevně zakódovanou verzi rozhraní API. Nenačítejte verzi rozhraní API určenou během nasazování, protože nevíte, 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 předá.
"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.
Vlastnosti pevně nezakódujte na prázdnou hodnotu. Prázdné hodnoty zahrnují hodnoty null a prázdné řetězce, objekty nebo pole. Pokud je vlastnost nastavena na prázdnou hodnotu, odeberte tuto vlastnost ze šablony. Vlastnost můžete nastavit na prázdnou hodnotu během nasazení, například prostřednictvím parametru.
Vlastnost template
v 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 jsou 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 zahrnují 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 měla být odvozena 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 Bicep 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ásledující příklad se předá.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Funkce ResourceId má správné parametry.
Název testu: ResourceIds by neměly obsahovat
Při generování ID prostředků nepoužívejte pro volitelné parametry nepotřebné funkce. Ve výchozím nastavení funkce resourceId 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 aktuální ID předplatného a název skupiny prostředků.
"networkSecurityGroup": {
"id": "[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Následující příklad se předá.
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}
Tento test platí pro:
Pro reference
a list*
, test selže , když použijete concat
k vytvoření ID prostředku.
osvědčené postupy pro dependsOn
Název testu: Doporučené postupy pro závislé
Při nastavování závislostí nasazení nepoužívejte funkci if k otestování podmínky. 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 není podmíněný prostředek nasazený, Azure Resource Manager ho automaticky odebere z požadovaných závislostí.
Prvek dependsOn
nemůže začínat funkcí concat .
V Bicep použijte pravidlo Linter – žádné nepotřebné položky dependsOn.
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á concat
na .
"dependsOn": [
"[concat(variables('storageAccountName'))]"
]
Následující příklad předá.
"dependsOn": [
"[variables('storageAccountName')]"
]
Vnořená nebo propojená nasazení nemůžou používat ladění
Název testu: Prostředky nasazení nesmí být laděné.
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ůže vystavit 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 předá.
"debugSetting": {
"detailLevel": "none"
}
Uživatelská jména správců nemůžou být literální hodnotou.
Název testu: adminUsername by neměl být literál.
Při nastavování adminUserName
hodnoty literálu nepoužívejte. Vytvořte parametr pro uživatelské jméno a použijte výraz pro odkaz na hodnotu parametru.
V Bicep 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á výraz.
"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 proběhl úspěšně. Osvědčeným postupem je zkontrolovat šablonu s následujícími kritérii:
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: Virtuální počítače by neměly být ve verzi Preview.
Virtuální počítače by neměly používat image ve verzi Preview. Test zkontroluje storageProfile
, jestli imageReference
nepoužívá řetězec, který obsahuje náhled. A tato verze Preview 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í náhledu 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 předá.
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "16.04-LTS",
"version": "latest"
}
}
Nepoužívat rozšíření ManagedIdentity
Název testu: ManagedIdentityExtension se nesmí používat.
Nepoužádejte ManagedIdentity
rozšíření na virtuální počítač. Rozšíření bylo v roce 2019 zastaralé 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.
Nezahrnujte do oddílu outputs
žádné hodnoty, které by potenciálně zpřístupnily tajné kódy. Například zabezpečené parametry typu secureString
nebo secureObject
funkce seznamu* jako .listKeys
Výstup ze šablony je uložený v historii nasazení, takže by tento údaj mohl najít uživatel se zlými úmysly.
V Bicep použijte pravidlo Linter – výstupy by neměly obsahovat tajné kódy.
Následující příklad selže , protože obsahuje zabezpečený parametr ve výstupní hodnotě.
{
"$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 šifrovaná protectedSettings
data, pokud commandToExecute
obsahuje tajná data, jako je heslo. Tajná data lze například použít v zabezpečených parametrech typu secureString
nebo secureObject
funkcích list*, jako listKeys
jsou nebo vlastní skripty.
Nepoužívejte v objektu settings
tajná data, protože používají prostý text. Další informace najdete v tématu Microsoft.Compute virtualMachines/extensions, Windows nebo Linux.
V Bicep použijte pravidlo Linter – použijte protectedSettings pro tajné kódy commandToExecute.
Následující příklad selže , protože settings
používá commandToExecute
se zabezpečeným parametrem.
"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
se zabezpečeným parametrem.
"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: Funkce 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 nedávná a nikoli verze Preview. Test vyhodnotí verzi rozhraní API ve vaší šabloně proti verzím 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 nedávnou.
Upozornění, že verze rozhraní API nebyla nalezena, znamená to, že verze není součástí mezipaměti sady nástrojů. Pomocí 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 předá , protože verze rozhraní API je starší než dva roky a není verzí 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 proběhl úspěšně. Osvědčeným postupem je zkontrolovat šablonu s následujícími kritérii:
Id prostředku musí obsahovat typ prostředku a název prostředku. Tento test najde 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ě se funkce považuje za nejednoznačný.
Funkce se například resourceId
považuje za nejednoznačné:
- Pokud se prostředek v šabloně nenajde a skupina prostředků není zadaná.
- Pokud prostředek obsahuje podmínku a není zadaná skupina prostředků.
- Pokud související prostředek obsahuje některé, ale ne všechny segmenty názvů. Podřízený prostředek například obsahuje více než jeden segment názvů. Další informace najdete v poznámkách resourceId.
Použití vnitřního oboru pro vnořené parametry zabezpečení nasazení
Název testu: Zabezpečení parametrů ve vnořených nasazeních
Objekt vnořené šablony expressionEvaluationOptions
s oborem inner
slouží k vyhodnocení výrazů, které obsahují zabezpečené parametry typu secureString
nebo secureObject
seznamu* funkcí, jako listKeys
jsou . outer
Pokud se obor použije, výrazy se vyhodnocují ve formátu prostého textu v rámci oboru nadřazené šablony. Zabezpečená hodnota se pak zobrazí komukoli, kdo má přístup k historii nasazení. Výchozí hodnota atributu expressionEvaluationOptions
je outer
.
V Bicep použijte pravidlo Linter – zabezpečené parametry v 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
- Další 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ý popisuje použití testovací sady nástrojů, najdete v tématu Preview změny a ověření prostředků Azure pomocí citlivostní analýza a testovací sady nástrojů pro šablony ARM.
- Chcete-li otestovat soubory parametrů, podívejte se na testovací případy pro soubory parametrů.
- Testy createUiDefinition najdete v tématu Testovací případy pro createUiDefinition.json.
- Informace o testech pro všechny soubory najdete v tématu Testovací případy pro všechny soubory.