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:
- Resourcetypen en API-versies weergeven
- Capaciteit en grootte van een virtuele-machineschaalset ophalen
- Kolommen verwijderen uit resultaten
- Een lijst weergeven van alle tagnamen
- Virtuele machines zoeken met reguliere expressies
- Azure Cosmos DB weergeven met specifieke schrijflocaties
- Sleutelkluizen met abonnementsnaam
- Een lijst met SQL-databases en elastische pools weergeven
- Een lijst met virtuele machines weergeven met bijbehorende netwerkinterfaces en openbare IP-adressen
- Alle extensies weergeven die zijn geïnstalleerd op een virtuele machine
- Opslagaccounts met een specifieke tag in de resourcegroep zoeken
- Resultaten van twee query's combineren tot één resultaat
- Virtuele netwerken en subnetten van netwerkinterfaces ophalen
- Virtuele machine samenvatten op basis van de uitgebreide eigenschap energiestatus
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
In de volgende query wordt leftouter join
gebruikt om SQL Database-resources en de bijbehorende elastische pools samen te voegen, indien die er zijn.
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
In deze query worden twee join
-opdrachten met leftouter gebruikt om een lijst weer te geven van virtuele machines die zijn gemaakt met het Resource Manager-implementatiemodel, de bijbehorende netwerkinterfaces en alle openbare IP-adressen die zijn gerelateerd aan deze 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
In de volgende query wordt een inner join
gebruikt om opslagaccounts te verbinden met resourcegroepen die een opgegeven hoofdlettergevoelige tagnaam en -waarde hebben.
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
- Bekijk voorbeelden uit Starter-query's.
- Meer informatie over de querytaal.
- Lees meer over het verkennen van resources.