правило политики структуры определения Политика Azure

Правило политики состоит из 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, greaterи greaterOrEquals, lessOrEqualsесли тип свойства не соответствует типу условия, возникает ошибка. Сравнение строк выполняется с помощью InvariantCultureIgnoreCase.

При использовании условий likenotLike в значении предоставляется дикий символ карта (*). Значение не должно содержать более одного дикого карта символа.

При использовании match условий notMatch укажите хэштег (#) для сопоставления цифры, вопросительного знака (?) для буквы и точки (.) для сопоставления любого символа и любого другого символа, соответствующего фактическому символу. Хотя match и notMatch учитывает регистр, все остальные условия, которые оценивают stringValue регистр без учета регистра. Альтернативные варианты без учета регистра доступны в matchInsensitively и notMatchInsensitively.

Поля

Условия, которые оценивают, могут ли значения свойств в полезных данных запроса ресурса соответствовать определенным критериям, используя field выражение. Поддерживаются следующие поля.

  • name

  • fullName

    • Возвращает полное имя ресурса. Полное имя ресурса — это имя ресурса, заданное любыми родительскими именами ресурсов (например myServer/myDatabase).
  • kind

  • type

  • location

    • Поля расположений нормализуются для поддержки различных форматов. Например, значение East US 2 считается эквивалентным значению eastus2.
    • Используйте global для ресурсов, которые зависят от расположения.
  • id

    • Возвращает ИД оцениваемого ресурса.
    • Пример: /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type

  • tags

  • tags['<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] все еще являются приемлемыми способами объявления поля тегов. Однако предпочтительными являются выражения, указанные выше.

  • Список псевдонимов свойств указан в разделе Псевдонимы.

    Примечание.

    В 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 (Предотвращение сбоев шаблонов). Используйте принудительное применениеmode , doNotEnforce чтобы предотвратить влияние неудачной оценки на новые или обновленные ресурсы при тестировании и проверке нового определения политики.

Примеры значений

Этот пример правила политики используется value для сравнения результата resourceGroup() функции и возвращаемого namelike свойства с условием *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() для проверка, если первые три символа name равныabc, не допуская 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 выражения. К распространенным сценариям относится проверка соответствия условию “по крайней мере один из”, “только один из”, “все” или “ни одного” для элементов массива. Вычисляет count каждый элемент массива для выражения условия и суммирует истинные результаты, которые затем сравниваются с оператором выражения.

Field 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 (обязательно): содержит путь к массиву и должен быть псевдонимом массива.
  • count.where (необязательно): выражение условия для индивидуального вычисления для каждого элемента массива псевдонимов массива count.field. Если это свойство не указано, то все элементы массива с путем field оцениваются как true. В этом свойстве можно использовать любое condition (условие). Внутри этого свойства можно использовать логические операторы для создания сложных требований к оценке.
  • condition (обязательное): значение сравнивается с количеством элементов, соответствующих выражению условия count.where. Следует использовать числовое condition.

Дополнительные сведения о работе со свойствами массива в Политика Azure, включая подробное описание field count способа вычисления выражения, см. в разделе "Ссылки на свойства ресурса массива".

Value 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. В этом свойстве можно использовать любое condition (условие). Внутри этого свойства можно использовать логические операторы для создания сложных требований к оценке. Значение перечисляемого в данный момент элемента массива можно получить, вызвав функцию current.
  • condition (обязательное): значение сравнивается с количеством элементов, соответствующих выражению условия count.where. Следует использовать числовое condition.

Функция current

Функция current() доступна только в условии count.where. Он возвращает значение элемента массива, который в настоящее время перечисляется вычислением count выражения.

Использование выражения value count

  • current(<index name defined in count.name>). Например: current('arrayMember').
  • current(). Допускается только в том случае, если value count выражение не является дочерним элементом другого count выражения. Возвращает то же значение, что и приведенное выше выражение.

Если значение, возвращаемое вызовом, представляет собой объект, поддерживаются методы доступа к свойствам. Например: current('objectArrayMember').property.

Использование выражения field count

  • 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').

Примеры использования выражения field count

Пример 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
}

Примеры использования выражения value count

Пример 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. Проверка того, определены ли все зарезервированные правила в группе безопасности сети. Свойства зарезервированных правил группы безопасности сети определяются в параметре массива, содержащем объекты.

Значение параметра:

[
  {
    "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()
  • dateTimeFromEpoch
  • dateTimeToEpoch
  • deployment()
  • 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.

Следующие функции доступны только в правилах политик.

  • addDays(dateTime, numberOfDaysToAdd)

    • dateTime: [Обязательный] строка — строка в формате DateTime универсального формата ISO 8601 DateTime y-MM-ddTHH:mm:ss. FFFFFFFZ'
    • numberOfDaysToAdd: [обязательно] целое число — количество дней для добавления
  • field(fieldName)

    • fieldName: [обязательный] строка — имя поля для извлечения
    • Возвращает значение этого поля из ресурса, оцениваемого условием If.
    • field в основном используется с auditIfNotExists полями, которые вычисляются, и deployIfNotExists ссылаться на них. Это можно увидеть на примере DeployIfNotExists.
  • requestContext().apiVersion

    • Возвращает версию API запроса, который активировал оценку политики (пример: 2021-09-01). Это значение указывает версию API, которая использовалась в запросе PUT/PATCH для оценки при создании или обновлении ресурсов. Последняя версия API всегда используется во время оценки соответствия для существующих ресурсов.
  • policy()

    • Возвращает перечисленные ниже сведения об оцениваемой политике. Доступ к свойствам можно получить из возвращенного объекта (пример: [policy().assignmentId]).

      {
        "assignmentId": "/subscriptions/11111111-1111-1111-1111-111111111111/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: [обязательный] строка — строка, указывающая диапазон IP-адресов для проверки как включенных в диапазон.
    • Возвращает логическое значение, указывающее, содержится ли диапазон IP-адресов targetRange в диапазоне range. Пустые диапазоны и сочетания семейств 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.

Пример функции политики

Этот пример правила политики использует resourceGroup функцию ресурса для получения name свойства, в сочетании с concat функцией массива и объекта для создания like условия, которое применяет имя ресурса для начала с имени группы ресурсов.

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

Ограничения правил политики

Ограничения, принудительно применяемые во время разработки

Ограничения на структуру правил политики применяются во время разработки или назначения политики. Попытки создать или назначить определения политик, превышающие эти ограничения, завершатся неудачей.

Ограничение Значение Дополнительные сведения
Выражения условий в условии if 4096
Выражения условий в блоке then 128 Применимо к политикам и deployIfNotExists политикам existenceConditionauditIfNotExists
Число функций политики на правило политики 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() функцией, зависит от значения свойств в вычисляемом ресурсе.

Ограничение Значение Пример
Длина строки, возвращаемой функцией 131072 [concat(field('longString1'), field('longString2'))]
Глубина cоставных объектов, предоставляемых функции в качестве параметра или возвращаемых ею 128 [union(field('largeObject1'), field('largeObject2'))]
Количество узлов cоставных объектов, предоставляемых функции в качестве параметра или возвращаемых ею 32768 [concat(field('largeArray1'), field('largeArray2'))]

Предупреждение

Политика, превышающая указанные выше ограничения во время оценки, фактически станет политикой deny и может блокировать входящие запросы. При написании политик со сложными функциями следует учитывать эти ограничения и протестировать политики для тех ресурсов, которые могут их превышать.

Следующие шаги