Aracılığıyla paylaş


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

Bu makalede, Azure Resource Manager şablonları (ARM şablonları) için template test 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 oluyor .

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

Şema sürümü eski ve korunmadığından, aşağıdaki örnek bir uyarı gösterir.

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

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

{
  "$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.

Şablonunuzdaki karışıklığı 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 Linter kuralı kullanın; kullanılmayan parametre yok.

Bir parametreye referans veren dışavurumda 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 parametrelerin sabit kodlanmış varsayılanı olamaz

Test adı: Güvenli Dize Parametrelerinin Varsayılanı 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 secureString veya secureObject parolalar gibi hassas değerler içeren parametrelerde kullanırsınız. 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ı kullanın.

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

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

Sonraki örnek geçer.

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

İşlev newGuid kullanıldığı için 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 bkz. test case.

Bicep Linter kuralı 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, 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 bir parametre kullanır

Test adı: Konum Sabit Kodlanmamalıdır

Kaynağın konumunu ayarlamak için şablonlarınızda türü olarak ayarlanmış locationadlı string bir parametre olmalıdır. Azuredeploy.json veya mainTemplate.json ana şablonda, 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.

Kullanıcılar, kaynak grubu konumunu varsayılan olarak belirten bir location parametre sağlayarak, uygun olduğunda varsayılan değeri kullanabilir, ancak farklı bir konum da belirtebilir.

Bicep'te parametre varsayılan değerlerinin dışında konum ifadeleri kullanmama kuralını uygulayın.

Kaynağın locationresourceGroup().location olarak ayarlandığından aş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": "2025-06-01",
      "name": "storageaccount1",
      "location": "[resourceGroup().location]",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
      }
    }
  ]
}

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": "2025-06-01",
      "name": "storageaccount1",
      "location": "[parameters('location')]",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
      }
    }
  ],
  "outputs": {}
}

Aşağıdaki örnek , şablon ana şablon olarak kullanıldığında geçer . Kaynak grubu konumunu varsayılan olarak belirten ancak kullanıcıların farklı bir değer sağlamasına olanak tanıyan 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": "2025-06-01",
      "name": "storageaccount1",
      "location": "[parameters('location')]",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
      }
    }
  ],
  "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 bir konuma sahip olmalıdır

Test adı: Kaynaklar İçin Konum Gerekli

Kaynağın konumu bir şablon ifadesi veya globalolarak ayarlanmalıdır. Şablon ifadesi genellikle Location uses parameter bölümünde açıklanan parametreyi locationkullanır.

Bicep'te, Linter kuralını kullanın - sabit kodlanmış konum kullanmayın.

Aşağıdaki örnek başarısız olur çünkü location bir ifade veya global değildir.

{
  "$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": "2025-06-01",
      "name": "storageaccount1",
      "location": "westus",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
      }
    }
  ],
  "outputs": {}
}

Kaynak locationglobal olarak ayarlandığı için aşağıdaki örnek geçerlidir.

{
  "$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": "2025-06-01",
      "name": "storageaccount1",
      "location": "global",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
      }
    }
  ],
  "outputs": {}
}

Bir ifade kullandığı için, sonraki örnek de geçerli. 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": "2025-06-01",
      "name": "storageaccount1",
      "location": "[parameters('location')]",
      "kind": "StorageV2",
      "sku": {
        "name": "Premium_LRS",
      }
    }
  ],
  "outputs": {}
}

VM boyutu bir parametre kullanır.

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

Nesnenin hardwareProfile nesnesinde vmSize 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.

Aşağıdaki örnek başarısız olur çünkü hardwareProfile nesnesinin vmSize'si sabit kodlu bir değerdir.

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

Bir parametre için bir değer belirtildiğinde örnek geçer.

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

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

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

Min ve max değerleri sayıdır

Test adı: Min ve Max değerleri sayıdır

ve minValueile maxValue bir parametre tanımladığınızda, bunları sayı olarak belirtin. minValue ve maxValue öğelerini bir çift olarak kullanmanız gerekir, aksi takdirde 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 minValue yalnızca kullanıldığı için başarısız olur.

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

Aşağıdaki örnek geçer çünkü minValue ve maxValue sayılardır.

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

Artefakt parametresi doğru tanımlanmış

Test adı: artifacts parametresi

ve _artifactsLocationiçin _artifactsLocationSasToken parametreleri eklediğinizde, doğru varsayılan değerleri 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ğere sahip olamaz.
  • _artifactsLocation varsayılan değeri için ya "[deployment().properties.templateLink.uri]" ya da 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ğere sahip olamaz.

Bicep Linter rule - artifacts parameters 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.

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

Bicep'te, Kullanılmayan değişken yok - Linter kuralını kullanın.

Aşağıdaki örnek başarısız olur çünkü copy öğesini kullanan değişkene başvurulmamıştır.

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

Bunun başarısız olmasının nedeni, bir değişkene başvuran ifadede baş köşeli ayraç ([) eksik olmasıdır.

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

Aşağıdaki örnek geçer, çünkü değişken outputs'de referans alınmıştır.

{
  "$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 Referansları Concat Kullanmamalıdır

Bazen bir değişkeni başka bir değişkenin veya parametrenin değerine göre dinamik olarak 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 dinamik olarak özelliklerden birini 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')]"
    }
  }
}

Son API sürümünü kullanma

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, şablonunuzun 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. Daha yeni bir sürüm kullanılabilir olduğunda önizleme sürümünü 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. Bir API'nin önerilen en son sürümünü kullanmak uyarıyı oluşturabilir.

toolkit cache hakkında daha fazla bilgi edinin.

Bicep'da 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": "2025-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 geçer çünkü bu, önizleme sürümü olmayan yeni bir sürümdür.

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

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

Test adı: Sağlayıcılar API Sürümlerine İzin Verilmiyor

Kaynak türünün 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 oluyor.

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

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

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

Özellikler boş olamaz

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

Özellikleri boş bir değere sabit kodlamayın. Boş değerler null ve boş dizeleri, nesneleri veya dizileri 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.

içe şablondaki özelliği 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": "2025-06-01",
    "name": "storageaccount1",
    "location": "[parameters('location')]",
    "sku": {},
    "kind": ""
  }
]

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

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

Kaynak Kimliği işlevlerini kullanma

Test adı: ID'ler 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'da Linter kuralı kullanın- kaynak kimliği işlevlerini kullanın.

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

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

Sonraki örnek başarılı olur.

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

ResourceId işlevinin parametreleri doğru

Test adı: ResourceId'ler içermemelidir

Kaynak kimlikleri oluştururken, isteğe bağlı parametreler için gereksiz işlevleri kullanmayın. Varsayılan olarak resourceId işlevi 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:

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

dependsOn en iyi yöntemler

Test adı: DependsOn En İyi Uygulamalar

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 gerekli bağımlılıklardan otomatik olarak kaldırır.

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

Bicep Linter kuralı kullanın. Gereksiz dependsOn girdileri.

Aşağıdaki örnek başarısız olur çünkü bir if fonksiyonu içerir.

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

Aşağıdaki örnek başarısız olur çünkü concat ile başlıyor.

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

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

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

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

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

Kaynak türüyle iç içe veya bağ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. Ya debugSetting nesnesini kaldırabilir ya da detailLevel özelliğini none olarak değiştirebilirsiniz.

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

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

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

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

Yönetici kullanıcı adları sabit değer olamaz

Test adı: adminUsername bir literal olmamalıdır

Bir adminUserName ayarlarken, sabit bir 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ı - yönetici kullanıcı adı sabit olmamalıdır kullanın.

Aşağıdaki örnek literal değerle başarısız oluyor.

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

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

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

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

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'da Linter kuralı kullanın- kararlı VM görüntüsü kullanın.

Kararlı VM görüntülerini kullanma

Test adı: Sanal Makineler Önizleme Olmamalı

Sanal makineler önizleme görüntülerini kullanmamalıdır. Test, storageProfile öğesini kontrol eder ve imageReference öğesinin, içinde önizleme içeren bir dize kullanmadığını doğrular. Ve bu önizleme , imageReferenceveya offerözelliklerinde skuversionkullanılmaz.

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

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

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

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

Aşağıdaki örnek, offer, sku veya version içinde önizleme kullanıldığında hata verir.

"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ı sakın kullanma

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

Uzantıyı bir sanal makineye uygulamayın ManagedIdentity . Uzantı 2019'da kullanım dışı bırakıldı ve artık kullanılmamalıdır.

Çıkışlar gizli bilgi içermemelidir

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

outputs bölümüne gizli bilgileri açığa çıkarabilecek herhangi bir değer eklemeyin. Örneğin, secureString veya secureObject türündeki güvenli parametreler ya da list* veya listKeys gibi işlevler.

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

Bicep'te Linter kuralını kullanın - çıkışlar gizli bilgiler 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'))]"
    }
  }
}

Aşağıdaki örnek, çıkışlarda bir list* işlevi kullandığından 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 bilgileri için protectedSettings kullan

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

CustomScript türündeki kaynaklar için, commandToExecute parola gibi gizli verileri içerdiğinde, şifrelenmiş protectedSettings kullanın. Örneğin, gizli veriler veya tipindeki güvenli parametrelerde, liste* fonksiyonları içinde veya özel betiklerde kullanılabilir.

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

Bicep, Linter kuralı - commandToExecute sırları için protectedSettings kullanın.

Aşağıdaki örnek başarısız olur çünkü settingscommandToExecute güvenli bir parametreyle kullanır.

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

Aşağıdaki örnek başarısız olur çünkü settings, commandToExecute ile bir listKeys fonksiyonunu kullanır.

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

Aşağıdaki örnek geçer çünkü protectedSettingscommandToExecute güvenli bir parametreyle kullanır.

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

Aşağıdaki örnek geçer çünkü protectedSettings bir listKeys fonksiyonuyla commandToExecute kullanır.

"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 Referans Fonksiyonlarında Güncel Olmalıdır

Başvuru işlevinde kullanılan API sürümü, önizleme sürümü değil son sürüm olmalıdır. Test, şablonunuzun 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 uyarı, yalnızca sürümün araç setinin önbelleğine dahil olmadığını gösterir. Bir API'nin önerilen en son sürümünü kullanmak uyarıyı oluşturabilir.

toolkit cache 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')]"
  }
}

Aşağıdaki örnek geçer çünkü API sürümü iki yıldan daha yeni ve önizleme sürümü değildir.

"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 segmenti içerir. Daha fazla bilgi için resourceId açıklamaları bölümüne bakınız.

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

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

İç içe yerleştirilmiş şablonun expressionEvaluationOptions nesnesini inner kapsamıyla birlikte, türü secureString veya secureObject olan güvenli parametreleri veya list* gibi listKeys işlevlerini içeren ifadeleri değerlendirmek için kullanın. outer Kapsam kullanılırsa, ifadeler üst şablonun kapsamındaki düz metin olarak 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 şablonlarda ifade değerlendirme kapsamı.

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

Aşağıdaki örnek başarısız olur çünkü expressionEvaluationOptions güvenli parametreleri veya list* fonksiyonları değerlendirmek için outer kapsamını kullanır.

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

Aşağıdaki örnek.

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

Sonraki adımlar