Kebijakan pembuat untuk properti array pada sumber daya Azure

Properti Azure Resource Manager umumnya ditentukan sebagai string dan boolean. Saat ada hubungan satu-ke-banyak, properti kompleks malah ditentukan sebagai array. Dalam Azure Policy, array digunakan dengan beberapa cara berbeda:

  • Jenis parameter definisi, untuk menyediakan beberapa opsi
  • Bagian dari aturan kebijakan menggunakan kondisi in atau notIn
  • Bagian dari aturan kebijakan yang menghitung berapa banyak anggota array yang memenuhi kondisi
  • Di efek tambahkan dan ubah untuk memperbarui array yang sudah ada

Artikel ini membahas setiap penggunaan oleh Azure Policy dan menyediakan beberapa definisi contoh.

Array parameter

Menentukan array parameter

Menentukan parameter sebagai array memungkinkan fleksibilitas kebijakan saat lebih dari satu nilai diperlukan. Definisi kebijakan ini memungkinkan setiap lokasi tunggal untuk parameter allowedLocations dan default ke eastus2:

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

Karena jenis adalah string, hanya satu nilai yang dapat diatur saat menetapkan kebijakan. Jika kebijakan ini ditetapkan, sumber daya dalam cakupan hanya diperbolehkan dalam satu wilayah Azure. Sebagian besar definisi kebijakan perlu mengizinkan daftar opsi yang disetujui, seperti mengizinkan eastus2, eastus, dan westus2.

Untuk membuat definisi kebijakan guna mengizinkan beberapa opsi, gunakan jenisarray. Kebijakan yang sama dapat ditulis ulang sebagai berikut:

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

    }
}

Catatan

Setelah definisi kebijakan disimpan, properti jenis pada parameter tidak dapat diubah.

Definisi parameter baru ini membutuhkan lebih dari satu nilai selama penugasan kebijakan. Dengan properti array allowedValues yang ditentukan, nilai yang tersedia selama penugasan dibatasi lebih lanjut pada daftar pilihan yang telah ditentukan sebelumnya. Penggunaan allowedValues bersifat opsional.

Meneruskan nilai ke array parameter selama penugasan

Saat menetapkan kebijakan melalui portal Microsoft Azure, parameter jenisarray ditampilkan sebagai kotak teks tunggal. Petunjuknya mengatakan "Gunakan ; untuk memisahkan nilai. (misalnya London;New York)". Untuk meneruskan nilai lokasi yang diizinkan dari eastus2, eastus, dan westus2 ke parameter, gunakan string berikut:

eastus2;eastus;westus2

Format untuk nilai parameter berbeda saat menggunakan Azure CLI, Azure PowerShell, atau REST API. Nilai diteruskan melalui string JSON yang juga menyertakan nama parameter.

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

Untuk menggunakan string ini dengan setiap SDK, gunakan perintah berikut:

  • Azure CLI: Perintah az policy assignment create dengan parameter param
  • Azure PowerShell: Cmdlet New-AzPolicyAssignment dengan parameter PolicyParameter
  • REST API: Dalam PUTbuat operasi sebagai bagian dari Isi Permintaan sebagai nilai properti properties.parameters

Menggunakan array dalam kondisi

In dan notIn

Kondisi in dan notIn hanya berfungsi dengan nilai array. Kondisi tersebut memeriksa keberadaan nilai dalam array. Array dapat berupa array JSON harfiah atau referensi ke parameter array. Contohnya:

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

Jumlah nilai

Ekspresi jumlah nilai menghitung berapa banyak anggota array yang memenuhi kondisi. Ini menyediakan cara untuk mengevaluasi kondisi yang sama beberapa kali, menggunakan nilai yang berbeda pada setiap perulangan. Misalnya, kondisi berikut memeriksa apakah nama sumber daya cocok dengan pola apa pun dari array pola:

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

Untuk mengevaluasi ekspresi, Azure Policy mengevaluasi kondisi where tiga kali, sekali untuk setiap anggota [ "test*", "dev*", "prod*" ], menghitung berapa kali dievaluasi ke true. Pada setiap perulangan, nilai anggota array saat ini dipasangkan dengan nama indeks pattern yang ditentukan oleh count.name. Nilai ini kemudian dapat direferensikan di dalam kondisi where dengan memanggil fungsi templat khusus: current('pattern').

Perulangan Nilai yang dikembalikan current('pattern')
1 "test*"
2 "dev*"
3 "prod*"

Kondisi ini berlaku hanya jika jumlah yang dihasilkan lebih besar dari 0.

Untuk membuat kondisi di atas lebih generik, gunakan referensi parameter sebagai ganti dari array harfiah:

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

Saat ekspresi jumlah nilai tidak berada di ekspresi jumlah lainnya, count.name bersifat opsional dan fungsi current() dapat digunakan tanpa argumen apa pun:

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

Jumlah nilai juga mendukung array objek kompleks, memungkinkan kondisi yang lebih kompleks. Misalnya, kondisi berikut menentukan nilai tag yang diinginkan untuk setiap pola nama dan memeriksa apakah nama sumber daya cocok dengan pola, tetapi tidak memiliki nilai tag yang diperlukan:

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

Untuk contoh yang berguna, lihat contoh jumlah nilai.

Mereferensikan properti sumber daya array

Banyak kasus penggunaan memerlukan bekerja dengan properti array dalam sumber daya yang dievaluasi. Beberapa skenario memerlukan referensi seluruh array (misalnya, memeriksa panjangnya). Lainnya memerlukan penerapan kondisi untuk setiap anggota array individu (misalnya, pastikan bahwa semua aturan firewall memblokir akses dari internet). Memahami berbagai cara Azure Policy dapat mereferensikan properti sumber daya, dan bagaimana referensi ini berperilaku saat merujuk ke properti array adalah kunci untuk menulis kondisi yang mencakup skenario ini.

Mereferensikan properti sumber daya

Properti sumber daya dapat direferensikan oleh Azure Policy menggunakan alias Ada dua cara untuk mereferensikan nilai properti sumber daya dalam Azure Policy:

  • Gunakan kondisi bidang untuk memeriksa apakah semua properti sumber daya yang dipilih memenuhi kondisi. Contoh:

    {
      "field" : "Microsoft.Test/resourceType/property",
      "equals": "value"
    }
    
  • Gunakan fungsi field() untuk mengakses nilai properti. Contoh:

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

Kondisi bidang memiliki perilaku "semua" implisit. Jika alias mewakili kumpulan nilai, alias akan memeriksa apakah semua nilai individual memenuhi kondisi tersebut. Fungsi field() mengembalikan nilai yang diwakili oleh alias apa adanya, yang kemudian dapat dimanipulasi oleh fungsi templat lainnya.

Mereferensikan bidang array

Array resource properties are represented by two different types of aliases. Satu alias 'normal' dan alias array yang memiliki [*] terlampir padanya:

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

Mereferensikan array

Alias pertama menunjukkan nilai tunggal, nilai properti stringArray dari konten permintaan. Karena nilai properti tersebut adalah array, properti tersebut tidak berguna dalam kondisi kebijakan. Contohnya:

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

Kondisi ini membandingkan seluruh array stringArray dengan nilai string tunggal. Sebagian besar kondisi, termasuk equals, hanya menerima nilai string, sehingga tidak ada banyak penggunaan dalam membandingkan array dengan string. Skenario utama di mana referensi properti array berguna adalah saat memeriksa apakah itu ada:

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

Dengan fungsi field(), nilai yang dikembalikan adalah array dari konten permintaan, yang kemudian dapat digunakan dengan salah satu fungsi templat yang didukung yang menerima argumen array. Misalnya, kondisi berikut memeriksa apakah panjangnya stringArray lebih besar dari 0:

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

Mereferensikan kumpulan anggota array

Alias yang menggunakan sintaksis [*] mewakili kumpulan nilai properti yang dipilih dari properti array, yang berbeda dari memilih properti array itu sendiri. Dalam kasus Microsoft.Test/resourceType/stringArray[*], ia mengembalikan kumpulan yang memiliki semua anggota stringArray. Seperti yang disebutkan sebelumnya, kondisi field memeriksa bahwa semua properti sumber daya yang dipilih memenuhi kondisi, oleh karena itu kondisi berikut ini benar hanya jika semua anggota stringArray sama dengan '"value"'.

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

Jika array kosong, kondisi akan mengevaluasi ke true karena tidak ada anggota array yang melanggar. Dalam skenario ini, disarankan untuk menggunakan ekspresi hitungan sebagai gantinya. Jika array berisi objek, alias [*] dapat digunakan untuk memilih nilai properti tertentu dari setiap anggota array. Contoh:

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

Kondisi ini benar jika nilai semua properti property di objectArray sama dengan "value". Untuk contoh lainnya, lihat Contoh alias [*] tambahan.

Saat menggunakan fungsi field() untuk mereferensikan alias array, nilai yang dikembalikan adalah array dari semua nilai yang dipilih. Perilaku ini berarti bahwa kasus penggunaan umum dari fungsi field(), kemampuan untuk menerapkan fungsi templat ke nilai properti sumber daya, terbatas. Satu-satunya fungsi templat yang dapat digunakan dalam kasus ini adalah fungsi yang menerima argumen array. Misalnya, dimungkinkan untuk mendapatkan panjang array dengan [length(field('Microsoft.Test/resourceType/objectArray[*].property'))]. Namun, skenario yang lebih kompleks seperti menerapkan fungsi templat ke setiap anggota array dan membandingkannya dengan nilai yang diinginkan hanya dimungkinkan saat menggunakan ekspresi count. Untuk informasi selengkapnya, lihat Ekspresi jumlah bidang.

Untuk meringkas, lihat contoh konten sumber daya berikut dan nilai yang dipilih yang dikembalikan oleh berbagai alias:

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

Saat menggunakan kondisi bidang pada contoh konten sumber daya, hasilnya adalah sebagai berikut:

Alias Nilai yang dipilih
Microsoft.Test/resourceType/missingArray null
Microsoft.Test/resourceType/missingArray[*] Kumpulan nilai kosong.
Microsoft.Test/resourceType/missingArray[*].property Kumpulan nilai kosong.
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

Saat menggunakan fungsi field() pada contoh konten sumber daya, hasilnya adalah sebagai berikut:

Ekspresi Nilai yang Dikembalikan
[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]

Ekspresi jumlah bidang

Ekspresi jumlah bidang menghitung berapa banyak anggota array yang memenuhi kondisi dan membandingkan jumlah tersebut dengan nilai target. Count lebih intuitif dan serbaguna untuk mengevaluasi array dibandingkan dengan kondisi field. Sintaksnya adalah:

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

Saat digunakan tanpa kondisi where, count hanya mengembalikan panjang array. Dengan contoh konten sumber daya dari bagian sebelumnya, ekspresi count berikut dievaluasi menjadi true karena stringArray memiliki tiga anggota:

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

Perilaku ini juga berfungsi dengan array berlapis. Misalnya, ekspresi count berikut dievaluasi menjadi true karena ada empat anggota array dalam array nestedArray:

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

Kekuatan count dalam kondisi where. Saat ditentukan, Azure Policy menghitung anggota array dan mengevaluasi masing-masing terhadap kondisi tersebut, menghitung berapa banyak anggota array yang dievaluasi menjadi true. Secara khusus, dalam setiap iterasi evaluasi kondisi where, Kebijakan Azure memilih anggota array tunggal i dan mengevaluasi konten sumber daya terhadap kondisi whereseolah-olah i adalah satu-satunya anggota array. Hanya memiliki satu anggota array yang tersedia dalam setiap perulangan memberikan cara untuk menerapkan kondisi kompleks pada setiap anggota array individu.

Contoh:

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

Untuk mengevaluasi ekspresi count, Azure Policy mengevaluasi kondisi where tiga kali, sekali untuk setiap anggota stringArray, menghitung berapa kali dievaluasi menjadi true. Saat kondisi where merujuk ke anggota array Microsoft.Test/resourceType/stringArray[*], daripada memilih semua anggota stringArray, kondisi tersebut hanya akan memilih satu anggota array setiap kali:

Perulangan Nilai Microsoft.Test/resourceType/stringArray[*] yang dipilih Hasil evaluasi where
1 "a" true
2 "b" false
3 "c" false

count mengembalikan 1.

Berikut adalah ekspresi yang lebih kompleks:

{
  "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
}
Perulangan Nilai yang dipilih Hasil evaluasi 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

count mengembalikan 1.

Fakta bahwa ekspresi where dievaluasi terhadap seluruh konten permintaan (dengan perubahan hanya pada anggota array yang saat ini sedang dijumlahkan) berarti bahwa kondisi where juga dapat merujuk ke bidang di luar array:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "field": "tags.env",
      "equals": "prod"
    }
  },
  "equals": 0
}
Perulangan Nilai yang dipilih Hasil evaluasi where
1 tags.env =>"prod" true
2 tags.env =>"prod" true

Ekspresi jumlah berlapis dapat digunakan untuk menerapkan kondisi ke bidang array berlapis. Misalnya, kondisi berikut memeriksa bahwa array objectArray[*] memiliki tepat dua anggota dengan nestedArray[*] yang berisi satu atau beberapa anggota:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "count": {
        "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]"
      },
      "greaterOrEquals": 1
    }
  },
  "equals": 2
}
Perulangan Nilai yang dipilih Hasil evaluasi hitungan berlapis
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] memiliki 2 anggota =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] memiliki 2 anggota =>true

Karena kedua anggota objectArray[*] memiliki array turunan nestedArray[*] dengan dua anggota, ekspresi jumlah terluar mengembalikan 2.

Contoh yang lebih kompleks: periksa apakah array objectArray[*] memiliki tepat dua anggota dengan nestedArray[*] dengan anggota mana pun yang sama dengan 2 atau 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
}
Perulangan Nilai yang dipilih Hasil evaluasi hitungan berlapis
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] berisi 2 =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] berisi 3 =>true

Karena kedua anggota objectArray[*] memiliki array turunan nestedArray[*] yang berisi 2 atau 3, ekspresi jumlah terluar mengembalikan 2.

Catatan

Ekspresi jumlah bidang berlapis hanya dapat merujuk ke array berlapis. Misalnya, ekspresi jumlah yang merujuk ke Microsoft.Test/resourceType/objectArray[*] dapat memiliki jumlah berlapis yang menargetkan array berlapis Microsoft.Test/resourceType/objectArray[*].nestedArray[*], tetapi tidak dapat memiliki penargetan ekspresi jumlah berlapis Microsoft.Test/resourceType/stringArray[*].

Mengakses anggota array saat ini dengan fungsi templat

Saat menggunakan fungsi templat, gunakan fungsi current() untuk mengakses nilai anggota array saat ini atau nilai salah satu propertinya. Untuk mengakses nilai anggota array saat ini, teruskan alias yang ditentukan dalam count.field atau salah satu alias turunannya sebagai argumen ke fungsi current(). Contohnya:

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

Perulangan Nilai yang dikembalikan current() Hasil evaluasi where
1 Nilai property pada anggota pertama objectArray[*]: value1 true
2 Nilai property pada anggota pertama objectArray[*]: value2 true

Fungsi bidang di dalam kondisi where

Fungsi field() uga dapat digunakan untuk mengakses nilai anggota array saat ini selama ekspresi jumlah tidak berada dalam kondisi keberadaan (fungsi field() selalu merujuk ke sumber daya yang dievaluasi dalam kondisi if). Perilaku field() saat merujuk ke array yang dievaluasi berdasarkan pada konsep berikut:

  1. Alias array diselesaikan menjadi kumpulan nilai yang dipilih dari semua anggota array.
  2. Fungsi field() mereferensikan alias array mengembalikan array dengan nilai yang dipilih.
  3. Mereferensikan alias array terhitung di dalam kondisi where mengembalikan kumpulan dengan nilai tunggal yang dipilih dari anggota array yang dievaluasi dalam perulangan saat ini.

Perilaku ini berarti bahwa jika merujuk ke anggota array yang dihitung dengan fungsi field() di dalam kondisi where, ia mengembalikan array dengan satu anggota. Meskipun perilaku ini mungkin tidak intuitif, hal tersebut konsisten dengan gagasan bahwa alias array selalu mengembalikan kumpulan properti yang dipilih. Berikut contohnya:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[field('Microsoft.Test/resourceType/stringArray[*]')]"
    }
  },
  "equals": 0
}
Perulangan Nilai ekspresi Hasil evaluasi 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

Oleh karena itu, saat ada kebutuhan untuk mengakses nilai alias array terhitung dengan fungsi field(), cara untuk melakukannya adalah dengan membungkusnya dengan fungsi templat first():

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[first(field('Microsoft.Test/resourceType/stringArray[*]'))]"
    }
  }
}
Perulangan Nilai ekspresi Hasil evaluasi 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

Untuk contoh yang berguna, lihat contoh jumlah Bidang.

Mengubah array

Tambahkan dan ubah mengubah properti di sumber daya selama pembuatan atau pembaruan. Saat bekerja dengan properti array, perilaku efek ini tergantung pada apakah operasi mencoba mengubah alias [*] atau tidak:

Catatan

Menggunakan efek modify dengan alias saat ini dalam pratinjau.

Alias Efek Hasil
Microsoft.Storage/storageAccounts/networkAcls.ipRules append Azure Policy menambahkan seluruh array yang ditentukan dalam detail efek jika hilang.
Microsoft.Storage/storageAccounts/networkAcls.ipRules modify dengan operasi add Azure Policy menambahkan seluruh array yang ditentukan dalam detail efek jika hilang.
Microsoft.Storage/storageAccounts/networkAcls.ipRules modify dengan operasi addOrReplace Azure Policy menambahkan seluruh array yang ditentukan dalam detail efek jika hilang atau mengganti array yang sudah ada.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] append Azure Policy menambahkan anggota array yang ditentukan dalam detail efek.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] modify dengan operasi add Azure Policy menambahkan anggota array yang ditentukan dalam detail efek.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] modify dengan operasi addOrReplace Azure Policy menghapus semua anggota array yang sudah ada dan menambahkan anggota array yang ditentukan dalam detail efek.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action append Azure Policy menambahkan nilai ke properti action setiap anggota array.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action modify dengan operasi add Azure Policy menambahkan nilai ke properti action setiap anggota array.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action modify dengan operasi addOrReplace Azure Policy menambahkan atau mengganti properti action yang sudah ada dari setiap anggota array.

Untuk informasi selengkapnya, lihat contoh tambahan.

Contoh alias [*] tambahan

Disarankan untuk menggunakan ekspresi jumlah bidang untuk memeriksa apakah 'semua' atau 'salah satu' anggota array dalam konten permintaan memenuhi syarat. Namun, untuk beberapa kondisi sederhana dimungkinkan untuk mencapai hasil yang sama dengan menggunakan pengakses bidang dengan alias array seperti yang dijelaskan dalam Mereferensi kumpulan anggota array. Pola ini dapat berguna dalam aturan kebijakan yang melebihi batas ekspresi jumlah yang diizinkan. Berikut adalah contoh untuk kasus penggunaan umum:

Contoh aturan kebijakan untuk tabel skenario di bawah ini:

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

Array ipRules adalah sebagai berikut untuk tabel skenario di bawah ini:

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

Untuk setiap contoh kondisi di bawah ini, ganti <field> dengan "field": "Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].value".

Hasil berikut adalah hasil dari kombinasi kondisi dan contoh aturan kebijakan dan array nilai yang ada di atas:

Kondisi Hasil Skenario Penjelasan
{<field>,"notEquals":"127.0.0.1"} Tidak ada Tidak ada yang cocok Satu elemen array mengevaluasi sebagai false (127.0.0.1 != 127.0.0.1) dan satu sebagai true (127.0.0.1 != 192.168.1.1), sehingga kondisi notEquals adalah false dan efeknya tidak dipicu.
{<field>,"notEquals":"10.0.4.1"} Efek Azure Policy Tidak ada yang cocok Kedua elemen array mengevaluasi sebagai true (10.0.4.1 != 127.0.0.1 dan 10.0.4.1 != 192.168.1.1), sehingga kondisi notEquals adalah true dan efeknya dipicu.
"not":{<field>,"notEquals":"127.0.0.1" } Efek Azure Policy Satu atau beberapa kecocokan Satu elemen array mengevaluasi sebagai false (127.0.0.1 != 127.0.0.1) dan satu sebagai true (127.0.0.1 != 192.168.1.1), sehingga kondisi notEquals adalah false. Operator logis mengevaluasi sebagai true (bukanfalse), sehingga efeknya dipicu.
"not":{<field>,"notEquals":"10.0.4.1"} Tidak ada Satu atau beberapa kecocokan Kedua elemen array mengevaluasi sebagai true (10.0.4.1 != 127.0.0.1 dan 10.0.4.1 != 192.168.1.1), sehingga kondisi notEquals adalah true. Operator logis mengevaluasi sebagai false (bukantrue), sehingga efeknya tidak dipicu.
"not":{<field>,"Equals":"127.0.0.1"} Efek Azure Policy Tidak semua cocok Satu elemen array mengevaluasi sebagai true (127.0.0.1 == 127.0.0.1) dan satu sebagai false (127.0.0.1 == 192.168.1.1), sehingga kondisi Equals adalah false. Operator logis mengevaluasi sebagai true (bukanfalse), sehingga efeknya dipicu.
"not":{<field>,"Equals":"10.0.4.1"} Efek Azure Policy Tidak semua cocok Kedua elemen array mengevaluasi sebagai false (10.0.4.1 == 127.0.0.1 dan 10.0.4.1 == 192.168.1.1), sehingga kondisi Equals adalah false. Operator logis mengevaluasi sebagai true (bukanfalse), sehingga efeknya dipicu.
{<field>,"Equals":"127.0.0.1"} Tidak ada Semua cocok Satu elemen array mengevaluasi sebagai false (127.0.0.1 != 127.0.0.1) dan satu sebagai true (127.0.0.1 != 192.168.1.1), sehingga kondisi Equals adalah false dan efeknya tidak dipicu.
{<field>,"Equals":"10.0.4.1"} Tidak ada Semua cocok Kedua elemen array mengevaluasi sebagai false (10.0.4.1 == 127.0.0.1 dan 10.0.4.1 == 192.168.1.1), sehingga kondisi Equals adalah false dan efeknya tidak dipicu.

Langkah berikutnya