Sdílet prostřednictvím


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 maxValuezadá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 _artifactsLocationSasTokenpouž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ý.
  • _artifactsLocationmusí 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.
  • _artifactsLocationSasTokenmusí 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á concatna .

"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í adminUserNamehodnoty 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, 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í náhledu v offer, skunebo 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 secureObjectfunkce 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 CustomScriptpouž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 secureObjectfunkcích list*, jako listKeysjsou 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 listKeysjsou . 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.

Další informace ovch

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