ARM şablonları için test çalışmaları
Bu makalede, Azure Resource Manager şablonları (ARM şablonları) için şablon 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ü 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ç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'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 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ını 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 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ı konusuna 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, 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ış string
adlı location
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 Linter kuralını kullanın ; parametre varsayılan değerlerinin dışında konum ifadesi yok.
Kaynağın kaynağı olarak ayarlandığından aşağıdaki örnek başarısız oluyor.location
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"
}
}
]
}
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 . 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": "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 global
olarak ayarlanmalıdır. Şablon ifadesi genellikle Location uses parameter bölümünde açıklanan parametreyi location
kullanır.
Bicep'te Linter kuralını kullanın ; sabit kodlanmış konum yok.
aşağıdaki örnek bir ifade veya global
olmadığı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 location
global
aş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 hardwareProfile
vmSize
sabit kodunu yapmayı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, nesnenin hardwareProfile
vmSize
sabit kodlanmış değeri olduğundan 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 vmSize
bir değer belirttiğ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 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')]"
}
}
}
]
Min ve max değerleri sayıdır
Test adı: Min ve Max değerleri sayıdır
ve maxValue
ile 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 minValue
geçer.
"exampleParameter": {
"type": "int",
"minValue": 0,
"maxValue": 10
}
Yapıt parametresi doğru tanımlanmış
Test adı: artifacts parametresi
ve _artifactsLocationSasToken
için _artifactsLocation
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
birstring
olmalı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 da"[deployment().properties.templateLink.uri]"
ham depo URL'sine sahip olmalıdır._artifactsLocationSasToken
birsecureString
olmalı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'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 yok.
Öğ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": {}
}
Bir değişkene başvuran ifadede baş köşeli ayraç ([
) eksik olduğundan aşağıdaki örnek başarısız olur.
"outputs": {
"outputVariable": {
"type": "string",
"value": " variables('varExample')]"
}
}
Değişkenine içinde outputs
başvuruldığı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 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.
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
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": "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ş 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.
İç template
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": "2021-01-01",
"name": "storageaccount1",
"location": "[parameters('location')]",
"sku": {},
"kind": ""
}
]
Özellikler değerler 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 Kaynak Kimliklerinden 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 oluyor.
"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ş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:
ve içinreference
, kaynak kimliğini oluşturmak için kullandığınızda concat
test başarısız olur.list*
dependsOn en iyi yöntemler
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.
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 concat
baş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ı kullanamıyor
Test adı: Dağıtım Kaynaklarının Hata Ayıklaması Yapılmamalıdır
Kaynak türüyle Microsoft.Resources/deployments
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. nesnesini kaldırabilir debugSetting
veya özelliğini olarak detailLevel
none
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ı değişmez değer olamaz
Test adı: adminUsername değişmez değer olmamalıdır
ayarlarken adminUserName
değ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 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'te Linter kuralını kullanın - kararlı VM görüntüsü kullanın.
Kararlı VM görüntülerini 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ı doğrulamak imageReference
için öğesini denetlerstorageProfile
. Ve bu önizleme , sku
veya version
özelliklerinde imageReference
offer
kullanı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 imageReference
başarısız olur.
"properties": {
"storageProfile": {
"imageReference": "latest-preview"
}
}
Aşağıdaki örnek, , sku
veya version
içinde offer
önizleme kullanıldığında başarısız oluyor.
"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ı 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 dizi içeremez
Test adı: Çıkışlar Gizli Dizi İçermemelidir
Bölümüne gizli dizileri ortaya çıkarabilecek herhangi bir değer eklemeyin outputs
. Örneğin, veya türünde secureString
güvenli parametreler ya da secureObject
gibi listKeys
liste* işlevleri.
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 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'))]"
}
}
}
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 dizileri için protectedSettings kullanma
Test adı: CommandToExecute Gizli Diziler için ProtectedSettings Kullanmalıdır
türündeki CustomScript
kaynaklar için parola gibi gizli verileri içerdiğinde commandToExecute
şifrelenmiş protectedSettings
değerini kullanın. Örneğin, gizli veriler veya gibi liste* işlevlerinin veya secureObject
özel betiklerin güvenli secureString
parametrelerinde listKeys
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'te Linter kuralını kullanın - commandToExecute gizli dizileri için protectedSettings kullanın.
Aşağıdaki örnek, güvenli bir parametreyle kullanıldığından commandToExecute
baş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 settings
baş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 commandToExecute
geçerprotectedSettings
.
"parameters": {
"adminPassword": {
"type": "secureString"
}
}
...
"properties": {
"type": "CustomScript",
"protectedSettings": {
"commandToExecute": "[parameters('adminPassword')]"
}
}
Aşağıdaki örnek, bir listKeys
işlevle kullanıldığı commandToExecute
için protectedSettings
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 Son 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.
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')]"
}
}
Aşağıdaki örnek , API sürümü iki yaşından küçük olduğundan ve önizleme sürümü olmadığından 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
türü secureString
veya secureObject
gibi listKeys
liste* işlevleri içeren güvenli parametreleri 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 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 ş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 expressionEvaluationOptions
outer
başarısız olur.
"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 expressionEvaluationOptions
inner
geçer.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
}
}
}
]
Sonraki adımlar
- Test araç setini çalıştırma hakkında bilgi edinmek için bkz . ARM şablonu test araç setini kullanma.
- Test araç setini kullanmayı kapsayan bir Learn modülü için bkz . What-if ve ARM şablonu test araç setini kullanarak değişiklikleri önizleme ve Azure kaynaklarını doğrulama.
- Parametre dosyalarını test etmek için bkz . Parametre dosyaları için test çalışmaları.
- createUiDefinition testleri için bkz . createUiDefinition.json için test çalışmaları.
- Tüm dosyalara yönelik testler hakkında bilgi edinmek için bkz . Tüm dosyalar için test çalışmaları.