Exemples de requêtes Resource Graph avancées

Pour comprendre comment fonctionnent les requêtes dans Azure Resource Graph, vous devez au préalable vous familiariser avec le langage de requête. Si vous ne connaissez pas bien l’Explorateur de données Azure, nous vous recommandons de passer en revue les notions de base de ce langage pour apprendre à composer des requêtes pour les ressources qui vous intéressent.

Nous allons vous guider tout au long des requêtes avancées suivantes :

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Support multilingue

Azure CLI (par le biais d’une extension) et Azure PowerShell (par le biais d’un module) prennent en charge Azure Resource Graph. Avant d’exécuter les requêtes suivantes, vérifiez que votre environnement est prêt. Consultez Azure CLI et Azure PowerShell pour savoir comment installer et valider l’environnement de votre interpréteur de commandes.

Afficher les types de ressources et les versions d’API

Resource Graph utilise principalement la version autre que la préversion la plus récente de l’API d’un fournisseur de ressources pour GET les propriétés des ressources pendant une mise à jour. Dans certains cas, la version d’API utilisée a été remplacée pour fournir des propriétés plus courantes ou largement employées dans les résultats. La requête suivante détaille la version d’API utilisée pour collecter des propriétés sur chaque type de ressource :

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"

Obtenir une capacité et une taille de groupe de machines virtuelles identiques

Cette requête recherche des ressources de groupe de machines virtuelles identiques et obtient divers détails, notamment la taille de machine virtuelle et la capacité du groupe identique. Cette requête utilise la fonction toint() pour effectuer un cast de la capacité sur un nombre afin de pouvoir la trier. Enfin, les colonnes sont renommées dans les propriétés nommées personnalisées.

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"

Supprimer des colonnes des résultats

La requête suivante utilise summarize pour compter les ressources par abonnement, join pour les associer aux détails de l’abonnement à partir de la table ResourceContainers, puis project-away pour supprimer certaines des colonnes.

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"

Lister tous les noms d’étiquette

Cette requête commence par l’étiquette et génère un objet JSON listant tous les noms d’étiquette uniques et leurs types correspondants.

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

Machines virtuelles mises en correspondance par expression régulière

Cette requête recherche les machines virtuelles qui correspondent à une expression régulière (connue sous le nom regex). La valeur correspond à regex @ nous permet de définir l’expression régulière de correspondance, c’est-à-dire ^Contoso(.*)[0-9]+$. Cette définition d’expression régulière est expliquée comme suit :

  • ^ : doit correspondance au début au commencement de la chaîne.
  • Contoso : chaîne sensible à la casse.
  • (.*) : correspondance de sous-expression :
    • . : correspond à n'importe quel caractère unique (sauf une nouvelle ligne).
    • * : correspond à l’élément précédent zéro fois ou plusieurs fois.
  • [0-9] : correspondance de groupe de caractères pour les nombres de 0 à 9.
  • + : correspond à l’élément précédent une fois ou plusieurs fois.
  • $ : la correspondance avec l’élément précédent doit se produire à la fin de la chaîne.

Après la mise en correspondance par nom, la requête projette le nom et effectue le tri par nom croissant.

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"

Lister Azure Cosmos DB avec des emplacements d’écriture spécifiques

La requête suivante se limite aux ressources Azure Cosmos DB, utilise mv-expand afin de développer le jeu de propriétés pour properties.writeLocations, puis projeter des champs spécifiques et limiter les résultats aux valeurs properties.writeLocations.locationName correspondant à « East US » ou « West US ».

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"

Coffre de clés avec nom d’abonnement

La requête suivante illustre une utilisation complexe de join avec le leftouterkind. La requête limite la table jointe aux ressources d’abonnement et utilise project pour inclure uniquement le champ d’origine subscriptionId et le champ name renommé SubName. Le renommage de champ évite que join ne l’ajoute en tant que name1, puisque le champ existe déjà dans resources. La table d’origine est filtrée avec where et le project suivant comprend des colonnes des deux tables. Résultat de la requête : tous les coffres de clés affichent le type, le nom du coffre de clés et le nom de l’abonnement dans lequel il se trouve.

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"

Lister les bases de données SQL et leurs pools élastiques

La requête suivante utilise leftouterjoin pour réunir des ressources SQL Database et leurs pools élastiques associés, le cas échéant.

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"

Lister les machines virtuelles avec leur interface réseau et leur adresse IP publique

Cette requête utilise deux commandes leftouterjoin pour réunir des machines virtuelles créées avec le modèle de déploiement Resource Manager, leurs interfaces réseau associées et toute adresse IP publique associée à ces interfaces réseau.

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"

Lister toutes les extensions installées sur une machine virtuelle

Tout d’abord, cette requête utilise extend sur le type de ressource des machines virtuelles pour obtenir l’ID en majuscules (toupper()), obtenir le nom et le type du système d’exploitation, et obtenir la taille des machines virtuelles. L’obtention de l’ID de ressource en majuscules est un bon moyen de préparer la jointure à une autre propriété. Ensuite, la requête utilise join avec kind comme leftouter pour obtenir les extensions de machine virtuelle en faisant correspondre une substring en majuscules de l’ID d’extension. La partie de l’ID avant « /extensions/<ExtensionName> » est du même format que l’ID des machines virtuelles. Nous utilisons donc cette propriété pour join. summarize est ensuite utilisé avec make_list sur le nom de l’extension de machine virtuelle pour combiner le nom de chaque extension où id, OSName, OSType et VMSize sont les mêmes dans une propriété de tableau unique. Enfin, nous ordonnons (order by) le nom OSName en minuscules avec asc. Par défaut, order by est décroissant.

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"

Rechercher les comptes de stockage avec une étiquette spécifique sur le groupe de ressources

La requête suivante utilise innerjoin pour connecter des comptes de stockage à des groupes de ressources ayant un nom et une valeur d’étiquette spécifiques qui respectent la casse.

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"

S’il est nécessaire de rechercher un nom et une valeur d’étiquette qui ne respectent pas la casse, utilisez mv-expand avec le paramètre bagexpansion. Dans la mesure où cette requête utilise plus de quota que la requête précédente, utilisez mv-expand uniquement en cas de nécessité.

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"

Combiner les résultats de deux requêtes en un résultat unique

La requête suivante utilise union pour obtenir les résultats de la table ResourceContainers et les ajouter aux résultats de la table 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)"

Récupérer les réseaux virtuels et les sous-réseaux des interfaces réseau

Utilisez une expression régulière parse pour obtenir les noms des réseaux virtuels et des sous-réseaux à partir de la propriété ID de ressource. Bien que parse permette d’obtenir des données à partir d’un champ complexe, il est préférable d’accéder directement aux propriétés si elles existent, au lieu d’utiliser 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"

Synthétiser la machine virtuelle par la propriété étendue des états d’alimentation

Cette requête utilise les propriétés étendues sur les machines virtuelles pour synthéthiser par états d’alimentation.

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

Étapes suivantes