Sdílet prostřednictvím


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ý.
  • _artifactsLocationmusí 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 .
  • _artifactsLocationSasTokenmusí 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í adminUserNamenepouží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, skunebo 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, skunebo 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 listKeysje .

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 CustomScriptpouž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 listKeysjsou , 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 secureObjectlist* , jako listKeysje . 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