Tworzenie zasad dla właściwości tablicy w zasobach platformy Azure

Właściwości usługi Azure Resource Manager są często definiowane jako ciągi i wartości logiczne. Gdy istnieje relacja jeden do wielu, złożone właściwości są definiowane jako tablice. W Azure Policy tablice są używane na kilka różnych sposobów:

  • Typ parametru definicji w celu udostępnienia wielu opcji
  • Część reguły zasad używająca warunków welem.
  • Część reguły zasad, która zlicza liczbę elementów członkowskich tablicy spełniających warunek
  • W dołączaniu i modyfikowaniu efektów w celu zaktualizowania istniejącej tablicy

W tym artykule opisano poszczególne zastosowania Azure Policy i przedstawiono kilka przykładowych definicji.

Tablice parametrów

Definiowanie tablicy parametrów

Zdefiniowanie parametru jako tablicy umożliwia elastyczność zasad, gdy potrzebna jest więcej niż jedna wartość. Ta definicja zasad zezwala na dowolną lokalizację parametru allowedLocations i wartości domyślne eastus2:

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

Ponieważ typ był ciągiem, podczas przypisywania zasad można ustawić tylko jedną wartość. Jeśli te zasady są przypisane, zasoby w zakresie są dozwolone tylko w jednym regionie świadczenia usługi Azure. Większość definicji zasad musi zezwalać na listę zatwierdzonych opcji, takich jak zezwolenie na eastus2, eastus i westus2.

Aby utworzyć definicję zasad zezwalaną na wiele opcji, użyj typutablicy. Te same zasady można przepisać w następujący sposób:

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

    }
}

Uwaga

Po zapisaniu definicji zasad nie można zmienić właściwości typu parametru.

Ta nowa definicja parametru przyjmuje więcej niż jedną wartość podczas przypisywania zasad. Po zdefiniowaniu właściwości array allowedValues wartości dostępne podczas przypisywania są dodatkowo ograniczone do wstępnie zdefiniowanej listy opcji. Użycie wartości allowedValues jest opcjonalne.

Przekazywanie wartości do tablicy parametrów podczas przypisywania

Podczas przypisywania zasad za pośrednictwem Azure Portal parametr tablicy typów jest wyświetlany jako pojedyncze pole tekstowe. Wskazówka mówi : "Użyj ; aby oddzielić wartości. (np. Londyn; Nowy Jork)". Aby przekazać dozwolone wartości lokalizacji eastus2, eastus i westus2 do parametru, użyj następującego ciągu:

eastus2;eastus;westus2

Format wartości parametru różni się w przypadku korzystania z interfejsu wiersza polecenia platformy Azure, Azure PowerShell lub interfejsu API REST. Wartości są przekazywane przez ciąg JSON, który zawiera również nazwę parametru.

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

Aby użyć tego ciągu dla każdego zestawu SDK, użyj następujących poleceń:

  • Interfejs wiersza polecenia platformy Azure: polecenie az policy assignment create z parametrami parametrów
  • Azure PowerShell: Polecenie cmdlet New-AzPolicyAssignment z parametrem PolicyParameter
  • Interfejs API REST: w operacji tworzeniaPUT w ramach treści żądania jako wartość właściwości properties.parameters

Używanie tablic w warunkach

In i notIn

Warunki in i notIn działają tylko z wartościami tablicy. Sprawdzają istnienie wartości w tablicy. Tablica może być tablicą literału JSON lub odwołaniem do parametru tablicy. Przykład:

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

Liczba wartości

Wyrażenie liczby wartości zlicza liczbę elementów członkowskich tablicy spełniających warunek. Zapewnia ona możliwość wielokrotnego oszacowania tego samego warunku przy użyciu różnych wartości w każdej iteracji. Na przykład następujący warunek sprawdza, czy nazwa zasobu jest zgodna z dowolnym wzorcem z tablicy wzorców:

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

Aby oszacować wyrażenie, Azure Policy oblicza where warunek trzy razy, raz dla każdego elementu członkowskiego [ "test*", "dev*", "prod*" ], zliczając, ile razy został obliczony na truewartość . W każdej iteracji wartość bieżącego elementu członkowskiego tablicy jest sparowana z nazwą indeksu zdefiniowaną pattern przez count.name. Tę wartość można następnie przywoływać wewnątrz where warunku, wywołując specjalną funkcję szablonu: current('pattern').

Iteracja current('pattern') zwrócona wartość
1 "test*"
2 "dev*"
3 "prod*"

Warunek ma wartość true tylko wtedy, gdy liczba wyników jest większa niż 0.

Aby warunek powyżej był bardziej ogólny, użyj odwołania do parametrów zamiast tablicy literałów:

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

Jeśli wyrażenie liczby wartości nie znajduje się w żadnym innym wyrażeniu count , jest opcjonalne, count.name a current() funkcja może być używana bez żadnych argumentów:

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

Liczba wartości obsługuje również tablice złożonych obiektów, co pozwala na bardziej złożone warunki. Na przykład następujący warunek definiuje żądaną wartość tagu dla każdego wzorca nazwy i sprawdza, czy nazwa zasobu jest zgodna ze wzorcem, ale nie ma wymaganej wartości tagu:

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

Aby zapoznać się z przydatnymi przykładami, zobacz przykłady liczby wartości.

Odwoływanie się do właściwości zasobu tablicy

Wiele przypadków użycia wymaga pracy z właściwościami tablicy w ocenianym zasobie. Niektóre scenariusze wymagają odwoływania się do całej tablicy (na przykład sprawdzania jego długości). Inne wymagają zastosowania warunku do każdego elementu członkowskiego tablicy (na przykład upewnij się, że wszystkie reguły zapory blokują dostęp z Internetu). Zrozumienie różnych sposobów Azure Policy może odwoływać się do właściwości zasobów i sposobu działania tych odwołań podczas odwoływania się do właściwości tablicy jest kluczem do pisania warunków obejmujących te scenariusze.

Odwoływanie się do właściwości zasobów

Do właściwości zasobów można odwoływać się Azure Policy przy użyciu aliasów Istnieją dwa sposoby odwoływanie się do wartości właściwości zasobu w Azure Policy:

  • Użyj warunku pola , aby sprawdzić, czy wszystkie wybrane właściwości zasobu spełniają warunek. Przykład:

    {
      "field" : "Microsoft.Test/resourceType/property",
      "equals": "value"
    }
    
  • Użyj field() funkcji, aby uzyskać dostęp do wartości właściwości. Przykład:

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

Warunek pola ma niejawne zachowanie "wszystkie". Jeśli alias reprezentuje kolekcję wartości, sprawdza, czy wszystkie poszczególne wartości spełniają warunek. Funkcja field() zwraca wartości reprezentowane przez alias as-is, które mogą być następnie manipulowane przez inne funkcje szablonu.

Odwoływanie się do pól tablicy

Właściwości zasobu tablicy są reprezentowane przez dwa różne typy aliasów. Jeden alias "normalny" i aliasy tablicy , które zostały [*] do niego dołączone:

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

Odwoływanie się do tablicy

Pierwszy alias reprezentuje pojedynczą wartość, wartość stringArray właściwości z zawartości żądania. Ponieważ wartość tej właściwości jest tablicą, nie jest przydatna w warunkach zasad. Przykład:

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

Ten warunek porównuje całą stringArray tablicę z pojedynczą wartością ciągu. Większość warunków, w tym equals, akceptuje tylko wartości ciągów, więc nie ma zbyt wiele użycia w porównaniu tablicy z ciągiem. Głównym scenariuszem, w którym odwoływanie się do właściwości tablicy jest przydatne podczas sprawdzania, czy istnieje:

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

W przypadku field() funkcji zwracana wartość jest tablicą z zawartości żądania, która może być następnie używana z dowolnymi obsługiwanymi funkcjami szablonu , które akceptują argumenty tablicowe. Na przykład następujący warunek sprawdza, czy długość stringArray jest większa niż 0:

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

Odwoływanie się do kolekcji elementów członkowskich tablicy

Aliasy używające [*] składni reprezentują kolekcję wartości właściwości wybranych z właściwości tablicy, która różni się od wybierania samej właściwości tablicy. W przypadku elementu Microsoft.Test/resourceType/stringArray[*]funkcja zwraca kolekcję zawierającą wszystkie elementy członkowskie elementu stringArray. Jak wspomniano wcześniej, warunek sprawdza, field czy wszystkie wybrane właściwości zasobu spełniają warunek, dlatego następujący warunek jest spełniony tylko wtedy, gdy wszystkie elementy członkowskie stringArray są równe "wartość".

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

Jeśli tablica jest pusta, warunek zwróci wartość true, ponieważ żaden element członkowski tablicy nie jest naruszony. W tym scenariuszu zaleca się użycie wyrażenia count . Jeśli tablica zawiera obiekty, [*] alias może służyć do wybierania wartości określonej właściwości z każdego elementu członkowskiego tablicy. Przykład:

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

Ten warunek ma wartość true, jeśli wartości wszystkich property właściwości we właściwościach objectArray są równe "value". Aby uzyskać więcej przykładów, zobacz Dodatkowe przykłady aliasów [*].

W przypadku używania field() funkcji do odwoływanie się do aliasu tablicy zwracana wartość jest tablicą wszystkich wybranych wartości. To zachowanie oznacza, że typowy przypadek field() użycia funkcji, możliwość stosowania funkcji szablonu do wartości właściwości zasobu jest ograniczona. Jedynymi funkcjami szablonu, które mogą być używane w tym przypadku, są te, które akceptują argumenty tablicowe. Na przykład można uzyskać długość tablicy za pomocą polecenia [length(field('Microsoft.Test/resourceType/objectArray[*].property'))]. Jednak bardziej złożone scenariusze, takie jak stosowanie funkcji szablonu do każdego elementu członkowskiego tablicy i porównywanie jej z żądaną wartością, są możliwe tylko w przypadku korzystania z count wyrażenia. Aby uzyskać więcej informacji, zobacz Wyrażenie liczby pól.

Aby podsumować, zobacz następującą przykładowa zawartość zasobu i wybrane wartości zwrócone przez różne aliasy:

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

W przypadku używania warunku pola w przykładowej zawartości zasobu wyniki są następujące:

Alias Wybrane wartości
Microsoft.Test/resourceType/missingArray null
Microsoft.Test/resourceType/missingArray[*] Pusta kolekcja wartości.
Microsoft.Test/resourceType/missingArray[*].property Pusta kolekcja wartości.
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

W przypadku korzystania z funkcji w field() przykładowej zawartości zasobu wyniki są następujące:

Wyrażenie Zwrócona wartość
[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]

Wyrażenia liczby pól

Wyrażenia liczby pól zliczają, ile elementów członkowskich tablicy spełnia warunek i porównuje liczbę z wartością docelową. Count jest bardziej intuicyjna i wszechstronna do oceniania tablic w porównaniu z field warunkami. Składnia jest następująca:

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

W przypadku użycia bez where warunku count po prostu zwraca długość tablicy. W przypadku przykładowej zawartości zasobu z poprzedniej sekcji count następujące wyrażenie jest oceniane na true wartość , ponieważ stringArray ma trzy elementy członkowskie:

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

To zachowanie działa również z zagnieżdżonych tablic. Na przykład następujące count wyrażenie jest oceniane, true ponieważ w tablicach znajdują się cztery elementy członkowskie nestedArray tablicy:

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

Moc count jest w where stanie. Po określeniu Azure Policy wylicza elementy członkowskie tablicy i ocenia każdy z nich względem warunku, zliczając liczbę elementów członkowskich tablicy obliczonych na truewartość . W szczególności, w każdej iteracji where warunku oceny, Azure Policy wybiera jeden element członkowski tablicy i i ocenia zawartość zasobu względem where warunku tak, jakby i jest jedynym elementem członkowskim tablicy. Posiadanie tylko jednego elementu członkowskiego tablicy dostępnego w każdej iteracji zapewnia sposób stosowania złożonych warunków dla każdego pojedynczego elementu członkowskiego tablicy.

Przykład:

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

Aby ocenić count wyrażenie, Azure Policy oblicza where warunek trzy razy, raz dla każdego elementu członkowskiego stringArray, zliczając, ile razy został obliczony na truewartość . where Gdy warunek odwołuje się do Microsoft.Test/resourceType/stringArray[*] elementów członkowskich tablicy, zamiast wybierać wszystkie elementy członkowskie elementu stringArray, będzie wybierać tylko jeden element członkowski tablicy za każdym razem:

Iteracja Wybrane Microsoft.Test/resourceType/stringArray[*] wartości where Wynik oceny
1 "a" true
2 "b" false
3 "c" false

1Zwraca wartość count .

Oto bardziej złożone wyrażenie:

{
  "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
}
Iteracja Wybrane wartości where Wynik oceny
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

1Zwraca wartość count .

Fakt, że where wyrażenie jest oceniane względem całej zawartości żądania (ze zmianami tylko do składowej tablicy, która jest obecnie wyliczana), oznacza, że where warunek może również odwoływać się do pól poza tablicą:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "field": "tags.env",
      "equals": "prod"
    }
  },
  "equals": 0
}
Iteracja Wybrane wartości where Wynik oceny
1 tags.env =>"prod" true
2 tags.env =>"prod" true

Wyrażenia zagnieżdżone liczby mogą służyć do stosowania warunków do zagnieżdżonych pól tablicy. Na przykład następujący warunek sprawdza, czy tablica objectArray[*] ma dokładnie dwa elementy członkowskie zawierające nestedArray[*] jeden lub więcej elementów członkowskich:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "count": {
        "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]"
      },
      "greaterOrEquals": 1
    }
  },
  "equals": 2
}
Iteracja Wybrane wartości Wynik oceny zagnieżdżonej liczby
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] ma 2 elementy członkowskie =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] ma 2 elementy członkowskie =>true

Ponieważ oba elementy członkowskie objectArray[*] mają tablicę nestedArray[*] podrzędną z dwoma członkami, wyrażenie liczby zewnętrznej zwraca wartość 2.

Bardziej złożony przykład: sprawdź, czy tablica objectArray[*] ma dokładnie dwa elementy członkowskie z dowolnymi elementami nestedArray[*] członkowskimi równymi 2 lub 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
}
Iteracja Wybrane wartości Wynik oceny zagnieżdżonej liczby
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] contains 2 =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] contains 3 =>true

Ponieważ oba elementy członkowskie objectArray[*] mają tablicę nestedArray[*] podrzędną zawierającą wartość 2 lub 3, wyrażenie liczby zewnętrznej zwraca wartość 2.

Uwaga

Zagnieżdżone wyrażenia liczby pól mogą odwoływać się tylko do zagnieżdżonych tablic. Na przykład wyrażenie zliczania odwołujące się do Microsoft.Test/resourceType/objectArray[*] może mieć zagnieżdżona liczba docelowa zagnieżdżonej tablicy Microsoft.Test/resourceType/objectArray[*].nestedArray[*], ale nie może mieć zagnieżdżonego wyrażenia liczbowego przeznaczonego dla Microsoft.Test/resourceType/stringArray[*]elementu .

Uzyskiwanie dostępu do bieżącego elementu członkowskiego tablicy za pomocą funkcji szablonu

W przypadku korzystania z funkcji szablonu użyj current() funkcji , aby uzyskać dostęp do wartości bieżącego elementu członkowskiego tablicy lub wartości dowolnej z jego właściwości. Aby uzyskać dostęp do wartości bieżącego elementu członkowskiego tablicy, przekaż alias zdefiniowany w count.field elemencie lub dowolny z jego aliasów podrzędnych jako argument funkcji current() . Przykład:

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

Iteracja current() zwrócona wartość where Wynik oceny
1 Wartość property elementu w pierwszym elemencie elementu członkowskiego objectArray[*]: value1 true
2 Wartość property elementu w pierwszym elemencie elementu członkowskiego objectArray[*]: value2 true

Funkcja pola w miejscu, w którym warunki

Funkcja field() może również służyć do uzyskiwania dostępu do wartości bieżącego elementu członkowskiego tablicy, o ile wyrażenie count nie znajduje się wewnątrz warunku istnienia (field() funkcja zawsze odwołuje się do zasobu ocenianego w warunku if ). Zachowanie podczas field() odwoływania się do ocenianej tablicy opiera się na następujących pojęciach:

  1. Aliasy tablic są rozpoznawane w kolekcji wartości wybranych ze wszystkich elementów członkowskich tablicy.
  2. field() funkcje odwołujące się do aliasów tablicy zwracają tablicę z wybranymi wartościami.
  3. Odwołanie do zliczanego aliasu tablicy wewnątrz where warunku zwraca kolekcję z pojedynczą wartością wybraną z elementu członkowskiego tablicy, który jest oceniany w bieżącej iteracji.

To zachowanie oznacza, że podczas odwoływania się do zliczanego elementu członkowskiego tablicy z field() funkcją wewnątrz where warunku zwraca tablicę z jednym elementem członkowskim. Chociaż to zachowanie może nie być intuicyjne, jest zgodne z ideą, że aliasy tablic zawsze zwracają kolekcję wybranych właściwości. Oto przykład:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[field('Microsoft.Test/resourceType/stringArray[*]')]"
    }
  },
  "equals": 0
}
Iteracja Wartości wyrażeń where Wynik oceny
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

W związku z tym, gdy istnieje potrzeba uzyskania dostępu do wartości zliczanego aliasu tablicy z field() funkcją first() , w tym celu należy opakować ją za pomocą funkcji szablonu:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[first(field('Microsoft.Test/resourceType/stringArray[*]'))]"
    }
  }
}
Iteracja Wartości wyrażeń where Wynik oceny
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

Aby zapoznać się z przydatnymi przykładami, zobacz Przykłady liczby pól.

Modyfikowanie tablic

Dołączanie i modyfikowanie właściwości zmiany zasobu podczas tworzenia lub aktualizowania. Podczas pracy z właściwościami tablicy zachowanie tych efektów zależy od tego, czy operacja próbuje zmodyfikować alias [*], czy nie:

Uwaga

modify Używanie efektu z aliasami jest obecnie w wersji zapoznawczej.

Alias Efekt Wynik
Microsoft.Storage/storageAccounts/networkAcls.ipRules append Azure Policy dołącza całą tablicę określoną w szczegółach efektu, jeśli brakuje.
Microsoft.Storage/storageAccounts/networkAcls.ipRules modifyz operacją add Azure Policy dołącza całą tablicę określoną w szczegółach efektu, jeśli brakuje.
Microsoft.Storage/storageAccounts/networkAcls.ipRules modifyz operacją addOrReplace Azure Policy dołącza całą tablicę określoną w szczegółach efektu, jeśli brakuje lub zastąpi istniejącą tablicę.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] append Azure Policy dołącza element członkowski tablicy określony w szczegółach efektu.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] modifyz operacją add Azure Policy dołącza element członkowski tablicy określony w szczegółach efektu.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] modifyz operacją addOrReplace Azure Policy usuwa wszystkie istniejące elementy członkowskie tablicy i dołącza element członkowski tablicy określony w szczegółach efektu.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action append Azure Policy dołącza wartość do action właściwości każdego elementu członkowskiego tablicy.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action modifyz operacją add Azure Policy dołącza wartość do action właściwości każdego elementu członkowskiego tablicy.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action modifyz operacją addOrReplace Azure Policy dołącza lub zastępuje istniejącą action właściwość każdego elementu członkowskiego tablicy.

Aby uzyskać więcej informacji, zobacz przykłady dołączania.

Dodatkowe przykłady aliasów [*]

Zaleca się użycie wyrażeń liczby pól w celu sprawdzenia, czy "wszystkie" lub "dowolne" elementy członkowskie tablicy w zawartości żądania spełniają warunek. Jednak w przypadku niektórych prostych warunków można osiągnąć ten sam wynik przy użyciu metody dostępu pola z aliasem tablicy, zgodnie z opisem w temacie Odwoływanie się do kolekcji składowych tablicy. Ten wzorzec może być przydatny w regułach zasad, które przekraczają limit dozwolonych wyrażeń liczbowych . Oto przykłady typowych przypadków użycia:

Przykładowa reguła zasad dla poniższej tabeli scenariuszy:

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

Tablica ipRules jest następująca w poniższej tabeli scenariuszy:

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

Dla każdego poniższego przykładu warunku zastąp ciąg <field>"field": "Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].value".

Następujące wyniki są wynikiem kombinacji warunku i przykładowej reguły zasad i tablicy istniejących wartości powyżej:

Warunek Wynik Scenariusz Objaśnienie
{<field>,"notEquals":"127.0.0.1"} Nothing Brak dopasowania Jeden element tablicy ocenia wartość false (127.0.0.1 != 127.0.0.1) i jeden jako true (127.0.0.1 != 192.168.1.1), więc warunek notEquals jest fałszywy , a efekt nie jest wyzwalany.
{<field>,"notEquals":"10.0.4.1"} Efekt zasad Brak dopasowania Oba elementy tablicy są obliczane jako true (10.0.4.1 != 127.0.0.1 i 10.0.4.1 != 192.168.1.1), więc warunek notEquals jest spełniony i efekt jest wyzwalany.
"not":{<field>,"notEquals":"127.0.0.1" } Efekt zasad Jeden lub więcej dopasowań Jeden element tablicy ocenia wartość false (127.0.0.1 != 127.0.0.1) i jeden jako true (127.0.0.1 != 192.168.1.1), więc warunek notEquals jest fałszywy. Operator logiczny ocenia wartość true (a niefalse), więc efekt jest wyzwalany.
"not":{<field>,"notEquals":"10.0.4.1"} Nothing Jeden lub więcej dopasowań Oba elementy tablicy mają wartość true (10.0.4.1 != 127.0.0.1 i 10.0.4.1 != 192.168.1.1), więc warunek notEquals jest spełniony. Operator logiczny ocenia wartość false (nieprawda), więc efekt nie jest wyzwalany.
"not":{<field>,"Equals":"127.0.0.1"} Efekt zasad Nie wszystkie dopasowania Jeden element tablicy ocenia wartość true (127.0.0.1 == 127.0.0.1) i jeden jako fałsz (127.0.0.1 == 192.168.1.1), więc warunek Equals jest fałszywy. Operator logiczny ocenia wartość true (a niefalse), więc efekt jest wyzwalany.
"not":{<field>,"Equals":"10.0.4.1"} Efekt zasad Nie wszystkie dopasowania Oba elementy tablicy są obliczane jako false (10.0.4.1 == 127.0.0.1 i 10.0.4.1 == 192.168.1.1), więc warunek Equals jest fałszywy. Operator logiczny ocenia wartość true (a niefalse), więc efekt jest wyzwalany.
{<field>,"Equals":"127.0.0.1"} Nothing Wszystkie dopasowania Jeden element tablicy ocenia wartość true (127.0.0.1 == 127.0.0.1) i jeden jako false (127.0.0.1 == 192.168.1.1), więc warunek Equals jest fałszywy i efekt nie jest wyzwalany.
{<field>,"Equals":"10.0.4.1"} Nothing Wszystkie dopasowania Oba elementy tablicy są obliczane jako false (10.0.4.1 == 127.0.0.1 i 10.0.4.1 == 192.168.1.1), więc warunek Equals jest fałszywy , a efekt nie jest wyzwalany.

Następne kroki