Regla de directiva de estructura de definición de Azure Policy

La regla de directiva consta de bloques if y then. En el bloque if, se definen una o varias condiciones que especifican cuándo se aplica la directiva. Puede aplicar operadores lógicos a estas condiciones para definir con precisión el escenario de una directiva.

Para obtener detalles completos sobre cada efecto, el orden de evaluación, las propiedades y los ejemplos, consulte Aspectos básicos de las definiciones de Azure Policy.

En el bloque then, se define el efecto que se produce cuando se cumplen las condicionesif.

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

Para obtener más información sobre policyRule, vaya al esquema de definición de directiva.

Operadores lógicos

Los operadores lógicos admitidos son:

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

La sintaxis not invierte el resultado de la condición. La sintaxis allOf (similar a la operación lógica and) requiere que se cumplan todas las condiciones. La sintaxis anyOf (similar a la operación lógica or) requiere que se cumplan una o varias condiciones.

Puede anidar los operadores lógicos. El ejemplo siguiente muestra una operación not que está anidada dentro de una operación allOf.

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

Condiciones

Una condición evalúa si un campo cumple determinados criterios. Estas son las condiciones que se admiten:

  • "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"

Para less, lessOrEquals, greater y greaterOrEquals, si el tipo de propiedad no coincide con el tipo de condición, se produce un error. La comparación de cadenas se realiza con InvariantCultureIgnoreCase.

Al usar las condiciones de like y notLike, se proporciona un carácter comodín (*) en el valor. El valor no debe tener más de un carácter comodín.

Al usar las condiciones de match y notMatch, proporcione un hashtag (#) para que coincida con un dígito, un signo de interrogación (?) para una letra y un punto (.) para que coincida con cualquier carácter y cualquier otro carácter que coincida con ese carácter en sí. Mientras que match y notMatch distinguen mayúsculas de minúsculas, el resto de las condiciones que evalúan un elemento stringValue no lo hacen. Las alternativas que no distinguen mayúsculas de minúsculas están disponibles en matchInsensitively y notMatchInsensitively.

Fields

Las condiciones que evalúan si los valores de las propiedades de la carga de solicitudes de recursos cumplen determinados criterios se pueden formar usando una expresión field. Se admiten los siguientes campos:

  • name

  • fullName

    • Devuelve el nombre completo del recurso. El nombre completo de un recurso es el nombre del recurso precedido por los nombres de recurso principal (por ejemplo myServer/myDatabase).
  • kind

  • type

  • location

    • Los campos de ubicación se normalizan para admitir varios formatos. Por ejemplo, East US 2 se considera igual que eastus2.
    • Use global para los recursos que son independientes de la ubicación.
  • id

    • Devuelve el id. del recurso que se está evaluando.
    • Ejemplo: /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type

  • tags

  • tags['<tagName>']

    • Esta sintaxis con corchetes admite nombres de etiquetas que tienen signos de puntuación como guion, punto o espacio.
    • Donde tagName es el nombre de la etiqueta de la que se va a validar la condición.
    • Ejemplos: tags['Acct.CostCenter'] donde Acct.CostCenter es el nombre de la etiqueta.
  • tags['''<tagName>''']

    • Esta sintaxis con corchetes admite nombres de etiquetas con apóstrofos mediante secuencias de escape con dobles apóstrofos.
    • Donde tagName es el nombre de la etiqueta de la que se va a validar la condición.
    • Ejemplo: tags['''My.Apostrophe.Tag'''] donde 'My.Apostrophe.Tag' es el nombre de la etiqueta.

    Nota:

    tags.<tagName>, tags[tagName] y tags[tag.with.dots] son todavía formas aceptables de declarar un campo de etiquetas. Sin embargo, las expresiones preferidas son las mencionadas anteriormente.

  • alias de propiedad: para obtener una lista, vea Alias.

    Nota:

    En las expresiones field que hacen referencia al alias de matriz [*] cada elemento de la matriz se evalúa individualmente con and lógicos entre elementos. Para obtener más información, consulte Referencia a las propiedades de recursos de matriz.

Las condiciones que usan expresiones field pueden reemplazar la sintaxis de definición de directiva heredada "source": "action", que se usa para trabajar con operaciones de escritura. Por ejemplo, esto ya no se admite:

{
  "source": "action",
  "like": "Microsoft.Network/publicIPAddresses/*"
}

Pero el comportamiento deseado se puede lograr mediante lógica field:

{
  "field": "type",
  "equals": "Microsoft.Network/publicIPAddresses"
}

Uso de etiquetas con parámetros

Un valor de parámetro se puede pasar a un campo de etiqueta. Al pasar un parámetro a un campo de etiqueta aumenta la flexibilidad de la definición de directiva durante la asignación de directivas.

En el ejemplo siguiente, concat se usa para crear una búsqueda de campos de etiquetas para la etiqueta denominada con el valor del parámetro tagName. Si esa etiqueta no existe, se usa el efecto modify para agregarla con el valor de la misma etiqueta con nombre establecida en el grupo de recursos principal de los recursos auditados mediante la función de búsqueda 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"
      ]
    }
  }
}

Valor

Las condiciones que evalúan si un valor cumple determinados criterios se pueden formar utilizando una expresión value. Los valores pueden ser literales, los valores de parámetros o los valores devueltos de cualquier función de plantilla compatible.

Advertencia

Si el resultado de una función de plantilla es un error, no se pude realizar la evaluación de directivas. Una evaluación con errores es una deny implícita. Para más información, consulte cómo evitar los errores de plantilla. Use enforcementMode de doNotEnforce para evitar el efecto de una evaluación con errores en los recursos nuevos o actualizados mientras se prueba y valida una nueva definición de directiva.

Ejemplos de value

En este ejemplo de regla de directiva se usa value para comparar el resultado de la función resourceGroup() y la propiedad name devuelta con una condición like de *netrg. La regla niega cualquier recurso de Microsoft.Network/*type en cualquier grupo de recursos cuyo nombre termine en *netrg.

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

En este ejemplo de regla de directiva se usa value para comprobar si el resultado de varias funciones anidadas equalstrue. La regla deniega cualquier recurso que no tenga al menos tres etiquetas.

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

Evitar los errores de plantilla

El uso de funciones de plantilla en el value permite muchas funciones anidadas complejas. Si el resultado de una función de plantilla es un error, no se pude realizar la evaluación de directivas. Una evaluación con errores es una deny implícita. Un ejemplo de un value que produce un error en ciertos escenarios:

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

La regla de directiva de ejemplo anterior usa substring() para comparar los tres primeros caracteres de name con abc. Si el name tiene menos de tres caracteres, la función substring() produce un error. Este error hace que la directiva tenga el efecto de deny.

En su lugar, use la función if() para comprobar si los tres primeros caracteres del name son igual a abc sin permitir que un name menor de tres caracteres produzca un error:

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

Con la regla de directivas revisada, if() comprueba la longitud del name antes de intentar obtener un elemento substring() de un valor con menos de tres caracteres. Si el name es demasiado corto, se devuelve en su lugar el valor "no comienza por abc" en lugar de compararlo con abc. Un recurso con un nombre corto que no comienza por abc sigue produciendo un error en la regla de directivas, pero ya no se produce un error durante la evaluación.

Count

Las condiciones que cuentan el número de miembros de una matriz que cumplen determinados criterios se pueden formar usando una expresión count. Algunos escenarios comunes consisten en comprobar si "al menos uno de", "exactamente uno de", "todos" o "ninguno de" los miembros de la matriz satisfacen la condición. El count evalúa una expresión de condición en cada miembro de la matriz y suma los resultados que son true para luego compararlos con el operador de la expresión.

Field count

Cuente el número de miembros de una matriz de la carga de solicitudes que satisfacen una expresión de condición. La estructura de las expresiones field count es:

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

Las siguientes propiedades se usan con field count:

  • count.field (obligatorio): contiene la ruta de acceso a la matriz y debe ser un alias de matriz.
  • count.where (opcional): expresión de condición para evaluar individualmente el alias de matriz de cada miembro de la matriz de count.field. Si no se proporciona esta propiedad, todos los miembros de la matriz con la ruta de acceso "field" se evalúan como true. En esta propiedad se puede usar cualquier condición. Los operadores lógicos pueden usarse dentro de esta propiedad para crear requisitos de evaluación complejos.
  • condition (obligatorio): el valor se compara con el número de elementos que cumplen la expresión de condición count.where. Se debe usar una condición numérica.

Para obtener más información sobre cómo trabajar con las propiedades de matriz en Azure Policy, incluida una explicación detallada sobre cómo se evalúa la expresión field count, consulte Referencia a las propiedades de recursos de matriz.

Value count

Cuente el número de miembros de una matriz que satisfacen una condición. La matriz puede ser una matriz de literales o una referencia a un parámetro de matriz. La estructura de las expresiones value count es:

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

Las siguientes propiedades se usan con value count:

  • count.value (obligatorio): matriz que se va a evaluar.
  • count.name (obligatorio): el nombre del índice, compuesto por letras y dígitos en inglés. Define un nombre para el valor del miembro de la matriz evaluado en la iteración actual. El nombre se usa para hacer referencia al valor actual dentro de la condición count.where. Opcional cuando la expresión count no está en un elemento secundario de otra expresión count. Cuando no se proporciona, el nombre del índice se establece implícitamente en "default".
  • count.where (opcional): expresión de condición que se va a evaluar individualmente para cada miembro de matriz de count.value. Si no se proporciona esta propiedad, todos los miembros de la matriz se evalúan como true. En esta propiedad se puede usar cualquier condición. Los operadores lógicos pueden usarse dentro de esta propiedad para crear requisitos de evaluación complejos. Se puede acceder al valor del miembro de la matriz enumerado actualmente mediante la llamada a la función current.
  • condition (obligatorio): el valor se compara con el número de elementos que cumplen la expresión de condición count.where. Se debe usar una condición numérica.

Función current

La función current() solo está disponible dentro de la condición count.where. Esta función devuelve el valor del miembro de la matriz que está enumerado actualmente en la evaluación de la expresión count.

Uso de value count

  • current(<index name defined in count.name>). Por ejemplo: current('arrayMember').
  • current(). Solo se permite cuando la expresión value count no es un elemento secundario de otra expresión count. Devuelve el mismo valor que antes.

Si el valor devuelto por la llamada es un objeto, se admiten los descriptores de acceso de propiedad. Por ejemplo: current('objectArrayMember').property.

Uso de field count

  • current(<the array alias defined in count.field>). Por ejemplo, current('Microsoft.Test/resource/enumeratedArray[*]').
  • current(). Solo se permite cuando la expresión field count no es un elemento secundario de otra expresión count. Devuelve el mismo valor que antes.
  • current(<alias of a property of the array member>). Por ejemplo, current('Microsoft.Test/resource/enumeratedArray[*].property').

Ejemplos de field count

Ejemplo 1: Comprobar si una matriz está vacía

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

Ejemplo 2: Comprobar si solo un miembro de la matriz cumple la expresión de condición

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

Ejemplo 3: Comprobar si por lo menos un miembro de la matriz cumple la expresión de condición

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

Ejemplo 4: Comprobar si todos los miembros de la matriz del objeto cumplen la expresión de condición

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

Ejemplo 5: Comprobar si al menos un miembro de la matriz coincide con varias propiedades de la expresión de condición

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

Ejemplo 6: Use la función current() dentro de las condiciones where para acceder al valor del miembro de la matriz actualmente enumerado en una función de plantilla. Esta condición comprueba si una red virtual contiene un prefijo de dirección que no está en el intervalo de 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
}

Ejemplo 7: Use la función field() dentro de las condiciones where para acceder al valor del miembro de la matriz actualmente enumerado. Esta condición comprueba si una red virtual contiene un prefijo de dirección que no está en el intervalo de 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
}

Ejemplos de value count

Ejemplo 1: Compruebe si el nombre de un recurso coincide con alguno de los patrones de nombre especificados.

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

Ejemplo 2: Compruebe si el nombre de un recurso coincide con alguno de los patrones de nombre especificados. La función current() no especifica un nombre de índice. El resultado es el mismo que el del ejemplo anterior.

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

Ejemplo 3: Compruebe si el nombre de un recurso coincide con alguno de los patrones de nombre proporcionados por un parámetro de matriz.

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

Ejemplo 4: Compruebe si alguno de los prefijos de dirección de red virtual no está en la lista de prefijos aprobados.

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

Ejemplo 5: Compruebe que todas las reglas del grupo de seguridad de red reservadas están definidas en un grupo de seguridad de red. Las propiedades de las reglas de grupo de seguridad de red reservadas se definen en un parámetro de matriz que contiene objetos.

Valor del parámetro:

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

Directiva:

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

Funciones de directiva

Las funciones se pueden usar para introducir más lógica en una regla de directiva. Se resuelven dentro de la regla de directiva de una definición de directiva y dentro de los valores de parámetro asignados a las definiciones de directiva en una iniciativa.

Se pueden usar todas las funciones de plantilla de Resource Manager dentro de una regla de directivas, excepto las siguientes funciones y funciones definidas por el usuario:

  • copyIndex()
  • dateTimeAdd()
  • dateTimeFromEpoch
  • dateTimeToEpoch
  • deployment()
  • environment()
  • extensionResourceId()
  • lambda() Para obtener más información, vaya a lambda
  • listAccountSas()
  • listKeys()
  • listSecrets()
  • list*
  • managementGroup()
  • newGuid()
  • pickZones()
  • providers()
  • reference()
  • resourceId()
  • subscriptionResourceId()
  • tenantResourceId()
  • tenant()
  • variables()

Nota:

Estas funciones siguen estando disponibles en la parte details.deployment.properties.template de la implementación de plantillas en una definición de directiva de deployIfNotExists.

La siguiente función está disponible para su uso en una regla de directivas, pero difieren del uso en una plantilla de Azure Resource Manager (Plantilla de ARM):

  • utcNow(): a diferencia de una plantilla de ARM, esta propiedad se puede usar con un valor distinto a defaultValue.
    • Devuelve una cadena que se establece en la fecha y hora actuales en formato DateTime universal ISO 8601 yyyy-MM-ddTHH:mm:ss.fffffffZ.

Las siguientes funciones solo están disponibles en las reglas de directiva:

  • addDays(dateTime, numberOfDaysToAdd)

    • dateTime: cadena [Requerida]: cadena en el formato universal ISO 8601 DateTime 'aaaa-MM-ddTHH:mm:ss.FFFFFFFZ'
    • numberOfDaysToAdd: Entero [Requerido]: número de días que se van a agregar
  • field(fieldName)

    • fieldName: cadena [Requerida]: nombre del campo que se va a recuperar
    • Devuelve el valor de ese campo del recurso que se va a evaluar con la condición If.
    • field se usa principalmente con auditIfNotExists y deployIfNotExists para hacer referencia a campos del recurso que se están evaluando. Este uso se puede observar en el ejemplo de DeployIfNotExists.
  • requestContext().apiVersion

    • Devuelve la versión de la API de la solicitud que desencadenó la evaluación de la directiva (por ejemplo: 2021-09-01). Este valor es la versión de API que se usó en la solicitud PUT/PATCH para las evaluaciones de la creación o actualización de recursos. La versión más reciente de la API siempre se usa durante la evaluación del cumplimiento de los recursos existentes.
  • policy()

    • Devuelve la siguiente información acerca de la directiva que se está evaluando. Es posible acceder a las propiedades desde el objeto devuelto (ejemplo: [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: cadena [Requerida]: cadena que especifica un intervalo de direcciones IP para comprobar si el targetRange está dentro.
    • targetRange: cadena [Requerida]: cadena que especifica un intervalo de direcciones IP que se van a validar como incluidos dentro del intervalo.
    • Devuelve un valor booleano para determinar si el intervalo de direcciones IP del intervalo contiene el intervalo de direcciones IP targetRange. No se permiten rangos vacíos ni mezclas entre familias de direcciones IP, lo que genera un error en la evaluación.

    Formatos compatibles:

    • Dirección IP única (ejemplos: 10.0.0.0, 2001:0DB8::3:FFFE)
    • Intervalo de CIDR (ejemplos: 10.0.0.0/24, 2001:0DB8::/110)
    • Intervalo definido por direcciones IP de inicio y final (ejemplos: 192.168.0.1-192.168.0.9, 2001:0DB8::-2001:0DB8::3:FFFF)
  • current(indexName)

Ejemplo de función de directiva

En este ejemplo de regla de directiva se usa la función de recurso resourceGroup para obtener la propiedad name, combinada con la matriz concat y la función de objeto para crear una condición like que exige que el nombre del recurso empiece por el nombre del grupo de recursos.

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

Límites de reglas de directiva

Límites aplicados durante la creación

Los límites de la estructura de las reglas de directiva se aplican durante la creación o asignación de una directiva. Se producirá un error al intentar crear o asignar definiciones de directiva que superen estos límites.

Límite Value Detalles adicionales
Expresiones de condición en la condición if 4096
Expresiones de condición en el bloque then 128 Se aplica al elemento existenceCondition de las directivas auditIfNotExists y deployIfNotExists
Funciones de directiva por regla de directiva 2048
Número de parámetros de la función de directiva 128 Ejemplo: [function('parameter1', 'parameter2', ...)]
Profundidad de las funciones de directiva anidadas 64 Ejemplo: [function(nested1(nested2(...)))]
Longitud de cadena de expresión de las funciones de directiva 81920 Ejemplo: la longitud de "[function(....)]"
Expresiones Field count por matriz 5
Expresiones Value count por regla de directiva 10
Recuento de iteraciones de expresiones Value count 100 Para las expresiones Value count anidadas, esto también incluye el recuento de iteraciones de la expresión primaria

Límites aplicados durante la evaluación

Límites del tamaño de los objetos procesados por las funciones de la directiva durante su evaluación. Estos límites no siempre se pueden aplicar durante la creación, ya que dependen del contenido evaluado. Por ejemplo:

{
  "field": "name",
  "equals": "[concat(field('stringPropertyA'), field('stringPropertyB'))]"
}

La longitud de la cadena creada por la función concat() depende del valor de las propiedades del recurso evaluado.

Límite Valor Ejemplo
Longitud de la cadena devuelta por una función 131 072 [concat(field('longString1'), field('longString2'))]
Profundidad de objetos complejos proporcionados como parámetro para una función o devueltos por esta 128 [union(field('largeObject1'), field('largeObject2'))]
Número de nodos de objetos complejos proporcionados como parámetro para una función o devueltos por esta 32 768 [concat(field('largeArray1'), field('largeArray2'))]

Advertencia

La directiva que supere los límites anteriores durante la evaluación se convertirá efectivamente en una directiva deny y puede bloquear las solicitudes entrantes. Al escribir directivas con funciones complejas, tenga en cuenta estos límites y pruebe las directivas con recursos que puedan superarlos.

Pasos siguientes