Erweiterte Beispiele für Resource Graph-Abfragen

Der erste Schritt zum Verstehen von Abfragen mit Azure Resource Graph sind Grundkenntnisse der Abfragesprache. Wenn Sie nicht bereits mit Azure Data Explorer vertraut sind, sollten Sie sich über die Grundlagen informieren, um zu verstehen, wie Sie Anforderungen für die gesuchten Ressourcen zusammenstellen müssen.

Wir behandeln die folgenden erweiterten Abfragen:

Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Sprachunterstützung

Azure CLI (über eine Erweiterung) und Azure PowerShell (über ein Modul) unterstützen Azure Resource Graph. Überprüfen Sie vor dem Ausführen der folgenden Abfragen, ob Ihre Umgebung bereit ist. Unter Azure CLI und Azure PowerShell werden die Schritte zum Installieren und Überprüfen der Shellumgebung Ihrer Wahl beschrieben.

Anzeigen von Ressourcentypen und API-Versionen

Resource Graph verwendet hauptsächlich die neueste Version (keine Vorschauversion) einer Ressourcenanbieter-API, um mittels GET Ressourceneigenschaften während einer Aktualisierung abzurufen. In einigen Fällen wurde die verwendete API-Version überschrieben, um in den Ergebnissen neuere oder gängigere Eigenschaften bereitzustellen. In der folgenden Abfrage wird die API-Version veranschaulicht, die zum Sammeln von Eigenschaften für die einzelnen Ressourcentypen verwendet wird:

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"

Abrufen der Kapazität und Größe von VM-Skalierungsgruppen

Diese Abfrage sucht nach Ressourcen für VM-Skalierungsgruppen und ruft verschiedene Details (einschließlich der Größe des virtuellen Computers und der Kapazität der Skalierungsgruppe) ab. Mit dieser Abfrage wandelt die toint()-Funktion die Kapazität in eine Zahl um, damit sie sortiert werden kann. Schließlich werden die Spalten in benutzerdefinierte benannte Eigenschaften umbenannt.

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"

Entfernen von Spalten aus den Ergebnissen

Die folgende Abfrage verwendet summarize, um Ressourcen nach Abonnement zu zählen, join, um sie mit Abonnementdetails aus der Tabelle ResourceContainers zu vereinen, und anschließend project-away, um einige der Spalten zu entfernen.

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"

Auflisten aller Tagnamen

Diese Abfrage beginnt mit dem Tag und erstellt ein JSON-Objekt, das alle eindeutigen Tagnamen und ihre entsprechenden Typen auflistet.

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

Einem regulären Ausdruck entsprechende virtuelle Computer

Diese Abfrage sucht nach virtuellen Computern, die einem regulären Ausdruck (als RegEx bekannt) entsprechen. Mit matches regex @ wird der reguläre Ausdruck für den Abgleich definiert: ^Contoso(.*)[0-9]+$. Diese RegEx-Definition wird wie folgt erläutert:

  • ^ – Die Übereinstimmung muss am Anfang der Zeichenfolge beginnen.
  • Contoso – Zeichenfolge mit Beachtung von Groß-/Kleinschreibung
  • (.*) – Eine Übereinstimmung mit einem Teilausdruck:
    • . – stimmt mit einem beliebigen einzelnen Zeichen (außer eines Zeilenumbruchs) überein.
    • * – stimmt mit dem vorhergehenden Element null Mal oder mehrfach überein.
  • [0-9] – Übereinstimmung von Zeichengruppe für die Ziffern 0 bis 9.
  • + – stimmt mit dem vorhergehenden Element ein Mal oder mehrfach überein.
  • $ – Übereinstimmung des vorhergehenden Elements muss am Ende der Zeichenfolge auftreten.

Nach dem Namensabgleich stellt die Abfrage den Namen dar und sortiert aufsteigend nach Name.

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"

Auflisten von Azure Cosmos DB mit bestimmten Schreibinstanzen

Die folgende Abfrage schränkt die Azure Cosmos DB-Ressourcen ein und verwendet mv-expand, um den Eigenschaftenbehälter für properties.writeLocations zu erweitern. Anschließend werden bestimmte Felder projiziert und die Ergebnisse weiter auf properties.writeLocations.locationName-Werte für „USA, Osten“ oder „USA, Westen“ eingeschränkt.

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"

Schlüsseltresore mit Abonnementname

Die folgende Abfrage zeigt eine komplexe Verwendung von join mit kind als leftouter. Die Abfrage schränkt die verknüpfte Tabelle auf Abonnementressourcen ein, und mit project wird nur das ursprüngliche Feld subscriptionId einbezogen, und das Feld name wird in SubName umbenannt. Beim Umbenennen des Felds wird das Hinzufügen von join als name1 vermieden, da das Feld bereits unter resources vorhanden ist. Die ursprüngliche Tabelle wird mit where gefiltert, und das folgende project-Element enthält Spalten aus beiden Tabellen. Das Abfrageergebnis enthält alle Schlüsseltresore mit Typ, Name des Schlüsseltresors und Name des Abonnements, in dem er sich befindet.

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"

Auflisten von SQL-Datenbanken und deren Pools für elastische Datenbanken

Die folgende Abfrage verwendet leftouterjoin, um SQL-Datenbank-Ressourcen und ggf. die zugehörigen Pools für elastische Datenbanken zusammenzuführen.

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"

Auflisten virtueller Computer mit deren Netzwerkschnittstelle und der öffentlichen IP-Adresse

Diese Abfrage verwendet zwei leftouterjoin-Befehle, um mit dem Resource Manager-Bereitstellungsmodell erstellte virtuelle Maschinen, ihre zugehörigen Netzwerkschnittstellen und alle öffentlichen IP-Adressen zusammenzuführen, die sich auf diese Netzwerkschnittstellen beziehen.

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"

Auflisten aller Erweiterungen, die auf einem virtuellen Computer installiert sind

Zuerst wird bei dieser Abfrage extend für den VM-Ressourcentyp verwendet, um die ID in Großbuchstaben (toupper()) und dann den Namen und Typ des Betriebssystems sowie die VM-Größe abzurufen. Das Abrufen der Ressourcen-ID in Großbuchstaben ist eine gute Möglichkeit, um das Einbinden in eine andere Eigenschaft vorzubereiten. Anschließend wird für die Abfrage join mit kind als leftouter-Element verwendet, um VM-Erweiterungen abzurufen. Hierfür wird ein Abgleich mit dem substring-Element der Erweiterungs-ID in Großbuchstaben durchgeführt. Da der Teil der ID vor „/extensions/<ExtensionName>“ das gleiche Format wie die VM-ID hat, verwenden wir diese Eigenschaft für den join-Vorgang. summarize wird dann mit make_list im Namen der VM-Erweiterung verwendet, um die Namen der einzelnen Erweiterungen zu kombinieren. Hierbei sind id, OSName, OSType und VMSize für jede Arrayeigenschaft jeweils identisch. Abschließend führen wir order by für das OSName-Element in Kleinbuchstaben mit asc durch. Standardmäßig wird für order by „descending“ (absteigend) und nicht „ascending“ (aufsteigend) verwendet.

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"

Suchen von Speicherkonten mit einem bestimmten Tag in der Ressourcengruppe

In der folgenden Abfrage wird innerjoin zum Verbinden von Speicherkonten mit Ressourcengruppen verwendet, die über einen Tagnamen und einen Tagwert verfügen, bei denen die Groß-/Kleinschreibung berücksichtigt wird.

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"

Wenn nach einem Tagnamen und einem Tagwert gesucht werden muss, bei denen die Groß-/Kleinschreibung berücksichtigt wird, verwenden Sie mv-expand mit dem Parameter bagexpansion. Bei dieser Abfrage wird ein höheres Kontingent als in der vorherigen Abfrage verwendet. Verwenden Sie mv-expand also nur, wenn dies unbedingt erforderlich ist.

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"

Vereinen von Ergebnissen aus zwei Abfragen in einem einzigen Ergebnis

Die folgende Abfrage verwendet union, um Ergebnisse aus der Tabelle ResourceContainers abzurufen und sie den Ergebnissen aus der Tabelle Resources hinzuzufügen.

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)"

Abrufen von virtuellen Netzwerken und Subnetzen von Netzwerkschnittstellen

Verwenden Sie einen regulären parse-Ausdruck, um die Namen des virtuellen Netzwerks und des Subnetzes aus der Ressourcen-ID-Eigenschaft zu erhalten. Während parse das Abrufen von Daten aus einem komplexen Feld ermöglicht, ist es besser, direkt auf die vorhandenen Eigenschaften zuzugreifen, anstatt parse zu verwenden.

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"

Zusammenfassen virtueller Computer anhand der erweiterten Eigenschaft für Energiezustände

Diese Abfrage verwendet die erweiterten Eigenschaften auf virtuellen Computern, um sie nach Energiezuständen zusammenzufassen.

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)"

Nächste Schritte