ARM şablonları için test çalışmaları

Bu makalede, Azure Resource Manager şablonları (ARM şablonları) için şablon testi araç seti ile çalıştırılacak testler açıklanmaktadır. Testi geçen veya başarısız olan örnekler sağlar ve her testin adını içerir. Testleri çalıştırma veya belirli bir testi çalıştırma hakkında daha fazla bilgi için bkz . Test parametreleri.

Doğru şemayı kullan

Test adı: DeploymentTemplate Şeması Doğru

Şablonunuzda geçerli bir şema değeri belirtmeniz gerekir.

Şema geçersiz olduğundan aşağıdaki örnek başarısız olur .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-01-01/deploymentTemplate.json#",
}

Şema sürümü 2015-01-01 kullanım dışı olduğundan ve korunmadığından aşağıdaki örnekte bir uyarı görüntülenir.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
}

Aşağıdaki örnek geçerli bir şema kullanarak geçer .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
}

Şablonun schema özelliği aşağıdaki şemalardan birine ayarlanmalıdır:

  • 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

Bildirilen parametreler kullanılmalıdır

Test adı: Parametrelere Başvurulmalıdır

Bu test, şablonda kullanılmayan parametreleri veya geçerli bir ifadede kullanılmayan parametreleri bulur.

Şablonunuzun karışıklığını azaltmak için tanımlı ancak kullanılmayan parametreleri silin. Kullanılmayan parametrelerin ortadan kaldırılması, gereksiz değerler sağlamanız gerekmediğinden şablon dağıtımlarını basitleştirir.

Bicep'te Linter kuralını kullanın; kullanılmayan parametre yok.

Bir parametreye başvuran ifadede baştaki köşeli ayraç ()[ eksik olduğundan aşağıdaki örnek başarısız olur.

"resources": [
  {
    "location": " parameters('location')]"
  }
]

İfade geçerli olduğundan aşağıdaki örnek geçer .

"resources": [
  {
    "location": "[parameters('location')]"
  }
]

Güvenli parametreler sabit kodlanmış varsayılan değere sahip olamaz

Test adı: Güvenli Dize Parametreleri Varsayılan Değere Sahip Olamaz

Şablonunuzda güvenli bir parametre için sabit kodlanmış varsayılan değer sağlamayın. Güvenli parametre varsayılan değer olarak boş bir dizeye sahip olabilir veya ifadede newGuid işlevini kullanabilir.

Türleri veya secureObject parolalar gibi hassas değerler içeren parametrelerde kullanırsınızsecureString. Bir parametre güvenli bir tür kullandığında, parametrenin değeri günlüğe kaydedilmez veya dağıtım geçmişinde depolanmaz. Bu eylem, kötü amaçlı bir kullanıcının hassas değeri bulmasını engeller.

Varsayılan bir değer sağladığınızda, bu değer şablona veya dağıtım geçmişine erişebilen herkes tarafından bulunabilir.

Bicep'te Linter kuralı - güvenli parametre varsayılanını kullanın.

Aşağıdaki örnek başarısız olur.

"parameters": {
  "adminPassword": {
    "defaultValue": "HardcodedPassword",
    "type": "secureString"
  }
}

Sonraki örnek geçer.

"parameters": {
  "adminPassword": {
    "type": "secureString"
  }
}

İşlev kullanıldığından newGuid aşağıdaki örnek geçer.

"parameters": {
  "secureParameter": {
    "type": "secureString",
    "defaultValue": "[newGuid()]"
  }
}

Ortam URL'leri sabit kodlanamaz

Test adı: DeploymentTemplate Sabit Kodlanmış Uri İçermemelidir

Şablonunuzda ortam URL'lerini sabit kodlamayın. Bunun yerine, dağıtım sırasında bu URL'leri dinamik olarak almak için ortam işlevini kullanın. Engellenen URL konaklarının listesi için test çalışmasına bakın.

Bicep'te Linter kuralını kullanın; sabit kodlanmış ortam URL'si yok.

URL sabit kodlanmış olduğundan aşağıdaki örnek başarısız olur .

"variables":{
  "AzureURL":"https://management.azure.com"
}

Test ayrıca concat veya uri ile kullanıldığında da başarısız olur.

"variables":{
  "AzureSchemaURL1": "[concat('https://','gallery.azure.com')]",
  "AzureSchemaURL2": "[uri('gallery.azure.com','test')]"
}

Aşağıdaki örnek geçer.

"variables": {
  "AzureSchemaURL": "[environment().gallery]"
}

Konum parametresini kullanır

Test adı: Konum Sabit Kodlanmamalıdır

Kaynağın konumunu ayarlamak için şablonlarınızda türü olarak ayarlanmış stringadlı location bir parametre olmalıdır. Azuredeploy.json veya mainTemplate.json ana şablonunda bu parametre varsayılan olarak kaynak grubu konumuna gelebilir. Bağlantılı veya iç içe yerleştirilmiş şablonlarda konum parametresinin varsayılan konumu olmamalıdır.

Şablon kullanıcıları kaynak oluşturabilecekleri bölgelere sınırlı erişime sahip olabilir. Sabit kodlanmış bir kaynak konumu, kullanıcıların kaynak oluşturmalarını engelleyebilir. "[resourceGroup().location]" Kaynak grubu kullanıcının erişemediği bir bölgede oluşturulduysa ifade kullanıcıları engelleyebilir. Engellenen kullanıcılar şablonu kullanamaz.

Varsayılan olarak kaynak grubu konumuna ayarlı bir location parametre sağlayarak, kullanıcılar uygun olduğunda varsayılan değeri kullanabilir, ancak farklı bir konum da belirtebilir.

Bicep'te Linter kuralını kullanın; varsayılan parametre değerlerinin dışında konum ifadesi yoktur.

Kaynağın kaynağı olarak ayarlandığından locationresourceGroup().locationaşağıdaki örnek başarısız oluyor.

{
  "$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"
      }
    }
  ]
}

Sonraki örnekte parametre location kullanılır, ancak parametre varsayılan olarak sabit kodlanmış bir konuma ayarlı olduğundan başarısız olur .

{
  "$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": {}
}

Aşağıdaki örnek, şablon ana şablon olarak kullanıldığında geçer . Varsayılan olarak kaynak grubu konumuna ayarlayan ancak kullanıcıların farklı bir değer sağlamasına izin veren bir parametre oluşturun.

{
  "$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": {}
}

Not

Yukarıdaki örnek bağlantılı şablon olarak kullanılıyorsa, test başarısız olur. Bağlantılı şablon olarak kullanıldığında varsayılan değeri kaldırın.

Kaynakların konumu olmalıdır

Test adı: Kaynakların Konumu Olmalıdır

Kaynağın konumu bir şablon ifadesi veya globalolarak ayarlanmalıdır. Şablon ifadesi genellikle Konum parametresini kullanır bölümünde açıklanan parametreyi kullanırlocation.

Bicep'te Linter kuralını kullanın; sabit kodlanmış konum yok.

aşağıdaki örnek bir veya ifadesi globalolmadığından başarısız oluyorlocation.

{
  "$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": {}
}

Kaynak olarak ayarlandığından locationglobalaşağıdaki örnek geçer.

{
  "$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": {}
}

Parametre bir ifade kullandığından location sonraki örnek de geçer. Kaynak location , ifadenin değerini kullanır.

{
  "$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": {}
}

VM boyutu parametresini kullanır

Test adı: VM boyutu bir parametre olmalıdır

Nesnesinin hardwareProfilevmSizeöğesini sabit kodlamayın. atlandığında veya sabit kodlanmış bir değer içerdiğinde hardwareProfile test başarısız olur. Şablonunuzun kullanıcılarının dağıtılan sanal makinenin boyutunu değiştirebilmesi için bir parametre sağlayın. Daha fazla bilgi için bkz. Microsoft.Compute virtualMachines.

Nesnenin hardwareProfilevmSize sabit kodlanmış değeri olduğundan aşağıdaki örnek başarısız olur.

"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-12-01",
    "name": "demoVM",
    "location": "[parameters('location')]",
    "properties": {
      "hardwareProfile": {
        "vmSize": "Standard_D2_v3"
      }
    }
  }
]

Bir parametre için vmSizebir değer belirttiğinde örnek geçer:

"parameters": {
  "vmSizeParameter": {
    "type": "string",
    "defaultValue": "Standard_D2_v3",
    "metadata": {
      "description": "Size for the virtual machine."
    }
  }
}

Ardından parametresinin hardwareProfile değerine başvurmak için için vmSize bir ifade kullanır:

"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-12-01",
    "name": "demoVM",
    "location": "[parameters('location')]",
    "properties": {
      "hardwareProfile": {
        "vmSize": "[parameters('vmSizeParameter')]"
      }
    }
  }
]

En küçük ve en büyük değerler sayıdır

Test adı: En küçük ve en büyük değer sayıdır

ve maxValueile minValue bir parametre tanımladığınızda, bunları sayı olarak belirtin. ve maxValue öğesini bir çift olarak kullanmanız minValue gerekir, aksi zaman test başarısız olur.

Aşağıdaki örnek başarısız olur çünkü minValue ve maxValue dizelerdir.

"exampleParameter": {
  "type": "int",
  "minValue": "0",
  "maxValue": "10"
}

Aşağıdaki örnek yalnızca minValue kullanıldığından başarısız olur.

"exampleParameter": {
  "type": "int",
  "minValue": 0
}

Aşağıdaki örnek, ve maxValue sayı olduğundan minValuegeçer.

"exampleParameter": {
  "type": "int",
  "minValue": 0,
  "maxValue": 10
}

Yapıt parametresi doğru şekilde tanımlanmış

Test adı: artifacts parametresi

ve _artifactsLocationSasTokenparametrelerini _artifactsLocation eklediğinizde, doğru varsayılanları ve türleri kullanın. Bu testi geçmek için aşağıdaki koşulların karşılanması gerekir:

  • Bir parametre sağlarsanız, diğerini sağlamanız gerekir.
  • _artifactsLocation bir stringolmalıdır.
  • _artifactsLocation ana şablonda varsayılan bir değere sahip olmalıdır.
  • _artifactsLocation iç içe yerleştirilmiş bir şablonda varsayılan değer olamaz.
  • _artifactsLocation varsayılan değeri için veya "[deployment().properties.templateLink.uri]" ham depo URL'sine sahip olmalıdır.
  • _artifactsLocationSasToken bir secureStringolmalıdır.
  • _artifactsLocationSasToken yalnızca varsayılan değeri için boş bir dizeye sahip olabilir.
  • _artifactsLocationSasToken iç içe yerleştirilmiş bir şablonda varsayılan değer olamaz.

Bicep'te Linter kuralı - yapıt parametrelerini kullanın.

Bildirilen değişkenler kullanılmalıdır

Test adı: Değişkenlere Başvurulmalıdır

Bu test, şablonda kullanılmayan veya geçerli bir ifadede kullanılmayan değişkenleri bulur. Şablonunuzdaki karışıklığı azaltmak için tanımlı ancak kullanılmayan değişkenleri silin.

Değerleri yinelemek copy için öğesini kullanan değişkenlere başvurulmalıdır. Daha fazla bilgi için bkz . ARM şablonlarında değişken yinelemesi.

Bicep'te Linter kuralını kullanın; kullanılmayan değişken yoktur.

öğesini kullanan copy değişkene başvurulmadığı için aşağıdaki örnek başarısız olur.

{
  "$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": {}
}

Aşağıdaki örnek, bir değişkene başvuran ifadede baştaki köşeli ayraç ([ ) eksik olduğundan başarısız olur.

"outputs": {
  "outputVariable": {
    "type": "string",
    "value": " variables('varExample')]"
  }
}

değişkenine içinde outputsbaşvurulacağından aşağıdaki örnek geçer.

{
  "$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')]"
    }
  }
}

İfade geçerli olduğundan aşağıdaki örnek geçer .

"outputs": {
  "outputVariable": {
    "type": "string",
    "value": "[variables('varExample')]"
  }
}

Dinamik değişken concat kullanmamalıdır

Test adı: Dinamik Değişken Başvuruları Concat Kullanmamalıdır

Bazen başka bir değişkenin veya parametrenin değerine göre dinamik olarak bir değişken oluşturmanız gerekir. Değeri ayarlarken concat işlevini kullanmayın. Bunun yerine, kullanılabilir seçenekleri içeren bir nesne kullanın ve dağıtım sırasında nesneden özelliklerden birini dinamik olarak alın.

Aşağıdaki örnek geçer. Değişken currentImage dağıtım sırasında dinamik olarak ayarlanır.

{
  "$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')]"
    }
  }
}

En son API sürümünü kullan

Test adı: apiVersions En Son Olmalıdır

Her kaynağın API sürümü, dize olarak sabit kodlanmış son sürümü kullanmalıdır. Test, şablonunuzdaki API sürümünü araç setinin önbelleğindeki kaynak sağlayıcısının sürümleriyle karşılaştırır. Testin çalıştırıldığı tarihten itibaren iki yıldan daha eski bir API sürümü en son olarak kabul edilir. Daha yeni bir sürüm kullanılabilir olduğunda önizleme sürümü kullanmayın.

API sürümünün bulunamadığını belirten uyarı, yalnızca sürümün araç setinin önbelleğine dahil olmadığını gösterir. Api'nin önerilen en son sürümünü kullanmak uyarıyı oluşturabilir.

Araç seti önbelleği hakkında daha fazla bilgi edinin.

Bicep'te Linter kuralını kullanın- son API sürümlerini kullanın.

API sürümü iki yıldan eski olduğundan aşağıdaki örnek başarısız olur .

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2019-06-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]"
  }
]

Aşağıdaki örnek, daha yeni bir sürüm kullanılabilir olduğunda önizleme sürümü kullanıldığından başarısız olur .

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2020-08-01-preview",
    "name": "storageaccount1",
    "location": "[parameters('location')]"
  }
]

Aşağıdaki örnek, önizleme sürümü olmayan yeni bir sürüm olduğundan geçer .

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2021-02-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]"
  }
]

Sabit kodlanmış API sürümünü kullanma

Test adı: Sağlayıcılar apiVersions'a İzin Verilmiyor

Bir kaynak türü için API sürümü, hangi özelliklerin kullanılabilir olduğunu belirler. Şablonunuzda sabit kodlanmış bir API sürümü sağlayın. Hangi özelliklerin kullanılabilir olduğunu bilmediğiniz için dağıtım sırasında belirlenen bir API sürümünü almayın.

Aşağıdaki örnek başarısız olur.

"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "[providers('Microsoft.Compute', 'virtualMachines').apiVersions[0]]",
    ...
  }
]

Aşağıdaki örnek geçer.

"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-12-01",
    ...
  }
]

Özellikler boş olamaz

Test adı: Şablon Boşluk İçermemelidir

Özellikleri boş bir değere sabit kodlamayın. Boş değerler null ve boş dizeler, nesneler veya diziler içerir. Bir özellik boş bir değere ayarlandıysa, bu özelliği şablonunuzdan kaldırın. Bir özelliği, örneğin bir parametre aracılığıyla dağıtım sırasında boş bir değere ayarlayabilirsiniz.

İç templateiçe şablondaki özellik boş özellikler içerebilir. İç içe şablonlar hakkında daha fazla bilgi için bkz. Microsoft.Resources dağıtımları.

Aşağıdaki örnek boş özellikler olduğundan başarısız olur .

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2021-01-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]",
    "sku": {},
    "kind": ""
  }
]

Özellikler değerleri içerdiğinden aşağıdaki örnek geçer .

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2021-01-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]",
    "sku": {
      "name": "Standard_LRS",
      "tier": "Standard"
    },
    "kind": "Storage"
  }
]

Kaynak Kimliği işlevlerini kullanma

Test adı: Kimlikler ResourceID'lerden Türetilmelidir

Kaynak kimliği belirtirken kaynak kimliği işlevlerinden birini kullanın. İzin verilen işlevler şunlardır:

Kaynak kimliği oluşturmak için concat işlevini kullanmayın.

Bicep'te Linter kuralını kullanın- kaynak kimliği işlevlerini kullanın.

Aşağıdaki örnek başarısız olur.

"networkSecurityGroup": {
    "id": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', resourceGroup().name, '/providers/Microsoft.Network/networkSecurityGroups/', variables('networkSecurityGroupName'))]"
}

Sonraki örnek geçer.

"networkSecurityGroup": {
    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}

ResourceId işlevi doğru parametrelere sahip

Test adı: ResourceId'ler içermemelidir

Kaynak kimlikleri oluştururken, isteğe bağlı parametreler için gereksiz işlevler kullanmayın. ResourceId işlevi varsayılan olarak geçerli aboneliği ve kaynak grubunu kullanır. Bu değerleri sağlamanız gerekmez.

Geçerli abonelik kimliğini ve kaynak grubu adını sağlamanız gerekmeyen aşağıdaki örnek başarısız olur .

"networkSecurityGroup": {
    "id": "[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}

Sonraki örnek geçer.

"networkSecurityGroup": {
    "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
}

Bu test şunlar için geçerlidir:

ve list*içinreference, kaynak kimliğini oluşturmak için kullandığınızda concat test başarısız olur.

dependsOn en iyi yöntemleri

Test adı: DependsOn En İyi Yöntemleri

Dağıtım bağımlılıklarını ayarlarken, koşulu test etmek için if işlevini kullanmayın. Bir kaynak koşullu olarak dağıtılan bir kaynağa bağımlıysa, bağımlılığı herhangi bir kaynakta olduğu gibi ayarlayın. Koşullu kaynak dağıtılmadığında Azure Resource Manager bunu gerekli bağımlılıklardan otomatik olarak kaldırır.

dependsOn öğesi bir concat işleviyle başlayamaz.

Bicep'te Linter kuralını kullanın; gereksiz dependsOn girdileri yok.

Aşağıdaki örnek bir if işlev içerdiğinden başarısız olur.

"dependsOn": [
  "[if(equals(parameters('newOrExisting'),'new'), variables('storageAccountName'), '')]"
]

Aşağıdaki örnek ile concatbaşladığı için başarısız oluyor.

"dependsOn": [
  "[concat(variables('storageAccountName'))]"
]

Aşağıdaki örnek geçer.

"dependsOn": [
  "[variables('storageAccountName')]"
]

İç içe veya bağlı dağıtımlar hata ayıklamayı kullanamaz

Test adı: Dağıtım Kaynaklarının Hata Ayıklaması Yapılmamalıdır

Kaynak türüyle Microsoft.Resources/deploymentsiç içe veya bağlantılı bir şablon tanımladığınızda, hata ayıklamayı etkinleştirebilirsiniz. Hata ayıklama, bir şablonu test etmeniz gerektiğinde kullanılır, ancak hassas bilgileri kullanıma sunabilirsiniz. Şablon üretimde kullanılmadan önce hata ayıklamayı kapatın. nesnesini kaldırabilir debugSetting veya özelliğini olarak detailLevelnonedeğiştirebilirsiniz.

Aşağıdaki örnek başarısız olur.

"debugSetting": {
  "detailLevel": "requestContent"
}

Aşağıdaki örnek geçer.

"debugSetting": {
  "detailLevel": "none"
}

Yönetici kullanıcı adları değişmez değer olamaz

Test adı: adminUsername değişmez değer olmamalıdır

ayarlarken adminUserNamedeğişmez değer kullanmayın. Kullanıcı adı için bir parametre oluşturun ve parametrenin değerine başvurmak için bir ifade kullanın.

Bicep'te Linter kuralını kullanın. Yönetici kullanıcı adı değişmez değer olmamalıdır.

Aşağıdaki örnek değişmez değerle başarısız olur .

"osProfile":  {
  "adminUserName": "myAdmin"
}

Aşağıdaki örnek bir ifade ile geçer .

"osProfile": {
  "adminUsername": "[parameters('adminUsername')]"
}

En son VM görüntüsünü kullan

Test adı: VM Görüntüleri En Son Sürümü Kullanmalıdır

Bu test devre dışı bırakıldı, ancak çıktı başarılı olduğunu gösteriyor. En iyi yöntem, şablonunuzu aşağıdaki ölçütlere göre denetlemektir:

Şablonunuz görüntü içeren bir sanal makine içeriyorsa, görüntünün en son sürümünü kullandığından emin olun.

Bicep'te Linter kuralını kullanın- kararlı VM görüntüsü kullanın.

Kararlı VM görüntüleri kullanma

Test adı: Sanal Makineler Önizleme Olmamalıdır

Sanal makineler önizleme görüntülerini kullanmamalıdır. Test, öğesinin önizleme içeren bir dize kullanmadığını imageReference doğrulamak için öğesini denetlerstorageProfile. Ve bu önizleme , skuveya versionözelliklerinde imageReferenceofferkullanılmaz.

özelliği hakkında imageReference daha fazla bilgi için bkz . Microsoft.Compute virtualMachines ve Microsoft.Compute virtualMachineScaleSets.

Bicep'te Linter kuralını kullanın- kararlı VM görüntüsü kullanın.

Aşağıdaki örnek, önizleme içeren bir dize olduğundan imageReferencebaşarısız olur.

"properties": {
  "storageProfile": {
    "imageReference": "latest-preview"
  }
}

Önizleme , sku veya versioniçinde offerkullanıldığında aşağıdaki örnek başarısız olur.

"properties": {
  "storageProfile": {
    "imageReference": {
      "publisher": "Canonical",
      "offer": "UbuntuServer_preview",
      "sku": "16.04-LTS-preview",
      "version": "preview"
    }
  }
}

Aşağıdaki örnek geçer.

"storageProfile": {
  "imageReference": {
    "publisher": "Canonical",
    "offer": "UbuntuServer",
    "sku": "16.04-LTS",
    "version": "latest"
  }
}

ManagedIdentity uzantısını kullanma

Test adı: ManagedIdentityExtension kullanılmamalıdır

Uzantıyı ManagedIdentity bir sanal makineye uygulamayın. Uzantı 2019'da kullanımdan kaldırılmıştır ve artık kullanılmamalıdır.

Çıkışlar gizli dizi içeremez

Test adı: Çıkışlar Gizli Dizi İçermemelidir

Bölümüne gizli dizileri ortaya çıkarabilecek hiçbir değer eklemeyin outputs . Örneğin, veya türünde secureString güvenli parametreler ya da secureObjectgibi listKeysliste* işlevleri.

Bir şablonun çıktısı dağıtım geçmişinde depolanır, böylece kötü amaçlı bir kullanıcı bu bilgileri bulabilir.

Bicep'te Linter kuralını kullanın; çıkışlar gizli diziler içermemelidir.

Aşağıdaki örnek, çıkış değerinde güvenli bir parametre içerdiğinden başarısız olur .

{
  "$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'))]"
    }
  }
}

Çıkışlarda bir list* işlevi kullandığından aşağıdaki örnek başarısız olur.

{
  "$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')]"
    }
  }
}

commandToExecute gizli dizileri için protectedSettings kullanma

Test adı: CommandToExecute Gizli Diziler için ProtectedSettings Kullanmalıdır

türündeki CustomScriptkaynaklar için parola gibi gizli verileri içerdiğinde commandToExecute şifrelenmiş protectedSettings değerini kullanın. Örneğin, gizli dizi verileri veya gibi listKeysliste* işlevlerinin veya secureObjectözel betiklerin secureString güvenli parametrelerinde kullanılabilir.

Nesnede settings gizli dizi verileri kullanmayın çünkü düz metin kullanır. Daha fazla bilgi için bkz . Microsoft.Compute virtualMachines/extensions, Windows veya Linux.

Bicep'te Linter kuralını kullanın- commandToExecute gizli dizileri için protectedSettings kullanın.

Aşağıdaki örnek, güvenli bir parametre ile kullanıldığından commandToExecutebaşarısız olursettings.

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

Aşağıdaki örnek, bir listKeys işlevle kullanıldığı commandToExecute için settingsbaşarısız olur.

"properties": {
  "type": "CustomScript",
  "settings": {
    "commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
  }
}

Aşağıdaki örnek, güvenli bir parametre ile kullanıldığından commandToExecutegeçerprotectedSettings.

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

Aşağıdaki örnek, bir listKeys işlevle kullandığından protectedSettingscommandToExecute geçer.

"properties": {
  "type": "CustomScript",
  "protectedSettings": {
    "commandToExecute": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2021-02-01')]"
  }
}

Başvuru işlevlerinde son API sürümlerini kullanma

Test adı: apiVersions Başvuru İşlevlerinde En Son Olmalıdır

Başvuru işlevinde kullanılan API sürümünün önizleme sürümü değil son sürümü olması gerekir. Test, şablonunuzdaki API sürümünü araç setinin önbelleğindeki kaynak sağlayıcısının sürümlerine göre değerlendirir. Testin çalıştırıldığı tarihten itibaren iki yıldan daha eski bir API sürümü son olarak kabul edilir.

API sürümünün bulunamadığını belirten bir uyarı, yalnızca sürümün araç setinin önbelleğine dahil olmadığını gösterir. Api'nin önerilen en son sürümünü kullanmak uyarıyı oluşturabilir.

Araç seti önbelleği hakkında daha fazla bilgi edinin.

API sürümü iki yıldan eski olduğundan aşağıdaki örnek başarısız olur .

"outputs": {
  "stgAcct": {
    "type": "string",
    "value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01')]"
  }
}

API sürümü bir önizleme sürümü olduğundan aşağıdaki örnek başarısız olur .

"outputs": {
  "stgAcct": {
    "type": "string",
    "value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2020-08-01-preview')]"
  }
}

API sürümü iki yaşından küçük olduğundan ve önizleme sürümü olmadığından aşağıdaki örnek geçer .

"outputs": {
  "stgAcct": {
    "type": "string",
    "value": "[reference(resourceId(parameters('storageResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-02-01')]"
  }
}

resourceId işlevlerinde tür ve ad kullanma

Test adı: Kaynaklar Belirsiz Olmamalıdır

Bu test devre dışı bırakıldı, ancak çıktı başarılı olduğunu gösteriyor. En iyi yöntem, şablonunuzu aşağıdaki ölçütlere göre denetlemektir:

ResourceId bir kaynak türü ve kaynak adı içermelidir. Bu test, şablonun resourceId tüm işlevlerini bulur ve kaynağın şablonda doğru söz dizimi ile kullanıldığını doğrular. Aksi takdirde işlev belirsiz olarak kabul edilir.

Örneğin, bir resourceId işlev belirsiz olarak kabul edilir:

  • Şablonda bir kaynak bulunamadığında ve kaynak grubu belirtilmediğinde.
  • Bir kaynak bir koşul içeriyorsa ve kaynak grubu belirtilmemişse.
  • İlgili bir kaynak ad segmentlerinin tümünü değil bazılarını içeriyorsa. Örneğin, bir alt kaynak birden fazla ad kesimi içerir. Daha fazla bilgi için bkz. resourceId açıklamaları.

İç içe dağıtım güvenli parametreleri için iç kapsamı kullanma

Test adı: İç İçe Dağıtımlarda Güvenli Parametreler

gibi güvenli secureString parametreler veya secureObject gibi listKeysliste* işlevleri içeren ifadeleri değerlendirmek için iç içe yerleştirilmiş şablonun expressionEvaluationOptions nesnesini kapsamla inner birlikte kullanın. outer Kapsam kullanılırsa, ifadeler üst şablonun kapsamındaki düz metinde değerlendirilir. Daha sonra güvenli değer, dağıtım geçmişine erişimi olan herkes tarafından görülebilir. expressionEvaluationOptions için varsayılan değer outer değeridir.

İç içe şablonlar hakkında daha fazla bilgi için bkz. Microsoft.Resources dağıtımları ve İç içe şablonlardaki ifade değerlendirme kapsamı.

Bicep'te Linter kuralı - iç içe dağıtımda güvenli parametreler kullanın.

Aşağıdaki örnek, güvenli parametreleri veya list* işlevleri değerlendirmek için kapsam kullandığından outerbaşarısız olurexpressionEvaluationOptions.

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2021-04-01",
    "name": "nestedTemplate",
    "properties": {
      "expressionEvaluationOptions": {
        "scope": "outer"
      }
    }
  }
]

Aşağıdaki örnek, güvenli parametreleri veya list* işlevleri değerlendirmek için kapsam kullandığından innergeçerexpressionEvaluationOptions.

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2021-04-01",
    "name": "nestedTemplate",
    "properties": {
      "expressionEvaluationOptions": {
        "scope": "inner"
      }
    }
  }
]

Sonraki adımlar