Sampel kueri Azure Resource Graph tingkat lanjut

Langkah pertama untuk memahami kueri dengan Azure Resource Graph adalah pemahaman dasar tentang Bahasa Kueri. Jika Anda belum terbiasa dengan Azure Data Explorer, sebaiknya tinjau dasar-dasarnya untuk memahami cara membuat permintaan untuk sumber daya yang Anda cari.

Kami akan membahas kueri tingkat lanjut berikut:

Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

Dukungan bahasa

Azure CLI (melalui ekstensi) dan Azure PowerShell (melalui modul) mendukung Azure Resource Graph. Sebelum menjalankan salah satu kueri berikut, periksa apakah lingkungan Anda sudah siap. Lihat Azure CLI dan Azure PowerShell untuk langkah-langkah memasang dan memvalidasi lingkungan shell pilihan Anda.

Menampilkan jenis sumber daya dan versi API

Resource Graph utamanya menggunakan versi non-pratinjau terbaru dari API Penyedia Sumber untuk properti sumber daya GET selama pembaruan. Dalam beberapa kasus, versi API yang digunakan telah diganti untuk memberikan lebih banyak properti saat ini atau yang banyak digunakan dalam hasil. Kueri berikut merinci versi API yang digunakan untuk mengumpulkan properti pada setiap jenis sumber daya:

Resources
| distinct type, apiVersion
| where isnotnull(apiVersion)
| order by type asc
az graph query -q "Resources | distinct type, apiVersion | where isnotnull(apiVersion) | order by type asc"

Mendapatkan kapasitas dan ukuran set skala komputer virtual

Kueri ini mencari sumber daya set skala komputer virtual dan mendapatkan berbagai detail termasuk ukuran komputer virtual dan kapasitas set skala. Kueri menggunakan fungsi toint() untuk mentransmisikan kapasitas ke angka sehingga dapat diurutkan. Akhirnya, kolom diubah namanya menjadi properti dengan nama kustom.

Resources
| where type=~ 'microsoft.compute/virtualmachinescalesets'
| where name contains 'contoso'
| project subscriptionId, name, location, resourceGroup, Capacity = toint(sku.capacity), Tier = sku.name
| order by Capacity desc
az graph query -q "Resources | where type=~ 'microsoft.compute/virtualmachinescalesets' | where name contains 'contoso' | project subscriptionId, name, location, resourceGroup, Capacity = toint(sku.capacity), Tier = sku.name | order by Capacity desc"

Menghapus kolom dari hasil

Kueri berikut menggunakan summarize untuk menghitung sumber daya menurut langganan, join untuk menggabungkannya dengan detail langganan dari tabel ResourceContainers, lalu project-away untuk menghapus beberapa kolom.

Resources
| summarize resourceCount=count() by subscriptionId
| join (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId
| project-away subscriptionId, subscriptionId1
az graph query -q "Resources | summarize resourceCount=count() by subscriptionId | join (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId| project-away subscriptionId, subscriptionId1"

Mencantumkan semua nama tag

Kueri ini dimulai dengan tag dan membangun objek JSON yang mencantumkan semua nama tag unik dan jenis yang sesuai.

Resources
| project tags
| summarize buildschema(tags)
az graph query -q "Resources | project tags | summarize buildschema(tags)"

Komputer virtual dicocokkan dengan regex

Kueri ini mencari komputer virtual yang cocok dengan ekspresi reguler (dikenal sebagai regex). mencocokkan regex @memungkinkan kami menentukan regex yang akan dicocokkan, yaitu ^Contoso(.*)[0-9]+$. Definisi regex tersebut dijelaskan sebagai:

  • ^ - Pencocokan harus dimulai dari awal string.
  • Contoso - String peka huruf besar/kecil.
  • (.*) - Kecocokan subekspresi:
    • . - Mencocokkan satu karakter mana pun (kecuali baris baru).
    • * - Mencocokkan elemen sebelumnya nol kali atau lebih.
  • [0-9] - Pencocokan grup karakter untuk angka 0 hingga 9.
  • + - Mencocokkan elemen sebelumnya satu kali atau lebih.
  • $ - Kecocokan elemen sebelumnya harus terjadi di akhir string.

Setelah mencocokkan berdasarkan nama, kueri memproyeksikan nama dan pesanan berdasarkan nama naik.

Resources
| where type =~ 'microsoft.compute/virtualmachines' and name matches regex @'^Contoso(.*)[0-9]+$'
| project name
| order by name asc
az graph query -q "Resources | where type =~ 'microsoft.compute/virtualmachines' and name matches regex @'^Contoso(.*)[0-9]+\$' | project name | order by name asc"

Mencantumkan Azure Cosmos DB dengan lokasi penulisan tertentu

Batas kueri berikut untuk sumber daya Azure Cosmos DB, menggunakan mv-expand untuk memperluas kantong properti untuk properties.writeLocations, lalu memproyeksikan bidang tertentu dan membatasi hasilnya lebih lanjut ke properties.writeLocations.locationName nilai yang cocok dengan 'US Timur' atau 'US Barat'.

Resources
| where type =~ 'microsoft.documentdb/databaseaccounts'
| project id, name, writeLocations = (properties.writeLocations)
| mv-expand writeLocations
| project id, name, writeLocation = tostring(writeLocations.locationName)
| where writeLocation in ('East US', 'West US')
| summarize by id, name
az graph query -q "Resources | where type =~ 'microsoft.documentdb/databaseaccounts' | project id, name, writeLocations = (properties.writeLocations) | mv-expand writeLocations | project id, name, writeLocation = tostring(writeLocations.locationName) | where writeLocation in ('East US', 'West US') | summarize by id, name"

Brankas kunci dengan nama langganan

Kueri berikut menunjukkan penggunaan kompleks join dengan jenis sebagai leftouter. Kueri membatasi tabel gabungan untuk sumber daya langganan dan dengan project hanya menyertakan bidang asli subscriptionId dan bidang nama yang diganti namanya menjadi SubName. Penggantian nama bidang menghindari join menambahkannya sebagai nama1 karena bidang sudah ada di sumber daya. Tabel asli difilter dengan where dan project berikut menyertakan kolom dari kedua tabel. Hasil kueri adalah semua jenis yang menampilkan brankas kunci, nama brankas kunci, dan nama langganan brankas kunci.

Resources
| join kind=leftouter (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId
| where type == 'microsoft.keyvault/vaults'
| project type, name, SubName
az graph query -q "Resources | join kind=leftouter (ResourceContainers | where type=='microsoft.resources/subscriptions' | project SubName=name, subscriptionId) on subscriptionId | where type == 'microsoft.keyvault/vaults' | project type, name, SubName"

Mencantumkan Azure SQL Database dan kumpulan elastisnya

Kueri berikut menggunakan leftouterjoin untuk menyatukan sumber daya Azure SQL Database dan kumpulan elastis terkait, jika ada.

Resources
| where type =~ 'microsoft.sql/servers/databases'
| project databaseId = id, databaseName = name, elasticPoolId = tolower(tostring(properties.elasticPoolId))
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.sql/servers/elasticpools'
    | project elasticPoolId = tolower(id), elasticPoolName = name, elasticPoolState = properties.state)
on elasticPoolId
| project-away elasticPoolId1
az graph query -q "Resources | where type =~ 'microsoft.sql/servers/databases' | project databaseId = id, databaseName = name, elasticPoolId = tolower(tostring(properties.elasticPoolId)) | join kind=leftouter ( Resources | where type =~ 'microsoft.sql/servers/elasticpools' | project elasticPoolId = tolower(id), elasticPoolName = name, elasticPoolState = properties.state) on elasticPoolId | project-away elasticPoolId1"

Mencantumkan komputer virtual dengan antarmuka jaringan dan IP publiknya

Kueri ini menggunakan dua perintah leftouterjoin untuk menyatukan mesin virtual yang dibuat dengan model penyebaran Azure Resource Manager, antarmuka jaringan terkait, dan alamat IP publik mana pun yang terkait dengan antarmuka jaringan tersebut.

Resources
| where type =~ 'microsoft.compute/virtualmachines'
| extend nics=array_length(properties.networkProfile.networkInterfaces)
| mv-expand nic=properties.networkProfile.networkInterfaces
| where nics == 1 or nic.properties.primary =~ 'true' or isempty(nic)
| project vmId = id, vmName = name, vmSize=tostring(properties.hardwareProfile.vmSize), nicId = tostring(nic.id)
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.network/networkinterfaces'
    | extend ipConfigsCount=array_length(properties.ipConfigurations)
    | mv-expand ipconfig=properties.ipConfigurations
    | where ipConfigsCount == 1 or ipconfig.properties.primary =~ 'true'
    | project nicId = id, publicIpId = tostring(ipconfig.properties.publicIPAddress.id))
on nicId
| project-away nicId1
| summarize by vmId, vmName, vmSize, nicId, publicIpId
| join kind=leftouter (
    Resources
    | where type =~ 'microsoft.network/publicipaddresses'
    | project publicIpId = id, publicIpAddress = properties.ipAddress)
on publicIpId
| project-away publicIpId1
az graph query -q "Resources | where type =~ 'microsoft.compute/virtualmachines' | extend nics=array_length(properties.networkProfile.networkInterfaces) | mv-expand nic=properties.networkProfile.networkInterfaces | where nics == 1 or nic.properties.primary =~ 'true' or isempty(nic) | project vmId = id, vmName = name, vmSize=tostring(properties.hardwareProfile.vmSize), nicId = tostring(nic.id) | join kind=leftouter ( Resources | where type =~ 'microsoft.network/networkinterfaces' | extend ipConfigsCount=array_length(properties.ipConfigurations) | mv-expand ipconfig=properties.ipConfigurations | where ipConfigsCount == 1 or ipconfig.properties.primary =~ 'true' | project nicId = id, publicIpId = tostring(ipconfig.properties.publicIPAddress.id)) on nicId | project-away nicId1 | summarize by vmId, vmName, vmSize, nicId, publicIpId | join kind=leftouter ( Resources | where type =~ 'microsoft.network/publicipaddresses' | project publicIpId = id, publicIpAddress = properties.ipAddress) on publicIpId | project-away publicIpId1"

Mencantumkan semua ekstensi yang dipasang di komputer virtual

Pertama, kueri ini menggunakan extend pada jenis sumber daya komputer virtual untuk mendapatkan ID dalam huruf besar (toupper()) ID, mendapatkan nama dan jenis sistem operasi, dan mendapatkan ukuran komputer virtual. Mendapatkan ID sumber daya dalam huruf besar adalah cara yang baik untuk bersiap bergabung ke properti lain. Kemudian, kueri menggunakan join dengan jenis sebagai leftouter untuk mendapatkan ekstensi komputer virtual dengan mencocokkan substring huruf besar ID ekstensi. Bagian ID sebelum "/extensions/<ExtensionName>" adalah format yang sama dengan ID mesin virtual, jadi kami menggunakan properti ini untuk join. summarize kemudian digunakan dengan make_list pada nama ekstensi komputer virtual untuk menggabungkan nama setiap ekstensi di mana id, OSName, OSType, dan VMSize adalah sama menjadi satu properti array. Terakhir, kami order byOSName dengan huruf kecil dengan asc. Secara default, order by turun.

Resources
| where type == 'microsoft.compute/virtualmachines'
| extend
    JoinID = toupper(id),
    OSName = tostring(properties.osProfile.computerName),
    OSType = tostring(properties.storageProfile.osDisk.osType),
    VMSize = tostring(properties.hardwareProfile.vmSize)
| join kind=leftouter(
    Resources
    | where type == 'microsoft.compute/virtualmachines/extensions'
    | extend
        VMId = toupper(substring(id, 0, indexof(id, '/extensions'))),
        ExtensionName = name
) on $left.JoinID == $right.VMId
| summarize Extensions = make_list(ExtensionName) by id, OSName, OSType, VMSize
| order by tolower(OSName) asc
az graph query -q "Resources | where type == 'microsoft.compute/virtualmachines' | extend JoinID = toupper(id), OSName = tostring(properties.osProfile.computerName), OSType = tostring(properties.storageProfile.osDisk.osType), VMSize = tostring(properties.hardwareProfile.vmSize) | join kind=leftouter( Resources | where type == 'microsoft.compute/virtualmachines/extensions' | extend VMId = toupper(substring(id, 0, indexof(id, '/extensions'))), ExtensionName = name ) on \$left.JoinID == \$right.VMId | summarize Extensions = make_list(ExtensionName) by id, OSName, OSType, VMSize | order by tolower(OSName) asc"

Menemukan akun penyimpanan dengan tag tertentu di grup sumber daya

Kueri berikut menggunakan bagian dalamjoin untuk menyambungkan akun penyimpanan dengan grup sumber daya yang memiliki nama tag dan nilai tag yang peka huruf besar/kecil tertentu.

Resources
| where type =~ 'microsoft.storage/storageaccounts'
| join kind=inner (
    ResourceContainers
    | where type =~ 'microsoft.resources/subscriptions/resourcegroups'
    | where tags['Key1'] =~ 'Value1'
    | project subscriptionId, resourceGroup)
on subscriptionId, resourceGroup
| project-away subscriptionId1, resourceGroup1
az graph query -q "Resources | where type =~ 'microsoft.storage/storageaccounts' | join kind=inner ( ResourceContainers | where type =~ 'microsoft.resources/subscriptions/resourcegroups' | where tags['Key1'] =~ 'Value1' | project subscriptionId, resourceGroup) on subscriptionId, resourceGroup | project-away subscriptionId1, resourceGroup1"

Jika perlu mencari nama tag dan nilai tag yang tidak peka huruf besar/kecil, gunakan mv-expand dengan parameter bagexpansion. Kueri ini menggunakan lebih banyak kuota daripada kueri sebelumnya, jadi gunakan mv-expand hanya jika perlu.

Resources
| where type =~ 'microsoft.storage/storageaccounts'
| join kind=inner (
    ResourceContainers
    | where type =~ 'microsoft.resources/subscriptions/resourcegroups'
    | mv-expand bagexpansion=array tags
    | where isnotempty(tags)
    | where tags[0] =~ 'key1' and tags[1] =~ 'value1'
    | project subscriptionId, resourceGroup)
on subscriptionId, resourceGroup
| project-away subscriptionId1, resourceGroup1
az graph query -q "Resources | where type =~ 'microsoft.storage/storageaccounts' | join kind=inner ( ResourceContainers | where type =~ 'microsoft.resources/subscriptions/resourcegroups' | mv-expand bagexpansion=array tags | where isnotempty(tags) | where tags[0] =~ 'key1' and tags[1] =~ 'value1' | project subscriptionId, resourceGroup) on subscriptionId, resourceGroup | project-away subscriptionId1, resourceGroup1"

Menggabungkan hasil dari dua kueri menjadi satu hasil

Kueri berikut menggunakan union untuk mendapatkan hasil dari tabel ResourceContainers dan menambahkannya ke hasil dari tabel Sumber Daya.

ResourceContainers
| where type=='microsoft.resources/subscriptions/resourcegroups' | project name, type  | limit 5
| union  (Resources | project name, type | limit 5)
az graph query -q "ResourceContainers | where type=='microsoft.resources/subscriptions/resourcegroups' | project name, type  | limit 5 | union  (Resources | project name, type | limit 5)"

Dapatkan jaringan virtual dan subnet antarmuka jaringan

Gunakan ekspresi reguler parse untuk mendapatkan jaringan virtual dan nama subnet dari properti ID sumber daya. Meskipun parse memungkinkan untuk mendapatkan data dari bidang yang kompleks, hasilnya akan optimal untuk mengakses properti secara langsung jika ada alih-alih menggunakan parse.

Resources
| where type =~ 'microsoft.network/networkinterfaces'
| project id, ipConfigurations = properties.ipConfigurations
| mvexpand ipConfigurations
| project id, subnetId = tostring(ipConfigurations.properties.subnet.id)
| parse kind=regex subnetId with '/virtualNetworks/' virtualNetwork '/subnets/' subnet
| project id, virtualNetwork, subnet
az graph query -q "Resources | where type =~ 'microsoft.network/networkinterfaces' | project id, ipConfigurations = properties.ipConfigurations | mvexpand ipConfigurations | project id, subnetId = tostring(ipConfigurations.properties.subnet.id) | parse kind=regex subnetId with '/virtualNetworks/' virtualNetwork '/subnets/' subnet | project id, virtualNetwork, subnet"

Meringkas komputer virtual menurut properti diperluas status daya

Kueri ini menggunakan properti yang diperluas pada komputer virtual untuk diringkas berdasarkan status daya.

Resources
| where type == 'microsoft.compute/virtualmachines'
| summarize count() by tostring(properties.extended.instanceView.powerState.code)
az graph query -q "Resources | where type == 'microsoft.compute/virtualmachines' | summarize count() by tostring(properties.extended.instanceView.powerState.code)"

Langkah berikutnya