Compartilhar via


Criar políticas para propriedades de matriz em recursos do Azure

As propriedades do Azure Resource Manager são normalmente definidas como cadeias de caracteres e boolianos. Quando existe uma relação um-para-muitos, as propriedades complexas são definidas como matrizes. No Azure Policy, as matrizes são usadas de várias maneiras diferentes:

Este artigo aborda cada uso pelo Azure Policy e fornece várias definições de exemplo.

Matrizes de parâmetros

Definir uma matriz de parâmetros

A definição de um parâmetro como uma matriz permite a flexibilidade da política quando mais de um valor é necessário. Essa definição de política permite qualquer local único para o parâmetro allowedLocations e usa eastus2 como padrão:

"parameters": {
  "allowedLocations": {
    "type": "string",
    "metadata": {
      "description": "The list of allowed locations for resources.",
      "displayName": "Allowed locations",
      "strongType": "location"
    },
    "defaultValue": "eastus2"
  }
}

Como type era cadeia de caracteres, apenas um valor pode ser definido ao atribuir a política. Se essa política for atribuída, os recursos no escopo só serão permitidos em uma região do Azure. A maioria das definições de política precisa permitir uma lista de opções aprovadas, como permitir eastus2, eastus e westus2.

Para criar a definição de política a fim de permitir várias opções, use a matriz type. A mesma política pode ser reescrita da seguinte maneira:

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

Observação

Quando uma definição de política é salva, a propriedade type em um parâmetro não pode ser alterada.

Essa nova definição de parâmetro usa mais de um valor durante a atribuição de política. Com a propriedade de matriz allowedValues definida, os valores disponíveis durante a atribuição são limitados ainda mais à lista predefinida de opções. O uso de allowedValues é opcional.

Passar valores para uma matriz de parâmetros durante a atribuição

Ao atribuir a política por meio do portal do Azure, um parâmetro de type matriz é exibido como uma caixa de texto. A dica diz Use ; to separate values. (e.g. London;New York). Para passar os valores de local permitidos de eastus2, eastus e westus2 para o parâmetro, use a seguinte cadeia de caracteres:

eastus2;eastus;westus2

O formato do valor do parâmetro é diferente ao usar CLI do Azure, o Azure PowerShell ou a API REST. Os valores são passados por meio de uma cadeia de caracteres JSON que também inclui o nome do parâmetro.

{
  "allowedLocations": {
    "value": [
      "eastus2",
      "eastus",
      "westus2"
    ]
  }
}

Para usar essa cadeia de caracteres com cada SDK, use os seguintes comandos:

  • CLI do Azure: comando az policy assignment create com o parâmetro params.
  • Azure PowerShell: cmdlet New-AzPolicyAssignment com o parâmetro PolicyParameter.
  • API REST: na operação PUT criar enquanto parte do corpo da solicitação, como o valor da propriedade properties.parameters.

Usando matrizes em condições

In e notIn

As condições in e notIn só funcionam com valores de matriz. Elas verificam a existência de um valor em uma matriz. A matriz em questão pode ser uma matriz JSON literal ou uma referência a um parâmetro de matriz. Por exemplo:

{
  "field": "tags.environment",
  "in": [
    "dev",
    "test"
  ]
}
{
  "field": "location",
  "notIn": "[parameters('allowedLocations')]"
}

Contagem de valor

A expressão contagem de valor conta quantos membros da matriz atendem a uma condição. Ela fornece uma maneira de avaliar a mesma condição várias vezes, usando valores diferentes em cada iteração. Por exemplo, a condição a seguir verifica se o nome do recurso corresponde a qualquer padrão de uma matriz de padrões:

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

Para avaliar a expressão, a Azure Policy avalia a condição where três vezes, uma para cada membro de [ "test*", "dev*", "prod*" ], contando quantas vezes ela foi avaliada como true. Em cada iteração, o valor do membro da matriz atual é emparelhado com o nome do índice pattern definido por count.name. Esse valor pode então ser referenciado dentro da condiçãowhere chamando uma função de modelo especial: current('pattern').

Iteração current('pattern') returned value
1 "test*"
2 "dev*"
3 "prod*"

A condição será verdadeira somente se a contagem resultante for maior que 0.

Para tornar a condição anterior mais genérica, use uma referência parameters em vez de uma matriz literal:

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

Quando a expressão de value count não está sob nenhuma outra expressão de count, o count.name é opcional e a função current() pode ser usada sem argumentos:

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

A value count também oferece suporte a matrizes de objetos complexos, permitindo condições mais complexas. Por exemplo, a condição a seguir define um valor de marca desejado para cada padrão de nome e verifica se o nome do recurso corresponde ao padrão, mas não tem o valor de marca necessário:

{
  "count": {
    "value": [
      {
        "pattern": "test*",
        "envTag": "dev"
      },
      {
        "pattern": "dev*",
        "envTag": "dev"
      },
      {
        "pattern": "prod*",
        "envTag": "prod"
      },
    ],
    "name": "namePatternRequiredTag",
    "where": {
      "allOf": [
        {
          "field": "name",
          "like": "[current('namePatternRequiredTag').pattern]"
        },
        {
          "field": "tags.env",
          "notEquals": "[current('namePatternRequiredTag').envTag]"
        }
      ]
    }
  },
  "greater": 0
}

Para obter exemplos úteis, consulte exemplos de contagem de valor.

Referenciando propriedades de recurso de matriz

Em muitos casos, é necessário trabalhar com propriedades de matriz no recurso avaliado. Alguns cenários exigem referenciar uma matriz inteira (por exemplo, verificando seu comprimento). Outros exigem a aplicação de uma condição a cada membro de matriz individual (por exemplo, verificar se todas as regras de firewall bloqueiam acesso a partir da Internet). Entender as diferentes maneiras em que o Azure Policy pode referenciar propriedades de recurso e como essas referências se comportam quando se referem a propriedades de matriz é a chave para escrever condições que abrangem esses cenários.

Referenciando propriedades de recurso

As propriedades de recurso podem ser referenciadas com o Azure Policy usando aliases. Há duas maneiras de referenciar os valores de uma propriedade de recurso no Azure Policy:

  • Use a condição campo para verificar se todas as propriedades de recurso selecionadas atendem a uma condição. Exemplo:

    {
      "field": "Microsoft.Test/resourceType/property",
      "equals": "value"
    }
    
  • Use a funçãofield() para acessar o valor de uma propriedade. Exemplo:

    {
      "value": "[take(field('Microsoft.Test/resourceType/property'), 7)]",
      "equals": "prefix_"
    }
    

A condição de campo tem um comportamento implícito de allOf. Se o alias representar uma coleção de valores, ela verificará se todos os valores individuais atendem à condição. A função field() retorna os valores representados pelo alias no estado em que se encontram, e estes podem ser manipulados por outras funções de modelo.

Referenciando campos de matriz

As propriedades de recurso de matriz são representadas por dois tipos diferentes de aliases. Um alias normal e aliases de matriz que têm [*] anexado:

  • Microsoft.Test/resourceType/stringArray
  • Microsoft.Test/resourceType/stringArray[*]

Referenciando a matriz

O primeiro alias representa um único valor, o valor da propriedade stringArray do conteúdo da solicitação. Como o valor dessa propriedade é uma matriz, ela não é útil em condições de política. Por exemplo:

{
  "field": "Microsoft.Test/resourceType/stringArray",
  "equals": "..."
}

Essa condição compara toda a matriz stringArray a um único valor de cadeia de caracteres. A maioria das condições, incluindo equals, aceita apenas valores de cadeia de caracteres. Portanto, não há muita utilidade em comparar uma matriz a uma cadeia de caracteres. O cenário principal em que pode ser útil referenciar a propriedade de matriz é quando se verifica se ela existe:

{
  "field": "Microsoft.Test/resourceType/stringArray",
  "exists": "true"
}

Com a função field(), o valor retornado é a matriz do conteúdo da solicitação, que pode ser usada com qualquer uma das funções de modelo com suporte que aceitam argumentos de matriz. Por exemplo, a condição a seguir verifica se o comprimento do stringArray é maior que 0:

{
  "value": "[length(field('Microsoft.Test/resourceType/stringArray'))]",
  "greater": 0
}

Referenciando a coleção de membros da matriz

Os aliases que usam a sintaxe [*] representam uma coleção de valores de propriedade selecionados de uma propriedade de matriz, o que é diferente de selecionar a própria propriedade da matriz. Por exemplo, o Microsoft.Test/resourceType/stringArray[*] retorna uma coleção que tem todos os membros de stringArray. Como mencionado anteriormente, uma condição field verifica se todas as propriedades de recurso selecionadas atendem à condição. Portanto, a condição a seguir será verdadeira somente se todos os membros de stringArray forem iguais a "value".

{
  "field": "Microsoft.Test/resourceType/stringArray[*]",
  "equals": "value"
}

Se a matriz estiver vazia, a condição será avaliada como verdadeira porque nenhum membro da matriz está em violação. Nesse cenário, a recomendação é usar a expressão de contagem. Se a matriz contiver objetos, poderá ser usado um alias [*] para selecionar o valor de uma propriedade específica a partir de cada membro da matriz. Exemplo:

{
  "field": "Microsoft.Test/resourceType/objectArray[*].property",
  "equals": "value"
}

Essa condição será verdadeira se os valores de todas as propriedades property no objectArray forem iguais a "value". Para obter mais exemplos, consulte Mais exemplos de alias.

Ao usar a função field() para fazer referência a um alias de matriz, o valor retornado é uma matriz de todos os valores selecionados. Esse comportamento implica que o caso de uso comum da função field(), a capacidade de aplicar funções de modelo aos valores de propriedade de recurso, é limitado. As únicas funções de modelo que podem ser usadas neste caso são aquelas que aceitam argumentos de matriz. Por exemplo, é possível obter o comprimento da matriz com [length(field('Microsoft.Test/resourceType/objectArray[*].property'))]. No entanto, cenários mais complexos, como aplicar a função de modelo a cada membro da matriz e compará-lo a um valor desejado só são possíveis usando a expressão count. Para obter mais informações, consulte Expressão de contagem de campo.

Resumidamente, consulte o seguinte conteúdo de recurso de exemplo e os valores selecionados retornados por vários aliases:

{
  "tags": {
    "env": "prod"
  },
  "properties": {
    "stringArray": [
      "a",
      "b",
      "c"
    ],
    "objectArray": [
      {
        "property": "value1",
        "nestedArray": [
          1,
          2
        ]
      },
      {
        "property": "value2",
        "nestedArray": [
          3,
          4
        ]
      }
    ]
  }
}

Ao usar a condição de campo no conteúdo do recurso de exemplo, os resultados são os seguintes:

Alias Valores selecionados
Microsoft.Test/resourceType/missingArray null
Microsoft.Test/resourceType/missingArray[*] Uma coleção vazia de valores.
Microsoft.Test/resourceType/missingArray[*].property Uma coleção vazia de valores.
Microsoft.Test/resourceType/stringArray ["a", "b", "c"]
Microsoft.Test/resourceType/stringArray[*] "a", "b", "c"
Microsoft.Test/resourceType/objectArray[*] { "property": "value1", "nestedArray": [ 1, 2 ] },
{ "property": "value2", "nestedArray": [ 3, 4 ] }
Microsoft.Test/resourceType/objectArray[*].property "value1", "value2"
Microsoft.Test/resourceType/objectArray[*].nestedArray [ 1, 2 ], [ 3, 4 ]
Microsoft.Test/resourceType/objectArray[*].nestedArray[*] 1, 2, 3, 4

Ao usar a função field() no conteúdo do recurso de exemplo, os resultados são os seguintes:

Expression Valor retornado
[field('Microsoft.Test/resourceType/missingArray')] ""
[field('Microsoft.Test/resourceType/missingArray[*]')] []
[field('Microsoft.Test/resourceType/missingArray[*].property')] []
[field('Microsoft.Test/resourceType/stringArray')] ["a", "b", "c"]
[field('Microsoft.Test/resourceType/stringArray[*]')] ["a", "b", "c"]
[field('Microsoft.Test/resourceType/objectArray[*]')] [{ "property": "value1", "nestedArray": [ 1, 2 ] }, { "property": "value2", "nestedArray": [ 3, 4 ] }]
[field('Microsoft.Test/resourceType/objectArray[*].property')] ["value1", "value2"]
[field('Microsoft.Test/resourceType/objectArray[*].nestedArray')] [[ 1, 2 ], [ 3, 4 ]]
[field('Microsoft.Test/resourceType/objectArray[*].nestedArray[*]')] [1, 2, 3, 4]

Expressões de contagem de campos

As expressões de contagem de campos contam quantos membros da matriz atendem a uma condição e comparam a contagem com um valor de destino. Count é mais intuitivo e versátil para avaliar matrizes em comparação com condições field. A sintaxe do é:

{
  "count": {
    "field": <[*
    ] alias>,
    "where": <optional policy condition expression>
  },
  "equals|greater|less|any other operator": <target value>
}

Quando usado sem uma condição where, count apenas retorna o comprimento de uma matriz. Para o conteúdo do recurso de exemplo da seção anterior, a expressão count a seguir é avaliada como true, pois stringArray tem três membros:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]"
  },
  "equals": 3
}

Esse comportamento também ocorre com matrizes aninhadas. Por exemplo, a expressão count a seguir é avaliada como true, pois há quatro membros de matriz nas matrizesnestedArray:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]"
  },
  "greaterOrEquals": 4
}

O poder do count está na condição where. Quando count é especificado, o Azure Policy enumera os membros da matriz e avalia cada um em relação à condição, contando quantos membros da matriz foram avaliados como true. Especificamente, em cada iteração de avaliação da condição where, o Azure Policy seleciona um único membro de matriz i e avalia o conteúdo do recurso em relação à condição where como se i fosse o único membro da matriz. Ter apenas um membro de matriz disponível em cada iteração possibilita uma maneira de aplicar condições complexas em cada membro de matriz individual.

Exemplo:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "a"
    }
  },
  "equals": 1
}

Para avaliar a expressão count, a Azure Policy avalia a condição where três vezes, uma para cada membro do stringArray, e conta quantas vezes ela foi avaliada como true. Quando a condição where se refere aos membros da matriz Microsoft.Test/resourceType/stringArray[*], em vez de selecionar todos os membros do stringArray, ela sempre seleciona apenas um único membro de matriz, todas as vezes:

Iteração Valores selecionados em Microsoft.Test/resourceType/stringArray[*] Resultado da avaliação where
1 "a" true
2 "b" false
3 "c" false

O count retorna 1.

Esta é uma expressão mais complexa:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "allOf": [
        {
          "field": "Microsoft.Test/resourceType/objectArray[*].property",
          "equals": "value2"
        },
        {
          "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]",
          "greater": 2
        }
      ]
    }
  },
  "equals": 1
}
Iteração Valores selecionados Resultado da avaliação where
1 Microsoft.Test/resourceType/objectArray[*].property =>"value1"
Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2
false
2 Microsoft.Test/resourceType/objectArray[*].property =>"value2"
Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4
true

O count retorna 1.

O fato de a expressão where ser avaliada em relação ao conteúdo inteiroda solicitação (com alterações apenas no membro da matriz que está sendo enumerado no momento) significa que a condição where também pode se referir a campos fora da matriz:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "field": "tags.env",
      "equals": "prod"
    }
  },
  "equals": 0
}
Iteração Valores selecionados Resultado da avaliação where
1 tags.env =>"prod" true
2 tags.env =>"prod" true

Podem ser usadas expressões de contagem aninhadas para aplicar condições a campos de matriz aninhada. Por exemplo, a condição a seguir verifica se a matrizobjectArray[*] tem exatamente dois membros com nestedArray[*] que contém um ou mais membros:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "count": {
        "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]"
      },
      "greaterOrEquals": 1
    }
  },
  "equals": 2
}
Iteração Valores selecionados Resultado da avaliação de contagem aninhada
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] tem dois membros =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] tem dois membros =>true

Como ambos os membros de objectArray[*] têm uma matriz filho nestedArray[*] com dois membros, a expressão de contagem externa retorna 2.

Exemplo mais complexo: verifique se a matriz objectArray[*] tem exatamente dois membros nestedArray[*] com todos os membros iguais a 2 ou 3:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "count": {
        "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]",
        "where": {
          "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]",
          "in": [
            2,
            3
          ]
        }
      },
      "greaterOrEquals": 1
    }
  },
  "equals": 2
}
Iteração Valores selecionados Resultado da avaliação de contagem aninhada
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] contém 2 =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] contém 3 =>true

Como ambos os membros de objectArray[*] têm uma matriz filho nestedArray[*] que contém 2 ou 3, a expressão de contagem externa retorna 2.

Observação

Expressões de contagem de campos aninhadas só podem fazer referência a matrizes aninhadas. Por exemplo, a expressão de contagem que faz referência a Microsoft.Test/resourceType/objectArray[*] pode ter uma contagem aninhada direcionada para a matriz aninhada Microsoft.Test/resourceType/objectArray[*].nestedArray[*], mas não pode ter um direcionamento de expressão de contagem aninhada Microsoft.Test/resourceType/stringArray[*].

Acessando o membro da matriz atual com funções de modelo

Ao usar funções de modelo, use a função current() para acessar o valor do membro da matriz atual ou os valores de qualquer uma de suas propriedades. Para acessar o valor do membro da matriz atual, passe o alias definido em count.field ou qualquer um de seus aliases filho como um argumento para a função current(). Por exemplo:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "value": "[current('Microsoft.Test/resourceType/objectArray[*].property')]",
      "like": "value*"
    }
  },
  "equals": 2
}
Iteração current() valor retornado Resultado da avaliação where
1 Valor de property no primeiro membro de objectArray[*]: value1 true
2 Valor de property no primeiro membro de objectArray[*]: value2 true

A função de campo interna onde as condições

A função field() também pode ser usada para acessar o valor do membro da matriz atual, desde que a expressão de contagem não esteja dentro de uma condição de existência (a função field() sempre se refere ao recurso avaliado na condição If). O comportamento de field() ao fazer referência à matriz avaliada baseia-se nos seguintes conceitos:

  • Aliases de matriz são resolvidos em uma coleção de valores selecionados a partir de todos os membros da matriz.
  • As funções field() que referenciam aliases de matriz retornam uma matriz com os valores selecionados.
  • Referenciar o alias de matriz contado dentro da condição where retorna uma coleção com um único valor selecionado do membro da matriz que é avaliado na iteração atual.

Esse comportamento significa que, ao fazer referência ao membro da matriz contado com uma função field() dentro da condição where, ele retorna uma matriz com um único membro. Embora esse comportamento possa não ser intuitivo, ele está consistente com a ideia de que os aliases de matriz sempre retornam uma coleção de propriedades selecionadas. Veja um exemplo:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[field('Microsoft.Test/resourceType/stringArray[*]')]"
    }
  },
  "equals": 0
}
Iteração Valores de expressão Resultado da avaliação where
1 Microsoft.Test/resourceType/stringArray[*] =>"a"
[field('Microsoft.Test/resourceType/stringArray[*]')] =>[ "a" ]
false
2 Microsoft.Test/resourceType/stringArray[*] =>"b"
[field('Microsoft.Test/resourceType/stringArray[*]')] =>[ "b" ]
false
3 Microsoft.Test/resourceType/stringArray[*] =>"c"
[field('Microsoft.Test/resourceType/stringArray[*]')] =>[ "c" ]
false

Portanto, quando há a necessidade de acessar o valor do alias da matriz contada com uma função field(), a maneira de fazer isso é encapsulá-la com uma função de modelo first():

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[first(field('Microsoft.Test/resourceType/stringArray[*]'))]"
    }
  }
}
Iteração Valores de expressão Resultado da avaliação where
1 Microsoft.Test/resourceType/stringArray[*] =>"a"
[first(field('Microsoft.Test/resourceType/stringArray[*]'))] =>"a"
true
2 Microsoft.Test/resourceType/stringArray[*] =>"b"
[first(field('Microsoft.Test/resourceType/stringArray[*]'))] =>"b"
true
3 Microsoft.Test/resourceType/stringArray[*] =>"c"
[first(field('Microsoft.Test/resourceType/stringArray[*]'))] =>"c"
true

Para obter exemplos úteis, consulte Exemplos de contagem de valor.

Modificando matrizes

Anexar e modificar alteram as propriedades de um recurso durante a sua criação ou atualização. Ao trabalhar com propriedades de matriz, o comportamento desses efeitos depende de a operação estar tentando modificar o alias [*] ou não:

Observação

O uso do efeito modify com aliases está atualmente em versão prévia.

Alias Efeito Resultado
Microsoft.Storage/storageAccounts/networkAcls.ipRules append O Azure Policy acrescenta toda a matriz especificada nos detalhes do efeito, se ausente.
Microsoft.Storage/storageAccounts/networkAcls.ipRules modify com operação add O Azure Policy acrescenta toda a matriz especificada nos detalhes do efeito, se ausente.
Microsoft.Storage/storageAccounts/networkAcls.ipRules modify com operação addOrReplace O Azure Policy acrescenta toda a matriz especificada nos detalhes do efeito, se ausente.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] append O Azure Policy acrescenta o membro da matriz especificado nos detalhes do efeito.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] modify com operação add O Azure Policy acrescenta o membro da matriz especificado nos detalhes do efeito.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] modify com operação addOrReplace O Azure Policy remove todos os membros da matriz existentes e acrescenta o membro da matriz especificado nos detalhes do efeito.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action append O Azure Policy acrescenta um valor à propriedade action de cada membro da matriz.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action modify com operação add O Azure Policy acrescenta um valor à propriedade action de cada membro da matriz.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action modify com operação addOrReplace O Azure Policy acrescenta ou substitui a propriedade action existente em cada membro da matriz.

Para obter mais informações, consulte os exemplos de append.

Mais exemplos de alias

A recomendação é usar as expressões de contagem de campo para verificar se allOf ou anyOf dos membros de uma matriz no conteúdo da solicitação atendem a uma condição. Para algumas condições simples, é possível obter o mesmo resultado usando um acessador de campo com um alias de matriz, conforme descrito em Referenciando a coleção de membros da matriz. Esse padrão pode ser útil em regras de política que excedam o limite de expressões de count permitidas. Aqui estão exemplos de casos de uso comuns:

A regra de política de exemplo para a tabela de cenário a seguir:

"policyRule": {
  "if": {
    "allOf": [
      {
        "field": "Microsoft.Storage/storageAccounts/networkAcls.ipRules",
        "exists": "true"
      },
            <-- Condition (see table below) -->
    ]
  },
  "then": {
    "effect": "[parameters('effectType')]"
  }
}

A matriz ipRules é a seguinte para a tabela de cenários a seguir:

"ipRules": [
  {
    "value": "127.0.0.1",
    "action": "Allow"
  },
  {
    "value": "192.168.1.1",
    "action": "Allow"
  }
]

Para cada um dos exemplos de condição a seguir, substitua <field> por "field": "Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].value".

Os seguintes resultados são o resultado da combinação entre a condição, da regra de política de exemplo e da matriz de valores anteriormente:

Condição Resultado Cenário Explicação
{<field>,"notEquals":"127.0.0.1"} Nada Nenhuma correspondência Um elemento de matriz é avaliado como falso (127.0.0.1 != 127.0.0.1) e um como verdadeiro (127.0.0.1 != 192.168.1.1), portanto, a condição notEquals é falsa e o efeito não é disparado.
{<field>,"notEquals":"10.0.4.1"} Efeito de política Nenhuma correspondência Ambos os elementos da matriz são avaliados como verdadeiro (10.0.4.1 != 127.0.0.1 and 10.0.4.1 != 192.168.1.1), então a condição notEquals é verdadeiro e o efeito é disparado.
"not":{<field>,"notEquals":"127.0.0.1" } Efeito de política Uma ou mais correspondências Um elemento de matriz é avaliado como falso (127.0.0.1 != 127.0.0.1) e outro como verdadeiro (127.0.0.1 != 192.168.1.1), portanto, a condição notEquals é falsa. O operador lógico é avaliado como verdadeiro (não falso), então o efeito é disparado.
"not":{<field>,"notEquals":"10.0.4.1"} Nada Uma ou mais correspondências Ambos os elementos de matriz são avaliados como verdadeiros (10.0.4.1 != 127.0.0.1 and 10.0.4.1 != 192.168.1.1), portanto, a condição notEquals é verdadeira. O operador lógico é avaliado como falso (não verdadeiro), então o efeito não é disparado.
"not":{<field>,"Equals":"127.0.0.1"} Efeito de política Nem todos correspondem Um elemento de matriz é avaliado como verdadeiro (127.0.0.1 == 127.0.0.1) e outro como falso (127.0.0.1 == 192.168.1.1), portanto, a condição Equals é falsa. O operador lógico é avaliado como verdadeiro (não falso), então o efeito é disparado.
"not":{<field>,"Equals":"10.0.4.1"} Efeito de política Nem todos correspondem Ambos os elementos de matriz são avaliados como falso (10.0.4.1 == 127.0.0.1 and 10.0.4.1 == 192.168.1.1), portanto, a condição Equals é falsa. O operador lógico é avaliado como verdadeiro (não falso), então o efeito é disparado.
{<field>,"Equals":"127.0.0.1"} Nada Todos correspondem Um elemento de matriz é avaliado como verdadeiro (127.0.0.1 == 127.0.0.1) e outro como falso (127.0.0.1 == 192.168.1.1), portanto, a condição Equals é falsa e o efeito não é disparado.
{<field>,"Equals":"10.0.4.1"} Nada Todos correspondem Ambos os elementos da matriz são avaliados como verdadeiro (10.0.4.1 == 127.0.0.1 and 10.0.4.1 == 192.168.1.1), então a condição Equals é falsa e o efeito não é disparado.

Próximas etapas