Beleidsregels maken voor matrixeigenschappen in Azure-resources

Azure Resource Manager-eigenschappen worden meestal gedefinieerd als tekenreeksen en booleaanse waarden. Wanneer er een een-op-veel-relatie bestaat, worden complexe eigenschappen in plaats daarvan gedefinieerd als matrices. In Azure Policy worden matrices op verschillende manieren gebruikt:

  • Het type van een definitieparameter, om meerdere opties te bieden
  • Onderdeel van een beleidsregel die gebruikmaakt van de voorwaarden in of nietIn
  • Onderdeel van een beleidsregel waarmee wordt geteld hoeveel matrixleden voldoen aan een voorwaarde
  • In de effecten toevoegen en wijzigen om een bestaande matrix bij te werken

Dit artikel behandelt elk gebruik door Azure Policy en bevat verschillende voorbeelddefinities.

Parametermatrices

Een parametermatrix definiëren

Het definiëren van een parameter als een matrix zorgt voor de flexibiliteit van het beleid wanneer er meer dan één waarde nodig is. Deze beleidsdefinitie staat elke locatie toe voor de parameter allowedLocations en de standaardinstellingen voor eastus2:

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

Omdat het typetekenreeks is, kan slechts één waarde worden ingesteld bij het toewijzen van het beleid. Als dit beleid is toegewezen, zijn resources binnen het bereik slechts toegestaan binnen één Azure-regio. De meeste beleidsdefinities moeten een lijst met goedgekeurde opties toestaan, zoals eastus2, eastus en westus2 toestaan.

Als u de beleidsdefinitie wilt maken om meerdere opties toe te staan, gebruikt u het matrixtype. Hetzelfde beleid kan als volgt worden herschreven:

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

    }
}

Notitie

Zodra een beleidsdefinitie is opgeslagen, kan de eigenschap type voor een parameter niet meer worden gewijzigd.

Deze nieuwe parameterdefinitie neemt meer dan één waarde in beslag tijdens de beleidstoewijzing. Als de matrixeigenschap allowedValues is gedefinieerd, worden de waarden die beschikbaar zijn tijdens de toewijzing verder beperkt tot de vooraf gedefinieerde lijst met keuzes. Het gebruik van allowedValues is optioneel.

Waarden doorgeven aan een parametermatrix tijdens toewijzing

Wanneer u het beleid toewijst via de Azure Portal, wordt een parameter van het typematrix weergegeven als één tekstvak. De hint luidt: 'Gebruik ; om waarden van elkaar te scheiden. (b.v. Londen; New York)". Gebruik de volgende tekenreeks om de toegestane locatiewaarden van eastus2, eastus en westus2 door te geven aan de parameter:

eastus2;eastus;westus2

De indeling voor de parameterwaarde verschilt wanneer u Azure CLI, Azure PowerShell of de REST API gebruikt. De waarden worden doorgegeven via een JSON-tekenreeks die ook de naam van de parameter bevat.

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

Als u deze tekenreeks met elke SDK wilt gebruiken, gebruikt u de volgende opdrachten:

Matrices gebruiken in voorwaarden

In en notIn

De in voorwaarden en notIn werken alleen met matrixwaarden. Ze controleren het bestaan van een waarde in een matrix. De matrix kan een letterlijke JSON-matrix of een verwijzing naar een matrixparameter zijn. Bijvoorbeeld:

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

Aantal waarden

Met de expressie value count wordt geteld hoeveel matrixleden voldoen aan een voorwaarde. Het biedt een manier om dezelfde voorwaarde meerdere keren te evalueren, met behulp van verschillende waarden voor elke iteratie. Met de volgende voorwaarde wordt bijvoorbeeld gecontroleerd of de resourcenaam overeenkomt met een patroon uit een matrix met patronen:

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

Als u de expressie wilt evalueren, evalueert Azure Policy de where voorwaarde drie keer, één keer voor elk lid van [ "test*", "dev*", "prod*" ], waarbij wordt geteld hoe vaak deze is geëvalueerd naar true. Bij elke iteratie wordt de waarde van het huidige matrixlid gekoppeld aan de pattern indexnaam die is gedefinieerd door count.name. Vervolgens kan binnen de where voorwaarde naar deze waarde worden verwezen door een speciale sjabloonfunctie aan te roepen: current('pattern').

Iteratie current('pattern') geretourneerde waarde
1 "test*"
2 "dev*"
3 "prod*"

De voorwaarde is alleen waar als het aantal resulterende items groter is dan 0.

Als u de bovenstaande voorwaarde algemener wilt maken, gebruikt u parameterreferentie in plaats van een letterlijke matrix:

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

Wanneer de expressie value count niet onder een andere count-expressie staat, count.name is dit optioneel en kan de current() functie zonder argumenten worden gebruikt:

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

Het aantal waarden ondersteunt ook matrices van complexe objecten, waardoor complexere voorwaarden mogelijk zijn. De volgende voorwaarde definieert bijvoorbeeld een gewenste tagwaarde voor elk naampatroon en controleert of de resourcenaam overeenkomt met het patroon, maar niet de vereiste tagwaarde heeft:

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

Zie voorbeelden van waardeaantallen voor nuttige voorbeelden.

Naar eigenschappen van matrixresources verwijzen

Veel use cases vereisen het werken met matrixeigenschappen in de geëvalueerde resource. In sommige scenario's moet u verwijzen naar een hele matrix (bijvoorbeeld het controleren van de lengte). Andere vereisen dat een voorwaarde wordt toegepast op elk afzonderlijk matrixlid (zorg er bijvoorbeeld voor dat alle firewallregels toegang vanaf internet blokkeren). Inzicht in de verschillende manieren waarop Azure Policy kunnen verwijzen naar resource-eigenschappen en hoe deze verwijzingen zich gedragen wanneer ze verwijzen naar matrixeigenschappen, is de sleutel voor het schrijven van voorwaarden die betrekking hebben op deze scenario's.

Naar resource-eigenschappen verwijzen

Naar resource-eigenschappen kan worden verwezen door Azure Policy met behulp van aliassen Er zijn twee manieren om te verwijzen naar de waarden van een resource-eigenschap in Azure Policy:

  • Gebruik veldvoorwaarde om te controleren of alle geselecteerde resource-eigenschappen voldoen aan een voorwaarde. Voorbeeld:

    {
      "field" : "Microsoft.Test/resourceType/property",
      "equals": "value"
    }
    
  • Gebruik field() de functie om toegang te krijgen tot de waarde van een eigenschap. Voorbeeld:

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

De veldvoorwaarde heeft een impliciet 'alle'-gedrag. Als de alias een verzameling waarden vertegenwoordigt, wordt gecontroleerd of alle afzonderlijke waarden voldoen aan de voorwaarde. De field() functie retourneert de waarden die worden vertegenwoordigd door de alias as-is, die vervolgens kan worden bewerkt door andere sjabloonfuncties.

Naar matrixvelden verwijzen

Eigenschappen van matrixresources worden vertegenwoordigd door twee verschillende typen aliassen. Eén 'normale' alias en matrixaliassen die eraan zijn [*] gekoppeld:

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

Verwijzen naar de matrix

De eerste alias vertegenwoordigt één waarde, de waarde van stringArray eigenschap uit de aanvraaginhoud. Omdat de waarde van die eigenschap een matrix is, is deze niet nuttig in beleidsvoorwaarden. Bijvoorbeeld:

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

Met deze voorwaarde wordt de hele stringArray matrix vergeleken met één tekenreekswaarde. De meeste voorwaarden, waaronder equals, accepteren alleen tekenreekswaarden, dus het is niet handig om een matrix te vergelijken met een tekenreeks. Het belangrijkste scenario waarin verwijzen naar de matrixeigenschap handig is, is bij het controleren of deze bestaat:

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

Met de field() functie is de geretourneerde waarde de matrix uit de aanvraaginhoud, die vervolgens kan worden gebruikt met een van de ondersteunde sjabloonfuncties die matrixargumenten accepteren. Met de volgende voorwaarde wordt bijvoorbeeld gecontroleerd of de lengte van stringArray groter is dan 0:

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

Verwijzen naar de verzameling leden van de matrix

Aliassen die de [*] syntaxis gebruiken, vertegenwoordigen een verzameling eigenschapswaarden die zijn geselecteerd uit een matrixeigenschap, wat anders is dan het selecteren van de matrixeigenschap zelf. In het geval van Microsoft.Test/resourceType/stringArray[*], wordt een verzameling geretourneerd die alle leden van stringArraybevat. Zoals eerder vermeld, controleert een field voorwaarde of alle geselecteerde resource-eigenschappen voldoen aan de voorwaarde. Daarom is de volgende voorwaarde alleen waar als alle leden van stringArray gelijk zijn aan ''value'.

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

Als de matrix leeg is, wordt de voorwaarde geëvalueerd als true omdat er geen lid van de matrix in strijd is. In dit scenario is het raadzaam om in plaats daarvan de count-expressie te gebruiken. Als de matrix objecten bevat, kan een [*] alias worden gebruikt om de waarde van een specifieke eigenschap van elk matrixlid te selecteren. Voorbeeld:

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

Deze voorwaarde is waar als de waarden van alle property eigenschappen in objectArray gelijk zijn aan "value". Zie Aanvullende [*] aliasvoorbeelden voor meer voorbeelden.

Wanneer u de field() functie gebruikt om te verwijzen naar een matrixalias, is de geretourneerde waarde een matrix van alle geselecteerde waarden. Dit gedrag betekent dat het algemene gebruiksvoorbeeld van de field() functie, de mogelijkheid om sjabloonfuncties toe te passen op resource-eigenschapswaarden, beperkt is. De enige sjabloonfuncties die in dit geval kunnen worden gebruikt, zijn de functies die matrixargumenten accepteren. Het is bijvoorbeeld mogelijk om de lengte van de matrix op te halen met [length(field('Microsoft.Test/resourceType/objectArray[*].property'))]. Complexere scenario's, zoals het toepassen van een sjabloonfunctie op elk matrixlid en het vergelijken ervan met een gewenste waarde, zijn echter alleen mogelijk wanneer u de count expressie gebruikt. Zie Expressie voor aantal velden voor meer informatie.

Zie de volgende voorbeeldresource-inhoud en de geselecteerde waarden die door verschillende aliassen worden geretourneerd om samen te vatten:

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

Wanneer u de veldvoorwaarde voor de voorbeeldresource-inhoud gebruikt, zijn de resultaten als volgt:

Alias Geselecteerde waarden
Microsoft.Test/resourceType/missingArray null
Microsoft.Test/resourceType/missingArray[*] Een lege verzameling waarden.
Microsoft.Test/resourceType/missingArray[*].property Een lege verzameling waarden.
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

Wanneer u de field() functie gebruikt voor de voorbeeldresource-inhoud, zijn de resultaten als volgt:

Expression Geretourneerde waarde
[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]

Expressies voor het aantal velden

Expressies voor het aantal velden tellen hoeveel matrixleden aan een voorwaarde voldoen en vergelijken het aantal met een doelwaarde. Count is intuïtiever en veelzijdiger voor het evalueren van matrices in vergelijking field met voorwaarden. De syntaxis is:

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

Bij gebruik zonder voorwaarde where wordt count gewoon de lengte van een matrix geretourneerd. Met de voorbeeldresource-inhoud uit de vorige sectie wordt de volgende count expressie geëvalueerd, true omdat stringArray deze drie leden heeft:

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

Dit gedrag werkt ook met geneste matrices. De volgende count expressie wordt bijvoorbeeld geëvalueerd op true omdat er vier matrixleden in de nestedArray matrices zijn:

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

De kracht van count zit in de where voorwaarde. Wanneer deze is opgegeven, Azure Policy de matrixleden opsommen en elk op basis van de voorwaarde evalueren, tellend hoeveel matrixleden worden geëvalueerd tot true. In elke iteratie van de where voorwaardeevaluatie selecteert Azure Policy één matrixlid i en evalueert de resource-inhoud op basis van de where voorwaarde alsof i het enige lid van de matrix is. Als er slechts één matrixlid beschikbaar is in elke iteratie, kunt u complexe voorwaarden toepassen op elk afzonderlijk matrixlid.

Voorbeeld:

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

Als u de count expressie wilt evalueren, evalueert Azure Policy de where voorwaarde drie keer, één keer voor elk lid van stringArray, waarbij wordt geteld hoe vaak deze is geëvalueerd naar true. Wanneer de where voorwaarde verwijst naar de Microsoft.Test/resourceType/stringArray[*] matrixleden, in plaats van alle leden van stringArrayte selecteren, selecteert deze slechts één matrixlid telkens:

Iteratie Geselecteerde Microsoft.Test/resourceType/stringArray[*] waarden where Evaluatieresultaat
1 "a" true
2 "b" false
3 "c" false

De count retourneert 1.

Hier volgt een complexere expressie:

{
  "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
}
Iteratie Geselecteerde waarden where Evaluatieresultaat
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

De count retourneert 1.

Het feit dat de where expressie wordt geëvalueerd op de volledige aanvraaginhoud (met alleen wijzigingen in het matrixlid dat momenteel wordt opgesomd) betekent dat de where voorwaarde ook kan verwijzen naar velden buiten de matrix:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "field": "tags.env",
      "equals": "prod"
    }
  },
  "equals": 0
}
Iteratie Geselecteerde waarden where Evaluatieresultaat
1 tags.env =>"prod" true
2 tags.env =>"prod" true

Geneste tellingexpressies kunnen worden gebruikt om voorwaarden toe te passen op geneste matrixvelden. Met de volgende voorwaarde wordt bijvoorbeeld gecontroleerd of de objectArray[*] matrix precies twee leden heeft met nestedArray[*] een of meer leden:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "count": {
        "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]"
      },
      "greaterOrEquals": 1
    }
  },
  "equals": 2
}
Iteratie Geselecteerde waarden Evaluatieresultaat van geneste telling
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] heeft 2 leden =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] heeft 2 leden =>true

Omdat beide leden van objectArray[*] een onderliggende matrix nestedArray[*] met twee leden hebben, retourneert de buitenste tellingexpressie 2.

Complexer voorbeeld: controleer of de objectArray[*] matrix precies twee leden heeft met nestedArray[*] alle leden die gelijk zijn aan 2 of 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
}
Iteratie Geselecteerde waarden Evaluatieresultaat van geneste telling
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] bevat 2 =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] bevat 3 =>true

Omdat beide leden van objectArray[*] een onderliggende matrix nestedArray[*] hebben die of 3bevat, retourneert 2 de buitenste tellingexpressie 2.

Notitie

Geneste expressies voor het aantal velden kunnen alleen verwijzen naar geneste matrices. Een tellingexpressie waarnaar verwijst Microsoft.Test/resourceType/objectArray[*] , kan bijvoorbeeld een geneste telling hebben die is gericht op de geneste matrix Microsoft.Test/resourceType/objectArray[*].nestedArray[*], maar kan geen geneste tellingexpressie hebben die is gericht op Microsoft.Test/resourceType/stringArray[*].

Toegang tot huidig matrixlid met sjabloonfuncties

Wanneer u sjabloonfuncties gebruikt, gebruikt u de current() functie voor toegang tot de waarde van het huidige matrixlid of de waarden van een van de eigenschappen ervan. Als u toegang wilt krijgen tot de waarde van het huidige matrixlid, geeft u de alias die is gedefinieerd in count.field of een van de onderliggende aliassen door aan de current() functie. Bijvoorbeeld:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
        "value": "[current('Microsoft.Test/resourceType/objectArray[*].property')]",
        "like": "value*"
    }
  },
  "equals": 2
}

Iteratie current() geretourneerde waarde where Evaluatieresultaat
1 De waarde van property in het eerste lid van objectArray[*]: value1 true
2 De waarde van property in het eerste lid van objectArray[*]: value2 true

De veldfunctie binnen where conditions

De field() functie kan ook worden gebruikt voor toegang tot de waarde van het huidige matrixlid zolang de expressie count zich niet binnen een bestaansvoorwaarde bevindt (field() functie verwijst altijd naar de resource die wordt geëvalueerd in de if-voorwaarde ). Het gedrag van field() wanneer wordt verwezen naar de geëvalueerde matrix is gebaseerd op de volgende concepten:

  1. Matrixaliassen worden omgezet in een verzameling waarden die zijn geselecteerd uit alle matrixleden.
  2. field() functies die verwijzen naar matrixaliassen retourneren een matrix met de geselecteerde waarden.
  3. Als u verwijst naar de getelde matrixalias in de where voorwaarde, wordt een verzameling geretourneerd met één waarde die is geselecteerd uit het matrixlid dat wordt geëvalueerd in de huidige iteratie.

Dit gedrag betekent dat wanneer het verwijst naar het getelde matrixlid met een field() functie binnen de where voorwaarde, het een matrix met één lid retourneert. Hoewel dit gedrag mogelijk niet intuïtief is, is het consistent met het idee dat matrixaliassen altijd een verzameling geselecteerde eigenschappen retourneren. Hier volgt een voorbeeld:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[field('Microsoft.Test/resourceType/stringArray[*]')]"
    }
  },
  "equals": 0
}
Iteratie Expressiewaarden where Evaluatieresultaat
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

Wanneer er dus toegang nodig is tot de waarde van de getelde matrixalias met een field() functie, kunt u dit doen door deze te verpakken met een first() sjabloonfunctie:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[first(field('Microsoft.Test/resourceType/stringArray[*]'))]"
    }
  }
}
Iteratie Expressiewaarden where Evaluatieresultaat
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

Zie Voorbeelden van het aantal velden voor nuttige voorbeelden.

Matrices wijzigen

Het toevoegen en wijzigen van eigenschappen voor een resource tijdens het maken of bijwerken . Wanneer u met matrixeigenschappen werkt, is het gedrag van deze effecten afhankelijk van het feit of de bewerking probeert de alias [*] te wijzigen of niet:

Notitie

Het gebruik van het modify effect met aliassen is momenteel in preview.

Alias Effect Resultaat
Microsoft.Storage/storageAccounts/networkAcls.ipRules append Azure Policy voegt de hele matrix toe die is opgegeven in de effectdetails als deze ontbreekt.
Microsoft.Storage/storageAccounts/networkAcls.ipRules modify met add bewerking Azure Policy voegt de hele matrix toe die is opgegeven in de effectdetails als deze ontbreekt.
Microsoft.Storage/storageAccounts/networkAcls.ipRules modify met addOrReplace bewerking Azure Policy voegt de hele matrix toe die is opgegeven in de effectdetails als de bestaande matrix ontbreekt of vervangt.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] append Azure Policy voegt het matrixlid toe dat is opgegeven in de effectdetails.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] modify met add bewerking Azure Policy voegt het matrixlid toe dat is opgegeven in de effectdetails.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] modify met addOrReplace bewerking Azure Policy verwijdert alle bestaande matrixleden en voegt het matrixlid toe dat is opgegeven in de effectdetails.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action append Azure Policy voegt een waarde toe aan de action eigenschap van elk matrixlid.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action modify met add bewerking Azure Policy voegt een waarde toe aan de action eigenschap van elk matrixlid.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action modify met addOrReplace bewerking Azure Policy voegt de bestaande action eigenschap van elk matrixlid toe of vervangt deze.

Zie de toevoegvoorbeelden voor meer informatie.

Aanvullende [*] aliasvoorbeelden

Het is raadzaam om de expressies voor het aantal velden te gebruiken om te controleren of 'alle' of 'een van' de leden van een matrix in de aanvraaginhoud voldoen aan een voorwaarde. Voor sommige eenvoudige voorwaarden is het echter mogelijk om hetzelfde resultaat te bereiken met behulp van een veldtoegangsor met een matrixalias, zoals beschreven in Verwijzen naar de verzameling matrixleden. Dit patroon kan handig zijn in beleidsregels die de limiet van toegestane count-expressies overschrijden. Hier volgen enkele voorbeelden voor veelvoorkomende gebruiksvoorbeelden:

De voorbeeldbeleidsregel voor de onderstaande scenariotabel:

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

De matrix ipRules ziet er als volgt uit voor de onderstaande scenariotabel:

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

Vervang voor elk voorbeeld van de onderstaande voorwaarde door <field>"field": "Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].value".

De volgende resultaten zijn het resultaat van de combinatie van de voorwaarde en de voorbeeldbeleidsregel en matrix van bestaande waarden hierboven:

Voorwaarde Resultaat Scenario Uitleg
{<field>,"notEquals":"127.0.0.1"} Niets Geen overeenkomst Eén matrixelement wordt geëvalueerd als onwaar (127.0.0.1 != 127.0.0.1) en één als true (127.0.0.1 != 192.168.1.1), zodat de voorwaarde notEqualsonwaar is en het effect niet wordt geactiveerd.
{<field>,"notEquals":"10.0.4.1"} Beleidseffect Geen overeenkomst Beide matrixelementen evalueren als true (10.0.4.1 != 127.0.0.1 en 10.0.4.1 != 192.168.1.1), dus de voorwaarde notEquals is true en het effect wordt geactiveerd.
"not":{<field>,"notEquals":"127.0.0.1" } Beleidseffect Een of meer overeenkomsten Eén matrixelement wordt geëvalueerd als onwaar (127.0.0.1 != 127.0.0.1) en één als true (127.0.0.1 != 192.168.1.1), dus de voorwaarde notEquals is false. De logische operator evalueert als waar (nietonwaar), zodat het effect wordt geactiveerd.
"not":{<field>,"notEquals":"10.0.4.1"} Niets Een of meer overeenkomsten Beide matrixelementen evalueren als true (10.0.4.1 != 127.0.0.1 en 10.0.4.1 != 192.168.1.1), dus de voorwaarde notEquals is true. De logische operator evalueert als onwaar (nietwaar), zodat het effect niet wordt geactiveerd.
"not":{<field>,"Equals":"127.0.0.1"} Beleidseffect Niet alle overeenkomsten Eén matrixelement resulteert in waar (127.0.0.1 == 127.0.0.1) en één als onwaar (127.0.0.1 == 192.168.1.1), dus de voorwaarde Is gelijk aan is onwaar. De logische operator evalueert als waar (nietonwaar), zodat het effect wordt geactiveerd.
"not":{<field>,"Equals":"10.0.4.1"} Beleidseffect Niet alle overeenkomsten Beide matrixelementen worden geëvalueerd als onwaar (10.0.4.1 == 127.0.0.1 en 10.0.4.1 == 192.168.1.1), dus de voorwaarde is gelijk aanonwaar. De logische operator evalueert als waar (nietonwaar), zodat het effect wordt geactiveerd.
{<field>,"Equals":"127.0.0.1"} Niets Alles komt overeen Eén matrixelement wordt geëvalueerd als waar (127.0.0.1 == 127.0.0.1) en één als onwaar (127.0.0.1 == 192.168.1.1), zodat de voorwaarde Gelijk aanonwaar is en het effect niet wordt geactiveerd.
{<field>,"Equals":"10.0.4.1"} Niets Alles komt overeen Beide matrixelementen worden geëvalueerd als onwaar (10.0.4.1 == 127.0.0.1 en 10.0.4.1 == 192.168.1.1), zodat de voorwaarde Is gelijk aanonwaar is en het effect niet wordt geactiveerd.

Volgende stappen