Geavanceerde queryvoorbeelden van Resource Graph

Om inzicht te krijgen in query's met Azure Resource Graph moet u eerst enige basiskennis hebben van de querytaal. Als u nog geen ervaring hebt met Azure Data Explorer, is het raadzaam om eerst de basisbeginselen door te nemen, zodat u weet hoe u aanvragen opstelt voor de resources die u zoekt.

We nemen de volgende geavanceerde query's door:

Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

Taalondersteuning

Azure CLI (met een extensie) en Azure PowerShell (met een module) ondersteunen Azure Resource Graph. Controleer voordat u een van de volgende query's uitvoert, of uw omgeving gereed is. Zie Azure CLI en Azure PowerShell voor stappen voor het installeren en valideren van uw gewenste shellomgeving.

Resourcetypen en API-versies weergeven

Resource Graph maakt voornamelijk gebruik van de meest recente niet-preview-versie van een Resource Provider-API voor GET resource-eigenschappen tijdens een update. In sommige gevallen is de gebruikte API-versie onderdrukt om meer actuele of veelgebruikte eigenschappen te kunnen bieden in de resultaten. In de volgende query worden details opgevraagd van de API-versie die wordt gebruikt voor het verzamelen van eigenschappen voor elk resourcetype:

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"

Capaciteit en grootte van een virtuele-machineschaalset ophalen

Met deze query zoekt u virtuele-machineschaalsetresources en verkrijgt u diverse informatie, waaronder de grootte van de virtuele machines en de capaciteit van de schaalset. Deze query maakt gebruik van de functie toint() om de capaciteit te converteren naar een waarde die kan worden gesorteerd. Ten slotte worden de namen van de kolommen gewijzigd in eigenschappen met aangepaste namen.

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"

Kolommen verwijderen uit resultaten

De volgende query maakt gebruik van summarize om resources te tellen per abonnement, join om het resultaat te combineren met abonnementsgegevens uit de tabel ResourceContainers en ten slotte project-away om een aantal van de kolommen te verwijderen.

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"

Een lijst weergeven van alle tagnamen

Deze query start met de tag en bouwt een JSON-object dat alle unieke tagnamen en hun overeenkomende typen vermeldt.

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

Virtuele machines zoeken met reguliere expressies

Deze query zoekt virtuele machines die overeenkomen met een reguliere expressie (ook wel regex genoemd). Met de reguliere overeenkomstexpressie @ kunt u de betreffende reguliere expressie definiëren. Deze is ^Contoso(.*)[0-9]+$. De definitie van deze reguliere expressie wordt als volgt uitgelegd:

  • ^: Overeenkomst moet beginnen aan het begin van de tekenreeks.
  • Contoso: De hoofdlettergevoelige reeks.
  • (.*) - Een subexpressieovereenkomst:
    • .: Komt overeen met een willekeurig teken (met uitzondering van een nieuwe regel).
    • *: Komt nul keer of vaker overeen met vorig element.
  • [0-9]: Tekengroepovereenkomst met de cijfers 0 t/m 9.
  • +: Komt één keer of vaker overeen met vorig element.
  • $: Overeenkomst met het vorige element moet voorkomen aan het einde van de tekenreeks.

Na de vergelijking op naam worden de namen in oplopende volgorde weergegeven.

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"

Azure Cosmos DB weergeven met specifieke schrijflocaties

De volgende querylimieten voor Azure Cosmos DB-resources worden gebruikt mv-expand om de eigenschappenverzameling voor properties.writeLocations uit te breiden, vervolgens projectspecifieke velden te projecteren en de resultaten verder te beperken tot properties.writeLocations.locationName-waarden die overeenkomen met 'VS - oost' of 'VS - west'.

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"

Sleutelkluizen met abonnementsnaam

De volgende query toont een complex gebruik van join met kind als leftouter. Met de query wordt de gekoppelde tabel beperkt tot abonnementsresources, en met project wordt alleen het oorspronkelijke veld subscriptionId opgenomen en het veld name met de naam gewijzigd in SubName. Door de wijziging van de veldnaam wordt voorkomen dat join dit toevoegt als name1 omdat het veld al bestaat in resources. De oorspronkelijke tabel wordt gefilterd met where en het volgende project bevat kolommen uit beide tabellen. Het queryresultaat bestaat uit alle sleutelkluizen, met het type kluis en de naam van de sleutelkluis, en de naam van het abonnement waarin de kluis zich bevindt.

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"

Een lijst met SQL-databases en elastische pools weergeven

De volgende query maakt gebruik van leftouterjoin om SQL Database-resources en de bijbehorende elastische pools samen te brengen, indien aanwezig.

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"

Een lijst met virtuele machines weergeven met bijbehorende netwerkinterfaces en openbare IP-adressen

Deze query maakt gebruik van twee leftouter-opdrachtenjoin om virtuele machines samen te voegen die zijn gemaakt met het Resource Manager-implementatiemodel, de bijbehorende netwerkinterfaces en elk openbaar IP-adres dat is gerelateerd aan die netwerkinterfaces.

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"

Alle extensies weergeven die zijn geïnstalleerd op een virtuele machine

Ten eerste gebruikt deze query extend op het resourcetype virtuele machines om de id in hoofdletters (toupper()) de id op te halen, de naam en het type van het besturingssysteem op te halen en de grootte van de virtuele machine op te halen. Het ophalen van de resource-id in hoofdletters is een goede manier om een andere eigenschap toe te voegen. Vervolgens gebruikt de query join met soort als leftouter om de extensies van de virtuele machine op te halen door te voldoen aan een substring van de extensie-id met hoofdletters. Het gedeelte van de id vóór '/extensions/<ExtensionName>' is dezelfde indeling als de id van de virtuele machines, dus we gebruiken deze eigenschap voor de join. summarize wordt vervolgens gebruikt met make_list op de naam van de extensie van de virtuele machine om de naam van elke extensie te combineren, waarbij id, OSName, OSType en VMSize hetzelfde zijn in een enkele matrixeigenschap. Ten slotte order by we de OSName met kleine letters met asc. order by is standaard aflopend.

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"

Opslagaccounts met een specifieke tag in de resourcegroep zoeken

De volgende query maakt gebruik van een innerjoin om opslagaccounts te verbinden met resourcegroepen met een opgegeven hoofdlettergevoelige tagnaam en tagwaarde.

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"

Als het nodig is om een tagnaam en -waarde te zoeken die niet hoofdlettergevoelig zijn, gebruikt u mv-expand met de parameter bagexpansion. Deze query gebruikt meer quota dan de vorige query, dus gebruik mv-expand alleen als dat echt nodig is.

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"

Resultaten van twee query's combineren tot één resultaat

De volgende query gebruikt union om resultaten op te halen uit de tabel ResourceContainers en deze toe te voegen aan de resultaten uit de tabel Resources.

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

Virtuele netwerken en subnetten van netwerkinterfaces ophalen

Gebruik een reguliere expressie parse om de namen van het virtuele netwerk en subnet op te halen uit de eigenschap resource-id. Hoewel parse het mogelijk is om gegevens op te halen uit een complex veld, is het optimaal om rechtstreeks toegang te krijgen tot eigenschappen als ze bestaan in plaats van te gebruiken 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"

Virtuele machine samenvatten op basis van de uitgebreide eigenschap voor energiestatussen

Deze query maakt gebruik van de uitgebreide eigenschappen op virtuele machines om deze op energiestatus samen te vatten.

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

Volgende stappen