Azure İlkesi tanım yapısı

Azure Ilkesi, kaynaklar için kurallar oluşturur. İlke tanımları, kaynak uyumluluk koşullarını ve bir koşul karşılanırsa gerçekleştirilecek etkiyi tanımlar. Bir koşul, kaynak özellik alanını veya değeri gerekli bir değerle karşılaştırır. Kaynak özelliği alanlarına diğer adlarkullanılarak erişilir. Kaynak özelliği alanı bir dizi olduğunda, tüm dizi üyelerinden değerleri seçmek ve her birine bir koşul uygulamak için özel bir dizi diğer adı kullanılabilir. Koşullarhakkında daha fazla bilgi edinin.

Kuralları tanımlayarak, maliyetlerinizi denetleyebilir ve kaynaklarınızı daha kolay yönetebilirsiniz. Örneğin, yalnızca belirli türlerdeki sanal makinelere izin verileceğini belirtebilirsiniz. Ya da kaynakların belirli bir etiketi olmasını isteyebilirsiniz. İlke atamaları alt kaynaklar tarafından devralınır. Bir kaynak grubuna bir ilke ataması uygulanmışsa, bu kaynak grubundaki tüm kaynaklar için geçerlidir.

İlke tanımı Policyrule şeması şurada bulunur: https://schema.management.azure.com/schemas/2020-10-01/policyDefinition.json

Bir ilke tanımı oluşturmak için JSON kullanırsınız. İlke tanımı öğeleri içerir:

  • görünen ad
  • açıklama
  • mod
  • meta veriler
  • parameters
  • ilke kuralı
    • mantıksal değerlendirme
    • etkisi

Örneğin, aşağıdaki JSON kaynakların dağıtıldığı yeri sınırlayan bir ilke gösterir:

{
    "properties": {
        "displayName": "Allowed locations",
        "description": "This policy enables you to restrict the locations your organization can specify when deploying resources.",
        "mode": "Indexed",
        "metadata": {
            "version": "1.0.0",
            "category": "Locations"
        },
        "parameters": {
            "allowedLocations": {
                "type": "array",
                "metadata": {
                    "description": "The list of locations that can be specified when deploying resources",
                    "strongType": "location",
                    "displayName": "Allowed locations"
                },
                "defaultValue": [ "westus2" ]
            }
        },
        "policyRule": {
            "if": {
                "not": {
                    "field": "location",
                    "in": "[parameters('allowedLocations')]"
                }
            },
            "then": {
                "effect": "deny"
            }
        }
    }
}

Azure Ilkesi yerleşik bileşenleri ve desenleri Azure ilke örnekleri' nde bulunur.

Görünen ad ve açıklama

DisplayName ve Description kullanarak ilke tanımını tanımlayabilir ve ne zaman kullanılacağı için bağlam sağlayabilirsiniz. DisplayName , en fazla 128 karakter uzunluğunda ve en fazla 512 karakter uzunluğunda bir Açıklama içeriyor.

Not

Bir ilke tanımı, kimliği, türü ve ADıNıN oluşturulması veya güncelleştirilmesi sırasında JSON harici özellikleri tarafından tanımlanır ve json dosyasında gerekli değildir. İlke tanımını SDK aracılığıyla getirmek, JSON 'ın bir parçası olarak kimliği, türü ve ad özelliklerini döndürür, ancak her biri ilke tanımıyla ilgili salt okunurdur.

Tür

Tür özelliği ayarlanılarken, SDK tarafından döndürülen ve portalda görünen üç değer vardır:

  • Builtin: Bu ilke tanımları Microsoft tarafından sağlanır ve sürdürülür.
  • Custom: Müşteriler tarafından oluşturulan tüm ilke tanımlarında bu değer vardır.
  • Static: Microsoft sahiplik Ile mevzuat uyumluluk ilkesi tanımını gösterir. Bu ilke tanımlarının uyumluluk sonuçları, Microsoft altyapısına ilişkin üçüncü taraf denetimlerin sonuçlardır. Azure portal, bu değer bazen Microsoft tarafından yönetilen olarak görüntülenir. Daha fazla bilgi için bkz. bulutta paylaşılan sorumluluk.

Mod

İlke bir Azure Resource Manager özelliğini veya kaynak sağlayıcısı özelliğini hedeflediğinden, mod yapılandırılır.

Kaynak Yöneticisi modları

Modu , bir ilke tanımı için hangi kaynak türlerinin değerlendirildiğini belirler. Desteklenen modlar şunlardır:

  • all: kaynak gruplarını, abonelikleri ve tüm kaynak türlerini değerlendir
  • indexed: yalnızca etiketleri ve konumu destekleyen kaynak türlerini değerlendir

Örneğin, kaynak Microsoft.Network/routeTables etiketleri ve konumu destekler ve her iki modda değerlendirilir. Ancak, kaynak Microsoft.Network/routeTables/routes etiketlenemez ve Indexed modda değerlendirilmez.

Modu all çoğu durumda ayarlamanız önerilir. Portal üzerinden oluşturulan tüm ilke tanımları all modunu kullanır. PowerShell veya Azure CLı kullanıyorsanız, mod parametresini el ile belirtebilirsiniz. ilke tanımı bir mod değeri içermiyorsa, varsayılan olarak all Azure PowerShell ve ' de Azure clı ' de olur null . Bir null mod, indexed geriye dönük uyumluluğu desteklemek için ile aynıdır.

indexed Etiketler veya konumlar uygulayan ilkeler oluşturulurken kullanılmalıdır. Gerekli olmasa da, etiketleri ve konumları desteklemeyen kaynakların, uyumluluk sonuçlarında uyumlu değil olarak gösterilmesini engeller. Özel durum kaynak grupları ve aboneliklerdir. Bir kaynak grubunda veya abonelikte konum veya etiket uygulayan ilke tanımlarının modu olarak ayarlanması all ve ya da türünü hedeflemesi gerekir Microsoft.Resources/subscriptions/resourceGroups Microsoft.Resources/subscriptions . Bir örnek için bkz. model: Etiketler-örnek #1. Etiketleri destekleyen kaynakların listesi için bkz. Azure kaynakları Için etiket desteği.

Kaynak sağlayıcısı modları

Aşağıdaki kaynak sağlayıcısı modu tam olarak desteklenmektedir:

Aşağıdaki kaynak sağlayıcısı modları Şu anda Önizleme olarak desteklenmektedir:

Not

Kaynak sağlayıcısı modları yalnızca yerleşik ilke tanımlarını destekler ve açıkça belirtilmemişse muafiyetleri desteklemez.

Meta veri

İsteğe bağlı metadata özelliği, ilke tanımıyla ilgili bilgileri depolar. Müşteriler, ' de kuruluşları için yararlı olan özellikleri ve değerleri tanımlayabilir metadata . Ancak, Azure Ilkesi tarafından ve yerleşik olarak kullanılan bazı ortak özellikler vardır. Her metadata özelliğin 1024 karakterlik bir sınırı vardır.

Ortak meta veri özellikleri

  • version (dize): bir ilke tanımının içeriğinin sürümü hakkındaki ayrıntıları Izler.
  • category (dize): ilke tanımının Azure portal hangi kategori altında görüntülendiğini belirler.
  • preview (Boolean): ilke tanımı Önizleme Ise, true veya false bayrağı.
  • deprecated (Boolean): ilke tanımı kullanım dışı olarak işaretlenmişse true veya false bayrağı.
  • portalReview (dize): gerekli girişten bağımsız olarak, portalda parametrelerde gözden geçirilip geçirilmeyeceğini belirler.

Not

Azure Ilke hizmeti version , preview deprecated bir yerleşik ilke tanımına veya girişim ve duruma yapılan değişiklik düzeyini iletmek için, ve özelliklerini kullanır. Biçimi version : {Major}.{Minor}.{Patch} . Kullanım dışı veya Önizleme gibi belirli durumlar, version özelliğe veya başka bir özellikte Boole olarak eklenir. Azure Ilke sürümlerinin yerleşik yolu hakkında daha fazla bilgi için bkz. yerleşik sürüm oluşturma.

Parametreler

Parametreler, ilke tanımlarının sayısını azaltarak ilke yönetiminizi basitleştirmeye yardımcı olur. Parametreleri,,,, biçiminde alanlar gibi düşünün name address city state . Bu parametreler her zaman aynı kalır, ancak değerleri formu dolduran kişiye göre değişir. Parametreler, ilke oluştururken de aynı şekilde çalışır. Bir ilke tanımına parametreler ekleyerek, farklı değerler kullanarak bu ilkeyi farklı senaryolar için yeniden kullanabilirsiniz.

Not

Parametreler, var olan ve atanmış bir tanıma eklenebilir. Yeni parametre DefaultValue özelliğini içermelidir. Bu, ilke veya girişim için mevcut atamaların dolaylı olarak geçersiz hale getirilmelerini engeller.

Parametre özellikleri

Bir parametre, ilke tanımında kullanılan aşağıdaki özelliklere sahiptir:

  • name: Parametresinin adı. İlke parameters kuralı içindeki dağıtım işlevi tarafından kullanılır. Daha fazla bilgi için bkz. parametre değeri kullanma.
  • type: Parametresinin dize, dizi, nesne, boole, tamsayı, float veya datetime olup olmadığını belirler.
  • metadata: Kullanıcı dostu bilgileri görüntülemek için öncelikle Azure portal alt özellikleri tanımlar:
    • description: Parametresinin ne için kullanıldıklarının açıklaması. Kabul edilebilir değer örnekleri sağlamak için kullanılabilir.
    • displayName: Portalda parametresi için gösterilen kolay ad.
    • strongType: (İsteğe bağlı) İlke tanımı portal üzerinden atanıyorken kullanılır. Bağlama göre bir liste sağlar. Daha fazla bilgi için bkz. strongType.
    • assignPermissions: (İsteğe bağlı) İlke ataması sırasında Azure portal atamaları oluşturmak için true olarak ayarlayın. Bu özellik, atama kapsamının dışında izinler atamak istediğiniz durumda kullanışlıdır. İlkede rol tanımı başına bir rol ataması (veya girişimde tüm ilkelerde rol tanımı başına) vardır. Parametre değeri geçerli bir kaynak veya kapsam olmalıdır.
  • defaultValue: (İsteğe bağlı) Değer verilmezse, bir atamada parametrenin değerini ayarlar. Atanmış mevcut bir ilke tanımını güncelleştiriyorsanız gereklidir.
  • allowedValues: (İsteğe bağlı) Parametrenin atama sırasında kabul eden bir değer dizisi sağlar. İzin verilen değer karşılaştırmaları büyük/büyük/büyük harfe duyarlıdır.

Örneğin, kaynakların dağıtılacağı konumları sınırlamak için bir ilke tanımı tanımlayabilirsiniz. Bu ilke tanımı için bir parametreye izin verilirLocations. Bu parametre, ilke tanımının her ataması tarafından kabul edilen değerleri sınırlamak için kullanılır. strongType kullanımı, portal aracılığıyla atamayı tamamlarken gelişmiş bir deneyim sağlar:

"parameters": {
    "allowedLocations": {
        "type": "array",
        "metadata": {
            "description": "The list of allowed locations for resources.",
            "displayName": "Allowed locations",
            "strongType": "location"
        },
        "defaultValue": [ "westus2" ],
        "allowedValues": [
            "eastus2",
            "westus2",
            "westus"
        ]
    }
}

Parametre değeri kullanma

İlke kuralında, aşağıdaki işlev söz dizimleriyle parametrelere parameters başvurursunuz:

{
    "field": "location",
    "in": "[parameters('allowedLocations')]"
}

Bu örnek, parametre özelliklerinde gösteren allowedLocations parametresine başvurur.

strongType

özelliği metadata içinde strongType'ı kullanarak birden çok seçimli bir seçenek listesi Azure portal. strongType desteklenen bir kaynak türü veya izin verilen bir değer olabilir. Bir kaynak türünün strongType için geçerli olup olmadığını belirlemek için Get-AzResourceProvider kullanın. strongType kaynak türünün biçimidir. <Resource Provider>/<Resource Type> Örneğin, Microsoft.Network/virtualNetworks/subnets.

Get-AzResourceProvider tarafından döndürülen bazı kaynak türleri de kullanılabilir. Bu türler:

  • Microsoft.RecoveryServices/vaults/backupPolicies

strongType için izin verilen kaynak türü olmayan değerler:

  • location
  • resourceTypes
  • storageSkus
  • vmSKUs
  • existingResourceGroups

Tanım konumu

Girişim veya ilke oluştururken tanım konumunu belirtmeniz gerekir. Tanım konumu bir yönetim grubu veya abonelik olması gerekir. Bu konum, girişimin veya ilkenin atanma kapsamını belirler. Kaynaklar, atama için hedef tanım konumu hiyerarşisi içindeki veya üyelerinin doğrudan üyesi olmalıdır.

Tanım konumu bir ise:

  • Abonelik - Yalnızca bu abonelik içindeki kaynaklara ilke tanımı atanabilir.
  • Yönetim grubu - İlke tanımına yalnızca alt yönetim grupları ve alt abonelikler içindeki kaynaklar atanabilir. İlke tanımını birkaç aboneliğe uygulamayı planlıyorsanız, konumun her aboneliği içeren bir yönetim grubu olması gerekir.

Daha fazla bilgi için bkz. Azure İlkesi.

İlke kuralı

İlke kuralı If ve Then bloklarını oluşur. If bloğunda, ilkenin ne zaman zorunlu kılın olduğunu belirten bir veya daha fazla koşullar tanımlarsanız. İlke senaryosunu tam olarak tanımlamak için bu koşullar için mantıksal işleçler uygulayabilirsiniz.

Ardından bloğunda, If koşulları yerine getirilmiştir.

{
    "if": {
        <condition> | <logical operator>
    },
    "then": {
        "effect": "deny | audit | modify | append | auditIfNotExists | deployIfNotExists | disabled"
    }
}

Mantıksal işleçler

Desteklenen mantıksal işleçler:

  • "not": {condition or operator}
  • "allOf": [{condition or operator},{condition or operator}]
  • "anyOf": [{condition or operator},{condition or operator}]

Not söz dizimi, koşulun sonucu tersine çevirer. allOf söz dizimi (mantıksal Ve işlemine benzer) tüm koşulların doğru olması gerekir. anyOf söz dizimi (mantıksal Veya işlemine benzer) bir veya daha fazla koşulların doğru olması gerekir.

Mantıksal işleçleri iç içe yerleştirme. Aşağıdaki örnek, allOf işlemi içinde iç içe geçmiş bir not işlemi gösterir.

"if": {
    "allOf": [{
            "not": {
                "field": "tags",
                "containsKey": "application"
            }
        },
        {
            "field": "type",
            "equals": "Microsoft.Storage/storageAccounts"
        }
    ]
},

Koşullar

Koşul, bir değerin belirli ölçütlere uygun olup olmadığını değerlendirir. Desteklenen koşullar:

  • "equals": "stringValue"
  • "notEquals": "stringValue"
  • "like": "stringValue"
  • "notLike": "stringValue"
  • "match": "stringValue"
  • "matchInsensitively": "stringValue"
  • "notMatch": "stringValue"
  • "notMatchInsensitively": "stringValue"
  • "contains": "stringValue"
  • "notContains": "stringValue"
  • "in": ["stringValue1","stringValue2"]
  • "notIn": ["stringValue1","stringValue2"]
  • "containsKey": "keyName"
  • "notContainsKey": "keyName"
  • "less": "dateValue" | "less": "stringValue" | "less": intValue
  • "lessOrEquals": "dateValue" | "lessOrEquals": "stringValue" | "lessOrEquals": intValue
  • "greater": "dateValue" | "greater": "stringValue" | "greater": intValue
  • "greaterOrEquals": "dateValue" | "greaterOrEquals": "stringValue" | "greaterOrEquals": intValue
  • "exists": "bool"

Daha az, lessOrEquals, greater ve greaterOrEquals için, özellik türü koşul türüyle eşlenemediyse bir hata oluştu. Dize karşılaştırmaları kullanılarak InvariantCultureIgnoreCase yapılır.

like ve notLike koşullarını kullanırken, değerde bir joker * karakter sağlar. değeri birden fazla joker karaktere sahip olmaması * gerekir.

eşleşme ve notMatch koşullarını kullanırken, herhangi bir karakterle ve bu gerçek karakterle eşleşmek için başka bir karakterle eşleşmesi için bir rakam, bir harf için # ? . sağlama. match ve notMatch büyük/küçük harfe duyarlıdır ancak stringValue değerini değerlendiren diğer tüm koşullar büyük/küçük harfe duyarlı değildir. Büyük/harfe duyarlı olmayan alternatifler matchInsensitively ve notMatchInsensitively içinde kullanılabilir.

Alanlar

Kaynak isteği yükünde yer alan özelliklerin değerlerinin belirli ölçütlere uygun olup olmadığını değerlendiren koşullar bir alan ifadesi kullanılarak düz edilebilir. Aşağıdaki alanlar de desteklemektedir:

  • name
  • fullName
    • Kaynağın tam adını döndürür. Bir kaynağın tam adı, herhangi bir üst kaynak adı (örneğin, "myServer/myDatabase") tarafından oluşturulan kaynak adıdır.
  • kind
  • type
  • location
    • Konum alanları çeşitli biçimleri destekleyecek şekilde normalleştirilmiştir. Örneğin, East US 2 eşittir olarak kabul eastus2 edilir.
    • Konumdan bağımsız kaynaklar için geneli kullanın.
  • id
    • Değerlendirilen kaynağın kaynak kimliğini döndürür.
    • Örnek: /subscriptions/06be863d-0996-4d56-be22-384767287aa2/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type
    • Kaynakta etkin yönetilen kimliğin türünü döndürür.
  • tags
  • tags['<tagName>']
    • Bu köşeli ayraç söz dizimi kısa çizgi, nokta veya boşluk gibi noktalama işaretlerine sahip etiket adlarını destekler.
    • Burada, <tagName> koşulu doğrulamak için etiketin adıdır.
    • Örnekler: tags['Acct.CostCenter'] Burada Acct.CostCenter etiketin adıdır.
  • tags['''<tagName>''']
    • Bu köşeli ayraç söz dizimi, çift kesme işaretiyle kaçış işareti olan etiket adlarını destekler.
    • Burada ' <tagName> , koşulu doğrulamak için etiketin adıdır.
    • Örnek: tags['''My.Apostrophe.Tag'''] Burada 'My.Apostrophe.Tag' etiketin adıdır.
  • özellik diğer adları - bir liste için bkz. Diğer adlar.

Not

tags.<tagName>, tags[tagName] ve hala bir etiket alanı tags[tag.with.dots] bildirerek kabul edilebilir yöntemlerdir. Ancak, tercih edilen ifadeler yukarıda listelenen ifadelerdir.

Not

Diğer ad öğesine başvuran alan [ * ] ifadelerinde, dizideki her öğe mantıksal ve öğeler arasında ayrı ayrı değerlendirilir. Daha fazla bilgi için bkz. Dizi kaynak özelliklerine başvuru.

Parametrelerle etiketleri kullanma

Parametre değeri bir etiket alanına geçirebilirsiniz. Etiket alanına parametre geçirme, ilke ataması sırasında ilke tanımının esnekliğini artırır.

Aşağıdaki örnekte, concat tagName parametresinin değeri olarak adlandırılmış etiket için bir etiket alanı araması oluşturmak için kullanılır. Bu etiket yoksa, arama işlevini kullanarak denetimli kaynaklar üst kaynak grubunda ayarlanmış aynı adlandırılmış etiketin değerini kullanarak etiketi eklemek için modify etkisi resourcegroup() kullanılır.

{
    "if": {
        "field": "[concat('tags[', parameters('tagName'), ']')]",
        "exists": "false"
    },
    "then": {
        "effect": "modify",
        "details": {
            "operations": [{
                "operation": "add",
                "field": "[concat('tags[', parameters('tagName'), ']')]",
                "value": "[resourcegroup().tags[parameters('tagName')]]"
            }],
            "roleDefinitionIds": [
                "/providers/microsoft.authorization/roleDefinitions/4a9ae827-6dc8-4573-8ac7-8239d42aa03f"
            ]
        }
    }
}

Değer

Bir değerin belirli ölçütlere uygun olup olmadığını değerlendiren koşullar bir değer ifadesi kullanılarak düz olabilir. Değerler değişmez değerler, parametre değerleri veyadesteklenen şablon işlevlerinin döndürülen değerleri olabilir.

Uyarı

Şablon işlevinin sonucu bir hata ise ilke değerlendirmesi başarısız olur. Başarısız bir değerlendirme, örtülü bir reddetmedir. Daha fazla bilgi için bkz. şablon hatalarından kaçınma. Başarısız bir değerlendirmenin yeni veya güncelleştirilmiş kaynaklar üzerindeki etkisini önlemek için doNotEnforce'un enforcementMode'larını kullanarak yeni ilke tanımını test edin ve doğrular.

Değer örnekleri

Bu ilke kuralı örneği, işlevin ve döndürülen name özelliğinin sonucu ile benzer bir koşulu karşılaştırmak resourceGroup() için değer *netrg kullanır. Kural, adı ile sona eren Microsoft.Network/* herhangi bir kaynak grubunda türünde olmayan herhangi bir kaynağın olmadığını kabul *netrg ediyor.

{
    "if": {
        "allOf": [{
                "value": "[resourceGroup().name]",
                "like": "*netrg"
            },
            {
                "field": "type",
                "notLike": "Microsoft.Network/*"
            }
        ]
    },
    "then": {
        "effect": "deny"
    }
}

Bu ilke kuralı örneği, birden çok iç içe geçmiş işlevin sonucuna eşit olup olamayacak şekilde değer kullanır. true Kural, en az üç etiketi olmayan herhangi bir kaynağın kullanımını geriler.

{
    "mode": "indexed",
    "policyRule": {
        "if": {
            "value": "[less(length(field('tags')), 3)]",
            "equals": "true"
        },
        "then": {
            "effect": "deny"
        }
    }
}

Şablon hatalarından kaçınma

Değer olarak şablon işlevlerinin kullanımı, birçok karmaşık iç içe geçmiş işleve olanak sağlar. Şablon işlevinin sonucu bir hata ise ilke değerlendirmesi başarısız olur. Başarısız bir değerlendirme, örtülü bir reddetmedir. Belirli senaryolarda başarısız olan bir değer örneği:

{
    "policyRule": {
        "if": {
            "value": "[substring(field('name'), 0, 3)]",
            "equals": "abc"
        },
        "then": {
            "effect": "audit"
        }
    }
}

Yukarıdaki örnek ilke kuralı, adın ilk üç karakteriyle abc arasında karşılaştırma yapmak için substring() kullanır. Ad üç karakterden kısa olursa işlev substring() hatayla sonuç verir. Bu hata, ilkenin reddetme etkisine neden olur.

Bunun yerine, üç karakterden kısa bir adın hataya neden olması için adın ilk üç karakteri abc'ye eşit olup değildir diye kontrol etmek için if() işlevini kullanın:

{
    "policyRule": {
        "if": {
            "value": "[if(greaterOrEquals(length(field('name')), 3), substring(field('name'), 0, 3), 'not starting with abc')]",
            "equals": "abc"
        },
        "then": {
            "effect": "audit"
        }
    }
}

Düzeltilen ilke kuralıyla, üç karakterden az bir değer üzerinde bir almaya çalışmadan önce if() adın uzunluğunu substring() denetler. Ad çok kısa olursa " abc ile başlanmaz" değeri döndürülür ve abc ile karşılaştırıldı. Abc ile başlamaz kısa adı olan bir kaynak yine de ilke kuralını başarısız olur, ancak değerlendirme sırasında hataya neden olmaz.

Count

Bir dizinin kaç üyesinin belirli ölçütlere uygun olduğunu sayan koşullar, bir sayı ifadesi kullanılarak düz olabilir. Yaygın senaryolar, dizi üyelerinin 'en az bir', 'tam olarak bunlardan biri', 'hepsi' veya 'hiçbiri' bir koşulu karşılar mı olduğunu kontrol eder. Count, bir koşul ifadesi için her dizi üyesini değerlendirir ve ardından ifade işleciyle karşılaştırıldığında gerçek sonuçları toplar.

Alan sayısı

İstek yükünde bir dizi üyesinin bir koşul ifadesini kaç kez karşılayana kadar olduğunu sayma. Alan sayısı ifadelerinin yapısı şu şekildedir:

{
    "count": {
        "field": "<[*] alias>",
        "where": {
            /* condition expression */
        }
    },
    "<condition>": "<compare the count of true condition expression array members to this value>"
}

Aşağıdaki özellikler alan sayısı ile birlikte kullanılır:

  • count.field (gerekli): Dizinin yolunu içerir ve bir dizi diğer adı olması gerekir.
  • count.where (isteğe bağlı): Her diğer ad dizisi üyesi için ayrı ayrı [ * ] değerlendirilecek koşul count.field ifadesi. Bu özellik sağlanamıyorsa, 'alan' yoluna sahip tüm dizi üyeleri true olarak değerlendirilir. Bu özelliğin içinde herhangi bir koşul kullanılabilir. Mantıksal işleçler, karmaşık değerlendirme gereksinimleri oluşturmak için bu özelliğin içinde kullanılabilir.
  • <condition> (gerekli): Değer, count.where koşul ifadesini karşılatan öğe sayısıyla karşılaştırıldı. Sayısal bir koşul kullanılmalıdır.

Alan sayısı ifadeleri aynı alan dizisini tek bir policyRule tanımında en fazla üç kez numaralandırıyor olabilir.

Alan sayısı ifadesinin nasıl değerlendirildiklerine ilişkin ayrıntılı açıklama dahil olmak üzere Azure İlkesi dizi özellikleriyle çalışma hakkında daha fazla bilgi için bkz. Dizi kaynağı özelliklerine başvuru.

Değer sayısı

Bir dizinin kaç üyesinin bir koşulu karşılar olduğunu sayma. Dizisi değişmez dizi veya dizi parametresi başvurusu olabilir. Değer sayısı ifadelerinin yapısı şu şekildedir:

{
    "count": {
        "value": "<literal array | array parameter reference>",
        "name": "<index name>",
        "where": {
            /* condition expression */
        }
    },
    "<condition>": "<compare the count of true condition expression array members to this value>"
}

Aşağıdaki özellikler değer sayısı ile birlikte kullanılır:

  • count.value (gerekli): Değerlendirilecek dizi.
  • count.name (gerekli): İngilizce harflerden ve rakamlardan oluşan dizin adı. Geçerli yinelemede değerlendirilen dizi üyesinin değeri için bir ad tanımlar. Ad, koşulun içindeki geçerli değere başvurmak için count.where kullanılır. Count ifadesi başka bir sayı ifadesinin alt asinde değilse isteğe bağlıdır. Sağlanmazsa, dizin adı örtülü olarak olarak "default" ayarlanır.
  • count.where (isteğe bağlı): Her dizi üyesi için ayrı ayrı değerlendirilecek koşul count.value ifadesi. Bu özellik sağ değilse, tüm dizi üyeleri true olarak değerlendirilir. Bu özelliğin içinde herhangi bir koşul kullanılabilir. Mantıksal işleçler, karmaşık değerlendirme gereksinimleri oluşturmak için bu özelliğin içinde kullanılabilir. Geçerli numaralandı olan dizi üyesinin değerine, geçerli işlev çağrılarak erişilebilir.
  • <condition> (gerekli): Değer, koşul ifadesine sahip olan öğe sayısıyla count.where karşılaştırıldı. Sayısal bir koşul kullanılmalıdır.

Aşağıdaki sınırlar zorunlu kılındı:

  • Tek bir policyRule tanımında en fazla 10 değer sayısı ifadesi kullanılabilir.
  • Her değer sayısı ifadesi en fazla 100 yineleme gerçekleştirebilirsiniz. Bu sayı, herhangi bir üst değer sayısı ifadesi tarafından gerçekleştirilen yineleme sayısını içerir.

Geçerli işlev

İşlev current() yalnızca koşulun içinde count.where kullanılabilir. Şu anda sayı ifadesi değerlendirmesi tarafından numaralandı olan dizi üyesinin değerini döndürür.

Değer sayısı kullanımı

  • current(<index name defined in count.name>). Örneğin: current('arrayMember').
  • current(). Yalnızca değer sayısı ifadesi başka bir sayı ifadesinin alt değeri değilse izin verilir. Yukarıdakiyle aynı değeri döndürür.

Çağrı tarafından döndürülen değer bir nesne ise özellik erişimcileri de desteklemektedir. Örneğin: current('objectArrayMember').property.

Alan sayısı kullanımı

  • current(<the array alias defined in count.field>). Örneğin, current('Microsoft.Test/resource/enumeratedArray[*]').
  • current(). Yalnızca alan sayısı ifadesi başka bir sayı ifadesinin alt ifadesi değilse izin verilir. Yukarıdakiyle aynı değeri döndürür.
  • current(<alias of a property of the array member>). Örneğin, current('Microsoft.Test/resource/enumeratedArray[*].property').

Alan sayısı örnekleri

Örnek 1: Bir dizinin boş olup olduğunu denetleme

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]"
    },
    "equals": 0
}

Örnek 2: Koşul ifadesini karşılamak için yalnızca bir dizi üyesi olup ola

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
            "equals": "My unique description"
        }
    },
    "equals": 1
}

Örnek 3: Koşul ifadesini karşılamak için en az bir dizi üyesi olup ola

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
            "equals": "My common description"
        }
    },
    "greaterOrEquals": 1
}

Örnek 4: Tüm nesne dizisi üyelerinin koşul ifadesini karşılayana kadar

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
            "equals": "description"
        }
    },
    "equals": "[length(field('Microsoft.Network/networkSecurityGroups/securityRules[*]'))]"
}

Örnek 5: En az bir dizi üyesinin koşul ifadesinde birden çok özellikle eş olup ola

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
            "allOf": [
                {
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
                    "equals": "Inbound"
                },
                {
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
                    "equals": "Allow"
                },
                {
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
                    "equals": "3389"
                }
            ]
        }
    },
    "greater": 0
}

Örnek 6: Bir şablon işlevinde o anda numaralandı olan dizi üyesinin değerine current() where erişmek için koşulların içinde işlevini kullanın. Bu koşul, bir sanal ağın 10.0.0.0/24 CIDR aralığı altında olmayan bir adres ön eki içerdiğini denetler.

{
    "count": {
        "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
        "where": {
          "value": "[ipRangeContains('10.0.0.0/24', current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
          "equals": false
        }
    },
    "greater": 0
}

Örnek 7: field() Şu anda where numaralandı olan dizi üyesinin değerine erişmek için koşulların içinde işlevini kullanın. Bu koşul, bir sanal ağın 10.0.0.0/24 CIDR aralığı altında olmayan bir adres ön eki içerdiğini denetler.

{
    "count": {
        "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
        "where": {
          "value": "[ipRangeContains('10.0.0.0/24', first(field(('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]')))]",
          "equals": false
        }
    },
    "greater": 0
}

Değer sayısı örnekleri

Örnek 1: Kaynak adının verilen ad desenlerinin herhangi biri ile eş olup olamay olduğunu kontrol edin.

{
    "count": {
        "value": [ "prefix1_*", "prefix2_*" ],
        "name": "pattern",
        "where": {
            "field": "name",
            "like": "[current('pattern')]"
        }
    },
    "greater": 0
}

Örnek 2: Kaynak adının verilen ad desenlerinin herhangi biri ile eş olup olamay olduğunu kontrol edin. İşlev current() bir dizin adı belirtmez. Sonuç, önceki örnekle aynıdır.

{
    "count": {
        "value": [ "prefix1_*", "prefix2_*" ],
        "where": {
            "field": "name",
            "like": "[current()]"
        }
    },
    "greater": 0
}

Örnek 3: Kaynak adının bir dizi parametresi tarafından sağlanan ad desenlerinin herhangi biri ile eş olup olamayını kontrol edin.

{
    "count": {
        "value": "[parameters('namePatterns')]",
        "name": "pattern",
        "where": {
            "field": "name",
            "like": "[current('pattern')]"
        }
    },
    "greater": 0
}

Örnek 4: Sanal ağ adresi ön eklerinin herhangi biri onaylı ön ekler listesinde yer alıyor mu?

{
    "count": {
        "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
        "where": {
            "count": {
                "value": "[parameters('approvedPrefixes')]",
                "name": "approvedPrefix",
                "where": {
                    "value": "[ipRangeContains(current('approvedPrefix'), current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
                    "equals": true
                },
            },
            "equals": 0
        }
    },
    "greater": 0
}

Örnek 5: Tüm ayrılmış NSG kurallarının bir NSG'de tanımlandıklarını kontrol edin. Ayrılmış NSG kurallarının özellikleri nesneleri içeren bir dizi parametresinde tanımlanır.

Parametre değeri:

[
    {
        "priority": 101,
        "access": "deny",
        "direction": "inbound",
        "destinationPortRange": 22
    },
    {
        "priority": 102,
        "access": "deny",
        "direction": "inbound",
        "destinationPortRange": 3389
    }
]

Ilkesi:

{
    "count": {
        "value": "[parameters('reservedNsgRules')]",
        "name": "reservedNsgRule",
        "where": {
            "count": {
                "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
                "where": {
                    "allOf": [
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].priority",
                            "equals": "[current('reservedNsgRule').priority]"
                        },
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
                            "equals": "[current('reservedNsgRule').access]"
                        },
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
                            "equals": "[current('reservedNsgRule').direction]"
                        },
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
                            "equals": "[current('reservedNsgRule').destinationPortRange]"
                        }
                    ]
                }
            },
            "equals": 1
        }
    },
    "equals": "[length(parameters('reservedNsgRules'))]"
}

Etki

Azure İlkesi aşağıdaki etki türlerini destekler:

  • Ekleme: Tanımlı alan kümesi isteğine eklenir
  • Denetim: Etkinlik günlüğünde bir uyarı olayı üretir ancak isteği başarısız olmaz
  • AuditIfNotExists: ilgili kaynak yoksa etkinlik günlüğünde bir uyarı olayı üretir
  • Reddet: Etkinlik günlüğünde bir olay oluşturur ve istek başarısız olur
  • DeployIfNotExists: zaten yoksa ilgili bir kaynağı dağıtır
  • Devre dışı: İlke kuralına uyumluluk için kaynakları değerlendirmez
  • Değiştirme: Tanımlı etiketleri bir kaynak veya abonelikten ekler, günceller veya kaldırır
  • EnforceOPAConstraint (kullanım dışı): Azure'da otomatik olarak yönetilen Kubernetes kümeleri için Open Policy Agent erişim denetleyicisini Gatekeeper v3 ile yapılandırıyor
  • EnforceRegoPolicy (kullanım dışı): açık ilkede Açık İlke Aracısı erişim denetleyicisini ağ geçidi denetleyicisi v2 ile Azure Kubernetes Service

Her etki, değerlendirme sırası, özellikler ve örneklerle ilgili tüm ayrıntılar için bkz. Azure İlkesi Anlama.

İlke işlevleri

İşlevler, bir ilke kuralına ek mantıklar tanıtmak için kullanılabilir. Bunlar, bir ilke tanımının ilke kuralında ve bir girişimde ilke tanımları için atanan parametre değerleri içinde çözümlenir.

Tüm Resource Manager şablon işlevleri, aşağıdaki işlevler ve kullanıcı tanımlı işlevler dışında bir ilke kuralı içinde kullanılabilir:

  • copyIndex()
  • deployment()
  • list*
  • newGuid()
  • pickZones()
  • providers()
  • reference()
  • resourceId()
  • variables()

Not

Bu işlevler, details.deployment.properties.template deployIfNotExists ilke tanımında şablon dağıtımının bir bölümünde hala kullanılabilir.

Aşağıdaki işlev bir ilke kuralında kullanılabilir, ancak bir ilke şablonunda (ARM şablonu Azure Resource Manager kullanımdan farklıdır:

  • utcNow()- Arm şablonunun aksine, bu özellik defaultValue dışında kullanılabilir.
    • Universal ISO 8601 DateTime biçiminde geçerli tarih ve saat olarak ayarlanmış bir dize yyyy-MM-ddTHH:mm:ss.fffffffZ döndürür.

Aşağıdaki işlevler yalnızca ilke kurallarında kullanılabilir:

  • addDays(dateTime, numberOfDaysToAdd)

    • dateTime:[Required] string - Universal ISO 8601 DateTime biçimindeki 'yyyy-MM-ddTHH:mm:ss dizesi. FFFFFFFZ'
    • numberOfDaysToAdd:[Gerekli] tamsayı - Eklanacak gün sayısı
  • field(fieldName)

    • fieldName: [Required] string - Alın edecek alanın adı
    • If koşulu tarafından değerlendirilen kaynaktan bu alanın değerini döndürür.
    • field , değerlendirilen kaynaktaki alanlara başvuru yapmak için öncelikli olarak AuditIfNotExists ve DeployIfNotExists ile birlikte kullanılır. Bu kullanım örneği DeployIfNotExists örneğinde görülebilir.
  • requestContext().apiVersion

    • İlke değerlendirmesini tetikleyen isteğin API sürümünü döndürür (örneğin: 2021-09-01 ). Bu değer, kaynak oluşturma/güncelleştirme ile ilgili değerlendirmeler için PUT/PATCH isteğinde kullanılan API sürümüdür. Mevcut kaynaklarda uyumluluk değerlendirmesi sırasında her zaman en son API sürümü kullanılır.
  • policy()

    • Değerlendirilen ilke hakkında aşağıdaki bilgileri döndürür. Özelliklere döndürülen nesneden erişilebilir (örnek: [policy().assignmentId] ).

      {
        "assignmentId": "/subscriptions/ad404ddd-36a5-4ea8-b3e3-681e77487a63/providers/Microsoft.Authorization/policyAssignments/myAssignment",
        "definitionId": "/providers/Microsoft.Authorization/policyDefinitions/34c877ad-507e-4c82-993e-3452a6e0ad3c",
        "setDefinitionId": "/providers/Microsoft.Authorization/policySetDefinitions/42a694ed-f65e-42b2-aa9e-8052e9740a92",
        "definitionReferenceId": "StorageAccountNetworkACLs"
      }
      
  • ipRangeContains(range, targetRange)

    • range:[Required] string - targetRange'in içinde olup olduğunu kontrol etmek için BIR IP adresi aralığı belirten dize.
    • targetRange:[Required] string - aralığına dahil edilen şekilde doğrulanması için bir IP adresi aralığı belirten dize.
    • ARALıK IP adresi aralığının targetRange IP adresi aralığını içerdiğine yönelik bir boole döndürür. Boş aralıklara veya IP aileleri arasında karıştırmaya izin verilmez ve değerlendirme hatasına neden olur.

    Desteklenen biçimler:

    • Tek IP adresi (örnekler: 10.0.0.0 , 2001:0DB8::3:FFFE )
    • CIDR aralığı (örnekler: 10.0.0.0/24 , 2001:0DB8::/110 )
    • Başlangıç ve bitiş IP adreslerine göre tanımlanan aralık (örnekler: 192.168.0.1-192.168.0.9 , 2001:0DB8::-2001:0DB8::3:FFFF )
  • current(indexName)

İlke işlevi örneği

Bu ilke kuralı örneği, kaynak adını kaynak grubu adıyla başlamaya zorlanan bir koşul oluşturmak üzere dizi ve nesne işleviyle birlikte name özelliğini almak resourceGroup için kaynak işlevini concat like kullanır.

{
    "if": {
        "not": {
            "field": "name",
            "like": "[concat(resourceGroup().name,'*')]"
        }
    },
    "then": {
        "effect": "deny"
    }
}

Diğer adlar

Bir kaynak türünün belirli özelliklerine erişmek için özellik diğer adlarını kullanırsınız. Diğer adlar, bir kaynakta bir özellik için izin verilen değerleri veya koşulları kısıtlamaya olanak sağlar. Her diğer ad, belirli bir kaynak türü için farklı API sürümlerindeki yollara eşler. İlke değerlendirmesi sırasında, ilke altyapısı bu API sürümünün özellik yolunu alır.

Diğer ad listesi her zaman büyüyor. Azure İlkesi tarafından desteklenen diğer adları bulmak için aşağıdaki yöntemlerden birini kullanın:

  • Azure İlkesi için Visual Studio Code uzantısı (önerilir)

    Kaynak Azure İlkesi diğer adlarını görüntülemek Visual Studio Code bulmak için Visual Studio Code uzantısını kullanın.

    Diğer ad Azure İlkesi bir özelliğin üzerine Visual Studio Code uzantının ekran görüntüsü.

  • Azure PowerShell

    # Login first with Connect-AzAccount if not using Cloud Shell
    
    # Use Get-AzPolicyAlias to list available providers
    Get-AzPolicyAlias -ListAvailable
    
    # Use Get-AzPolicyAlias to list aliases for a Namespace (such as Azure Compute -- Microsoft.Compute)
    (Get-AzPolicyAlias -NamespaceMatch 'compute').Aliases
    

    Not

    Değiştirme etkisiyle 4.6.0 veya sonraki bir Azure PowerShell diğer adları bulmak için aşağıdaki komutu kullanın:

    Get-AzPolicyAlias | Select-Object -ExpandProperty 'Aliases' | Where-Object { $_.DefaultMetadata.Attributes -eq 'Modifiable' }
    
  • Azure CLI

    # Login first with az login if not using Cloud Shell
    
    # List namespaces
    az provider list --query [*].namespace
    
    # Get Azure Policy aliases for a specific Namespace (such as Azure Compute -- Microsoft.Compute)
    az provider show --namespace Microsoft.Compute --expand "resourceTypes/aliases" --query "resourceTypes[].aliases[].name"
    
  • REST API / ARMClient

    GET https://management.azure.com/providers/?api-version=2019-10-01&$expand=resourceTypes/aliases
    

[*] diğer adını anlama

Kullanılabilir diğer adlardan birkaçı 'normal' ad olarak görünen bir sürüme ve buna eklenmiş başka bir [*] sürüme sahip. Örneğin:

  • Microsoft.Storage/storageAccounts/networkAcls.ipRules
  • Microsoft.Storage/storageAccounts/networkAcls.ipRules[*]

'normal' diğer adı alanı tek bir değer olarak temsil eder. Bu alan, değer kümelerinin tamamının tam olarak tanımlandığı, daha fazla ve daha az değil tam olarak tanımlandığı tam eşleşme karşılaştırma senaryoları için kullanılır.

Diğer [*] ad, bir dizi kaynak özelliğinin öğelerinden seçilen değerler koleksiyonunu temsil eder. Örneğin:

Diğer ad Seçilen değerler
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] Dizinin ipRules öğeleri.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action Dizinin her action öğesinden özelliğinin ipRules değerleri.

Bir alan koşulunda kullanılırken, dizi diğer adları her bir dizi öğesini bir hedef değerle karşılaştırmayı mümkün hale sağlar. Count ifadesiyle birlikte kullanılırken şunları yapmak mümkündür:

  • Bir dizinin boyutunu denetleme
  • Dizi öğelerinde all\any\nkarmaşık bir koşula uygun olup değildir
  • Tam olarak n dizi öğelerinin karmaşık bir koşula uygun olup değildir

Daha fazla bilgi ve örnekler için bkz. Dizi kaynak özelliklerine başvuru.

Sonraki adımlar