Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Правило политики состоит из блоков if и then. В блоке if определяется одно или несколько условий, определяющих, когда политика применяется. В этих условиях можно использовать логические операторы, чтобы точно определить сценарии для использования политики.
Полные сведения о каждом эффекте, порядке оценки, свойств и примеров см. в основных принципах влияния определений политик Azure.
В блоке then определяется эффект, который происходит при выполнении условий if .
{
"if": {
<condition> | <logical operator>
},
"then": {
"effect": "deny | audit | modify | denyAction | append | auditIfNotExists | deployIfNotExists | disabled"
}
}
Дополнительные сведения о policyRule см. в схеме определения политики.
Логические операторы
Поддерживаемые логические операторы:
"not": {condition or operator}"allOf": [{condition or operator},{condition or operator}]"anyOf": [{condition or operator},{condition or operator}]
Синтаксис not преобразует результат условия. Синтаксис allOf (аналогично логической and операции) требует, чтобы все условия были верными. Для anyOf синтаксиса (аналогичной логической or операции) требуется одно или несколько условий.
Логические операторы можно вкладывать. В следующем примере показана not операция, вложенная в allOf операцию.
"if": {
"allOf": [
{
"not": {
"field": "tags",
"containsKey": "application"
}
},
{
"field": "type",
"equals": "Microsoft.Storage/storageAccounts"
}
]
},
Условия
Условие определяет, соответствует ли значение определенным критериям. Поддерживаемые условия:
"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"
Для less, lessOrEqualsи greater, greaterOrEqualsесли тип свойства не соответствует типу условия, возникает ошибка. Сравнение строк выполняется с помощью InvariantCultureIgnoreCase.
При использовании условий containsnotContains подстановочный знак (*) не может быть указан в значении.
При использовании условий likenotLike в значении укажите подстановочный знак (*). Значение не должно содержать более одного подстановочного знака.
При использовании условий match и notMatch укажите хэштег (#) для сопоставления цифры, вопросительный знак (?) для сопоставления буквы, точку (.) для сопоставления любого символа, а любой другой символ, чтобы сопоставить этот фактический символ. Хотя match и notMatch учитывают регистр, все остальные условия, которые оценивают stringValue, регистр не учитывают. Альтернативные варианты без учета регистра доступны в matchInsensitively и notMatchInsensitively.
Поля
Условия, которые оценивают соответствие значений свойств в полезных данных запроса ресурса определенным критериям, могут быть сформированы с помощью field выражения. Поддерживаются следующие поля:
namefullName- Возвращает полное имя ресурса. Полное имя ресурса — это имя ресурса, заданное любыми родительскими именами ресурсов (например
myServer/myDatabase).
- Возвращает полное имя ресурса. Полное имя ресурса — это имя ресурса, заданное любыми родительскими именами ресурсов (например
kindtypelocation- Поля расположения нормализуются для поддержки различных форматов. Например,
East US 2считается равнымeastus2. - Используйте глобальный для ресурсов, которые являются не зависящими от расположения.
- Поля расположения нормализуются для поддержки различных форматов. Например,
id- Возвращает идентификатор вычисляемого ресурса.
- Пример:
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
identity.type- Возвращает тип управляемого удостоверения, включённого в ресурсе.
- Допустимые значения из управляемого удостоверения:
None,SystemAssigned,SystemAssigned, UserAssignedиUserAssigned. -
identity.typeможно использовать с любыми поддерживаемыми условиями правила политики. Например, политика с эффектом запрета может блокировать запросы на основе наличия удостоверения или на основе определенного значения типа удостоверения. Пример правила политики, которое проверяет наличиеidentity.type, — это встроенное определение политики «Учетная запись службы автоматизации должна иметь управляемое удостоверение» с идентификаторомdea83a72-443c-4292-83d5-54a2f98749c0.
tagstags['<tagName>']- Этот синтаксис скобки поддерживает имена тегов, которые имеют знак препинания, такие как дефис, период или пробел.
- Где
tagNameимя тега для проверки условия. - Примеры:
tags['Acct.CostCenter']гдеAcct.CostCenterнаходится имя тега.
tags['''<tagName>''']- Синтаксис скобок поддерживает имена тегов, содержащие апострофы, путем экранирования двойными апострофами.
- Где
tagNameимя тега для проверки условия. - Пример:
tags['''My.Apostrophe.Tag''']где'My.Apostrophe.Tag'находится имя тега.
-
tags.<tagName>,tags[tagName]иtags[tag.with.dots]являются допустимыми способами объявленияtagsполя, но предпочтительные выражения являются предыдущими примерами.
псевдонимы свойств
- Список см. в разделе "Псевдонимы".
- В
fieldвыражениях, ссылающихся на псевдоним массива[*], каждый элемент в массиве вычисляется по отдельности с логическимandмежду элементами. Для получения дополнительной информации см. Сведения о свойствах ресурсов массива.
Выражения полей
Условия, использующие field выражения, могут заменить устаревший синтаксис "source": "action"определения политики, который использовался для операций записи. Например, следующий код больше не поддерживается:
{
"source": "action",
"like": "Microsoft.Network/publicIPAddresses/*"
}
Но требуемое поведение можно достичь с помощью field логики:
{
"field": "type",
"equals": "Microsoft.Network/publicIPAddresses"
}
Использование тегов с параметрами
Значение параметра можно передать в поле тега. Передача параметра в поле тега повышает гибкость определения политики во время назначения политики.
В следующем примере concat используется для создания поиска по полям тегов для тега, имя которого задано значением параметра tagName. Если этот тег не существует, используется эффект modify для добавления тега, используя значение одноименного тега, установленного в родительской группе ресурсов, к которой относится проверяемый ресурс, с помощью функции подстановки resourcegroup().
{
"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"
]
}
}
}
Значение
Условия, которые оценивают, соответствует ли значение определенным критериям, может быть сформировано с помощью value выражения. Значения могут быть литералами, значениями параметров или возвращаемыми значениями любых поддерживаемых функций шаблона.
Предупреждение
Если результатом функции шаблона является ошибка, оценка политики завершится сбоем. Неудачная оценка является неявной deny. Дополнительные сведения см. в разделе Аvoiding template failures (Предотвращение сбоев шаблонов). Используйте режим принудительного исполненияdoNotEnforce, чтобы избежать влияния неудачной оценки на новые или обновленные ресурсы при тестировании и проверке нового определения политики.
Примеры значений
Этот пример правила политики использует value для сравнения результата функции resourceGroup() и возвращаемого свойства name с условием like в *netrg. Правило запрещает любой ресурс, не являющийся Microsoft.Network/*type, в любой группе ресурсов, имя которой заканчивается на *netrg.
{
"if": {
"allOf": [
{
"value": "[resourceGroup().name]",
"like": "*netrg"
},
{
"field": "type",
"notLike": "Microsoft.Network/*"
}
]
},
"then": {
"effect": "deny"
}
}
Этот пример правила политики использует value для проверки результата нескольких вложенных функций equalstrue. Правило запрещает любой ресурс, который не имеет по крайней мере трех тегов.
{
"mode": "indexed",
"policyRule": {
"if": {
"value": "[less(length(field('tags')), 3)]",
"equals": "true"
},
"then": {
"effect": "deny"
}
}
}
Предотвращение сбоев шаблонов
Использование функций шаблона позволяет value выполнять множество сложных вложенных функций. Если результатом функции шаблона является ошибка, оценка политики завершится сбоем. Неудачная оценка является неявной deny. Пример value, который выходит из строя в определенных сценариях:
{
"policyRule": {
"if": {
"value": "[substring(field('name'), 0, 3)]",
"equals": "abc"
},
"then": {
"effect": "audit"
}
}
}
В предыдущем примере правила политики используется подстрока() для сравнения первых трех символов nameabc. Если name значение меньше трех символов, substring() функция приводит к ошибке. Эта ошибка вызывает, что политика приобретает статус deny.
Вместо этого используйте функцию if(), чтобы проверить, совпадают ли его первые три символа с nameabc, не допуская, чтобы name короче трёх символов вызывал ошибку.
{
"policyRule": {
"if": {
"value": "[if(greaterOrEquals(length(field('name')), 3), substring(field('name'), 0, 3), 'not starting with abc')]",
"equals": "abc"
},
"then": {
"effect": "audit"
}
}
}
С измененным правилом политики, if() проверяет длину name перед попыткой получить substring() для значения, содержащего менее трех символов. Если name слишком короткий, возвращается значение "не начинается с abc", и оно сравнивается с abc. Ресурс с коротким именем, который не начинается с abc, по-прежнему нарушает правило политики, но больше не вызывает ошибку при оценке.
Счет
Условия, которые подсчитывают, сколько элементов массива соответствует определенным критериям, можно сформировать с помощью count выражения. Распространенные сценарии проверяют, соответствует ли хотя бы одиниз элементов массива, точно один из них или ни один из элементов массива. Компонент count оценивает каждый элемент массива по условному выражению и суммирует истинные результаты, которые затем сравниваются с оператором этого выражения.
Число полей
Подсчитайте, сколько элементов массива в полезных данных запроса выполняют условие. Структура выражений field count :
{
"count": {
"field": "<[*] alias>",
"where": {
/* condition expression */
}
},
"<condition>": "<compare the count of true condition expression array members to this value>"
}
Для field count используются следующие свойства:
-
count.field(обязательно): содержит путь к массиву и должен быть псевдонимом массива. (необязательно): выражение условия для индивидуального вычисления каждого элемента массива с псевдонимом . Если это свойство не указано, все члены массива с путем поля оцениваются как true. Любое условие можно использовать внутри этого свойства. Логические операторы можно использовать внутри этого свойства для создания сложных требований к оценке. -
condition(обязательно): значение сравнивается с количеством элементов, которые соответствуют выражениюcount.whereусловия. Необходимо использовать числовое условие .
Дополнительные сведения о работе со свойствами массива в политике Azure, включая подробное описание выражения field count и его оценки, см. в разделе Ссылки на свойства ресурса массива.
Число значений
Подсчитывайте количество элементов массива, удовлетворяющих условию. Массив может быть литеральным массивом или ссылкой на параметр массива. Структура выражений value count :
{
"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>"
}
Для value count используются следующие свойства:
-
count.value(обязательно): массив для вычисления. -
count.name(обязательно): имя индекса, состоящее из английских букв и цифр. Определяет имя значения элемента массива, вычисляемого в текущей итерации. Имя используется для ссылки на текущееcount.whereзначение внутри условия. Необязательный, еслиcountвыражение не является дочерним элементом другогоcountвыражения. Если индекс не указан, имя индекса устанавливается по умолчанию на"default". -
count.where(необязательно): выражение условия для индивидуального вычисления для каждого элемента массиваcount.value. Если это свойство не указано, все члены массива оцениваются как true. Любое условие можно использовать внутри этого свойства. Логические операторы можно использовать внутри этого свойства для создания сложных требований к оценке. К значению текущего элемента массива можно получить доступ, вызвав функцию current. -
condition(обязательно): значение сравнивается с количеством элементов, которые соответствуют выражениюcount.whereусловия. Необходимо использовать числовое условие .
Текущая функция
Функция current() доступна только внутри count.where условия. Возвращает значение элемента массива, который в настоящее время перечисляется в процессе вычисления выражения count.
Использование счетчика значений
-
current(<index name defined in count.name>). Например:current('arrayMember'). -
current(). Допускается только в том случае, еслиvalue countвыражение не является дочерним элементом другогоcountвыражения. Возвращает то же значение, что и в предыдущем примере.
Если значение, возвращаемое вызовом, является объектом, поддерживаются методы доступа к свойствам. Например: current('objectArrayMember').property.
Использование счетчика полей
-
current(<the array alias defined in count.field>). Например:current('Microsoft.Test/resource/enumeratedArray[*]'). -
current(). Допускается только в том случае, еслиfield countвыражение не является дочерним элементом другогоcountвыражения. Возвращает то же значение, что и в предыдущих примерах. -
current(<alias of a property of the array member>). Например:current('Microsoft.Test/resource/enumeratedArray[*].property').
Примеры подсчета полей
Пример 1. Проверка пустости массива
{
"count": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*]"
},
"equals": 0
}
Пример 2. Проверка наличия только одного члена массива для соответствия выражению условия
{
"count": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
"where": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
"equals": "My unique description"
}
},
"equals": 1
}
Пример 3. Проверка наличия по крайней мере одного члена массива для соответствия выражению условия
{
"count": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
"where": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
"equals": "My common description"
}
},
"greaterOrEquals": 1
}
Пример 4. Убедитесь, что все члены массива объектов соответствуют выражению условия
{
"count": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
"where": {
"field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
"equals": "description"
}
},
"equals": "[length(field('Microsoft.Network/networkSecurityGroups/securityRules[*]'))]"
}
Пример 5. Убедитесь, что по крайней мере один элемент массива соответствует нескольким свойствам в выражении условия
{
"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
}
Пример 6. Используйте current() функцию внутри where условий для доступа к значению текущего перечисленного элемента массива в функции шаблона. Это условие проверяет, содержит ли виртуальная сеть префикс адреса, не соответствующий диапазону CIDR 10.0.0.0/24.
{
"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
}
Пример 7. Используйте field() функцию внутри where условий для доступа к значению текущего перечисленного элемента массива. Это условие проверяет, содержит ли виртуальная сеть префикс адреса, не соответствующий диапазону CIDR 10.0.0.0/24.
{
"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
}
Примеры подсчета значений
Пример 1. Проверьте, соответствует ли имя ресурса любому из заданных шаблонов имен.
{
"count": {
"value": [
"prefix1_*",
"prefix2_*"
],
"name": "pattern",
"where": {
"field": "name",
"like": "[current('pattern')]"
}
},
"greater": 0
}
Пример 2. Проверьте, соответствует ли имя ресурса любому из указанных шаблонов имен. Функция current() не указывает имя индекса. Результат совпадает с предыдущим примером.
{
"count": {
"value": [
"prefix1_*",
"prefix2_*"
],
"where": {
"field": "name",
"like": "[current()]"
}
},
"greater": 0
}
Пример 3. Проверьте, соответствует ли имя ресурса любому из заданных шаблонов имен, предоставляемых параметром массива.
{
"count": {
"value": "[parameters('namePatterns')]",
"name": "pattern",
"where": {
"field": "name",
"like": "[current('pattern')]"
}
},
"greater": 0
}
Пример 4. Проверьте, нет ли префиксов адреса виртуальной сети в списке утвержденных префиксов.
{
"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
}
Пример 5. Проверьте, что все зарезервированные правила NSG определены в NSG. Свойства зарезервированных правил NSG определяются в параметре массива, содержащего объекты.
Значение параметра:
[
{
"priority": 101,
"access": "deny",
"direction": "inbound",
"destinationPortRange": 22
},
{
"priority": 102,
"access": "deny",
"direction": "inbound",
"destinationPortRange": 3389
}
]
Политика:
{
"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'))]"
}
Функции политики
Функции можно использовать для внедрения более логики в правило политики. Функции разрешаются в правиле определения политики и в значениях параметров, назначенных определениям политик в инициативе.
Все функции шаблона Resource Manager доступны для использования в правиле политики, за исключением следующих функций и определяемых пользователем функций:
copyIndex()dateTimeAdd()dateTimeFromEpochdateTimeToEpochdeployment()environment()extensionResourceId()-
lambda()Дополнительные сведения см. в лямбда listAccountSas()listKeys()listSecrets()list*managementGroup()newGuid()pickZones()providers()reference()resourceId()subscriptionResourceId()tenantResourceId()tenant()variables()
Примечание
Эти функции по-прежнему доступны в details.deployment.properties.template пределах развертывания шаблона в deployIfNotExists определении политики.
Следующая функция доступна для использования в правиле политики, но отличается от использования в шаблоне Azure Resource Manager (шаблон ARM):
-
utcNow()— В отличие от шаблона ARM, это свойство можно использовать вне defaultValue.- Возвращает строку с текущими датой и временем в универсальном формате даты и времени ISO 8601
yyyy-MM-ddTHH:mm:ss.fffffffZ.
- Возвращает строку с текущими датой и временем в универсальном формате даты и времени ISO 8601
Следующие функции доступны только в правилах политики:
addDays(dateTime, numberOfDaysToAdd)-
dateTime: [Required] строка — строка в формате универсального стандарта ISO 8601 DateTimeyyyy-MM-ddTHH:mm:ss.FFFFFFFZ. -
numberOfDaysToAdd: [Обязательно] целое число — количество дней для добавления.
-
field(fieldName)-
fieldName: [обязательный] строка — имя поля для извлечения - Возвращает значение этого поля из ресурса, вычисляемого условием
if. -
fieldв основном используется вместе сauditIfNotExistsиdeployIfNotExistsдля ссылки на поля ресурса, которые оцениваются. Пример этого использования можно увидеть в примере DeployIfNotExists.
-
requestContext().apiVersion- Возвращает версию API запроса, активировающего оценку политики (например:
2021-09-01). Это значение — версия API, используемая в запросе PUT/PATCH для оценки при создании и обновлении ресурсов. Последняя версия API всегда используется во время оценки соответствия существующим ресурсам.
- Возвращает версию API запроса, активировающего оценку политики (например:
requestContext().identityidtyp: возвращает данные о вызывающем запрос пользователе, инициировавшем оценку политики (например:user). Допустимые значения:app,user,null.{ "value": "[tryGet(requestContext().identity, 'idtyp')]", "equals": "user" }appid: возвращает идентификатор клиентского приложения, из который был выполнен запрос (например, идентификатор приложения портала){ "value": "[tryGet(requestContext().identity, 'appid')]", "notIn": "[parameters('allowedClientAppIds')]" }acrs: возвращает, прошел ли запрос проверку подлинности с помощью многофакторной проверки подлинности (MFA){ "value": "p1", "notIn": "[split(requestContext().identity.acrs, ',')]" }
policy()Возвращает следующие сведения о оценочной политике. К свойствам можно получить доступ из возвращаемого объекта (например:
[policy().assignmentId]).{ "assignmentId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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: [обязательный] строка — строка, указывающая диапазон IP-адресов для проверки, входит ли targetRange в этот диапазон. -
targetRange: [Обязательный] параметр string — строка, задающая диапазон IP-адресов для проверки их принадлежности к диапазону. - Возвращает логическое значение, определяющее, содержит ли диапазон IP-адресов range в себе диапазон IP-адресов targetRange. Пустые диапазоны или сочетание между семействами IP-адресов не допускается и приводит к сбою оценки.
Поддерживаемые форматы:
- Один IP-адрес (примеры:
10.0.0.0,2001:0DB8::3:FFFE) - Диапазон CIDR (примеры:
10.0.0.0/24,2001:0DB8::/110) - Диапазон, определенный начальными и конечными IP-адресами (примеры:
192.168.0.1-192.168.0.9,2001:0DB8::-2001:0DB8::3:FFFF)
-
current(indexName)- Специальная функция, которая может использоваться исключительно внутри count expressions.
Пример функции политики
Этот пример правила политики использует функцию ресурса resourceGroup для получения свойства name, в сочетании с функцией массива и объекта concat для создания условия like, которое требует, чтобы имя ресурса начиналось с имени группы ресурсов.
{
"if": {
"not": {
"field": "name",
"like": "[concat(resourceGroup().name,'*')]"
}
},
"then": {
"effect": "deny"
}
}
Ограничения правил политики
Ограничения, принудительно применяемые во время разработки
Ограничения на структуру правил политики применяются во время разработки или назначения политики. Попытки создать или назначить определения политик, которые превышают эти ограничения, терпят неудачу.
| Предел | Значение | Сведения |
|---|---|---|
Выражения условий в условии if |
4096 | |
Выражения условий в блоке then |
128 | Применимо к existenceCondition, auditIfNotExists и deployIfNotExists политикам |
| Функции политики по правилу политики | 2048 | |
| Число параметров в функции политики | 128 | Пример: [function('parameter1', 'parameter2', ...)] |
| Глубина вложенных функций политики | 64 | Пример: [function(nested1(nested2(...)))] |
| Длина строки выражения для функций политики | 81920 | Пример: длина "[function(....)]" |
Field count выражения для каждого массива |
5 | |
Value count выражения для правила политики |
10 | |
Value count Число итерации выражений |
100 | Вложенные Value count выражения также включают число итерации родительского выражения. |
Ограничения, принудительно применяемые во время оценки
Ограничивает размер объектов, обработанных функциями политики во время оценки политики. Эти ограничения не всегда могут быть применены во время разработки, так как они зависят от оцененного содержимого. Рассмотрим пример.
{
"field": "name",
"equals": "[concat(field('stringPropertyA'), field('stringPropertyB'))]"
}
Длина строки, созданной concat() функцией, зависит от значения свойств в вычисляемом ресурсе.
| Предел | Значение | Example |
|---|---|---|
| Длина строки, возвращаемой функцией | 131072 | [concat(field('longString1'), field('longString2'))] |
| Глубина cоставных объектов, предоставляемых функции в качестве параметра или возвращаемых ею | 128 | [union(field('largeObject1'), field('largeObject2'))] |
| Количество узлов cоставных объектов, предоставляемых функции в качестве параметра или возвращаемых ею | 32768 | [concat(field('largeArray1'), field('largeArray2'))] |
Предупреждение
Политики, превышающие ограничения во время оценки, фактически становятся политикой deny и могут блокировать входящие запросы.
При написании политик со сложными функциями следует учитывать эти ограничения и протестировать политики для тех ресурсов, которые могут их превышать.
Дальнейшие шаги
- Дополнительные сведения о структуре определения политики см. в основах, параметрах и псевдонимах.
- Для инициатив перейдите к структуре определения инициативы.
- Изучите примеры на странице примеров Политики Azure.
- Изучите понимание последствий политики.
- Узнайте о программном создании политик.
- Узнайте, как получать данные о соответствии.
- Узнайте, как исправлять несоответствующие ресурсы.
- Дополнительные сведения о группе управления см. в статье Упорядочивание ресурсов с помощью групп управления Azure.