Explorer vos ressources Azure avec Resource Graph
Azure Resource Graph vous permet d’explorer et de détecter vos ressources Azure rapidement et à l’échelle. Conçu pour fournir des réponses rapides, il s’avère très efficace pour en apprendre davantage sur votre environnement, mais aussi sur les propriétés présentes sur vos ressources Azure.
Notes
Selon le tableau Resource Graph, les propriétés respecteront la casse telle qu’elle apparaît dans le portail Azure ou seront en minuscules.
Par exemple, le nom d’un groupe de ressources lors de l’interrogation du tableau resourceContainers
correspondra au portail, mais la propriété resourceGroup
des ressources du tableau resources
sera en minuscules. Ceci peut engendrer des résultats inattendus et peut être pris en compte dans vos requêtes en utilisant des opérateurs de comparaison qui ne sont pas sensibles à la casse, tels que =~
au lieu de ==
, et en convertissant les propriétés en minuscules dans les jointures à l’aide de la fonction tolower()
.
Explorer des machines virtuelles
Dans Azure, les machines virtuelles sont des ressources courantes. En tant que type de ressource, les machines virtuelles comptent de nombreuses propriétés qui peuvent faire l’objet de requêtes. Chaque propriété propose une option pour filtrer ou trouver exactement la ressource que vous recherchez.
Détection des machines virtuelles
Commençons avec une requête simple qui vise à obtenir une seule machine virtuelle dans notre environnement et examinons les propriétés renvoyées.
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| limit 1
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | limit 1"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | limit 1").Data | ConvertTo-Json -Depth 100
Remarque
La cmdlet Azure PowerShell Search-AzGraph
renvoie un objet PSResourceGraphResponse
par défaut. Pour que la sortie soit identique à celle renvoyée par Azure CLI, la cmdlet ConvertTo-Json
est utilisée sur la propriété Data
. La valeur par défaut pour Depth
est 2. Définissez-le sur 100 pour convertir tous les niveaux renvoyés.
Les résultats JSON sont structurés de façon similaire à l’exemple suivant :
[
{
"id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/ContosoVM1",
"kind": "",
"location": "westus2",
"managedBy": "",
"name": "ContosoVM1",
"plan": {},
"properties": {
"hardwareProfile": {
"vmSize": "Standard_B2s"
},
"networkProfile": {
"networkInterfaces": [
{
"id": "/subscriptions/<subscriptionId>/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/contosovm2222",
"resourceGroup": "MyResourceGroup"
}
]
},
"osProfile": {
"adminUsername": "localAdmin",
"computerName": "ContosoVM1",
"secrets": [],
"windowsConfiguration": {
"enableAutomaticUpdates": true,
"provisionVMAgent": true
}
},
"provisioningState": "Succeeded",
"storageProfile": {
"dataDisks": [],
"imageReference": {
"offer": "WindowsServer",
"publisher": "MicrosoftWindowsServer",
"sku": "2016-Datacenter",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"diskSizeGB": 127,
"managedDisk": {
"id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111",
"resourceGroup": "MyResourceGroup",
"storageAccountType": "Premium_LRS"
},
"name": "ContosoVM1_OsDisk_1_11111111111111111111111111111111",
"osType": "Windows"
}
},
"vmId": "11111111-1111-1111-1111-111111111111"
},
"resourceGroup": "MyResourceGroup",
"sku": {},
"subscriptionId": "<subscriptionId>",
"tags": {},
"type": "microsoft.compute/virtualmachines"
}
]
Les propriétés donnent des informations supplémentaires sur la ressource de la machine virtuelle proprement dite : système d’exploitation, disques, balises, groupe de ressources et abonnement dont elle est membre, etc.
Machines virtuelles par emplacement
Sur la base de ce que nous avons appris sur la ressource de machine virtuelle, nous allons utiliser la propriété location
pour compter toutes les machines virtuelles par emplacement. Pour mettre à jour la requête, nous supprimons la limite et résumer le nombre de valeurs d’emplacement.
Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| summarize count() by location
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | summarize count() by location"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | summarize count() by location").Data | ConvertTo-Json
Les résultats JSON sont structurés de façon similaire à l’exemple suivant :
[
{
"count_": 386,
"location": "eastus"
},
{
"count_": 215,
"location": "southcentralus"
},
{
"count_": 59,
"location": "westus"
}
]
Nous pouvons maintenant voir combien de machines virtuelles nous avons dans chaque région Azure.
Machines virtuelles par référence (SKU)
Après avoir rétabli les propriétés de machine virtuelle d’origine, essayons de trouver toutes les machines virtuelles dont la taille SKU est Standard_B2s
. Le json retourné indique que la valeur est stockée dans properties.hardwareprofile.vmsize
. Nous mettons à jour la requête de façon à trouver toutes les machines virtuelles qui ont cette taille et pour que seuls le nom et la région des machines virtuelles soient retournés.
Resources
| where type =~ 'Microsoft.Compute/virtualMachines' and properties.hardwareProfile.vmSize == 'Standard_B2s'
| project name, resourceGroup
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' and properties.hardwareProfile.vmSize == 'Standard_B2s' | project name, resourceGroup"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualMachines' and properties.hardwareProfile.vmSize == 'Standard_B2s' | project name, resourceGroup").Data | ConvertTo-Json
Machines virtuelles connectées à des disques managés Premium
Pour obtenir les détails des disques managés Premium attachés à ces machines virtuelles Standard_B2s
, nous étendons la requête de façon à retourner l’ID de la ressource de ces disques managés.
Resources
| where type =~ 'Microsoft.Compute/virtualmachines' and properties.hardwareProfile.vmSize == 'Standard_B2s'
| extend disk = properties.storageProfile.osDisk.managedDisk
| where disk.storageAccountType == 'Premium_LRS'
| project disk.id
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualmachines' and properties.hardwareProfile.vmSize == 'Standard_B2s' | extend disk = properties.storageProfile.osDisk.managedDisk | where disk.storageAccountType == 'Premium_LRS' | project disk.id"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualmachines' and properties.hardwareProfile.vmSize == 'Standard_B2s' | extend disk = properties.storageProfile.osDisk.managedDisk | where disk.storageAccountType == 'Premium_LRS' | project disk.id").Data | ConvertTo-Json
Le résultat obtenu est une liste d’ID de disques.
Détection des disques managés
Avec le premier enregistrement de la requête précédente, nous explorons les propriétés qui existent sur le disque managé qui a été attaché à la première machine virtuelle. La requête mise à jour utilise l’ID de disque et modifie le type.
Exemple de sortie de la requête précédente, par exemple :
[
{
"disk_id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111"
}
]
Resources
| where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111'
Avant d’exécuter la requête, comment saviez-nous que le type
devrait maintenant être Microsoft.Compute/disks
? Si vous examinez l’ID complet, vous remarquez /providers/Microsoft.Compute/disks/
dans le cadre de la chaîne. Ce fragment de chaîne vous donne une indication du type à rechercher. Une autre méthode consiste à retirer la limite par type et à effectuer à la place une recherche sur le champ ID uniquement. Comme l’ID est unique, un seul enregistrement est retourné et la propriété type
de ce dernier fournit ce détail.
Remarque
Pour que cet exemple fonctionne, vous devez remplacer la valeur du champ ID par un résultat tiré de votre propre environnement.
az graph query -q "Resources | where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111'"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111'").Data | ConvertTo-Json
Les résultats JSON sont structurés de façon similaire à l’exemple suivant :
[
{
"id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111",
"kind": "",
"location": "westus2",
"managedBy": "",
"name": "ContosoVM1_OsDisk_1_11111111111111111111111111111111",
"plan": {},
"properties": {
"creationData": {
"createOption": "Empty"
},
"diskSizeGB": 127,
"diskState": "ActiveSAS",
"provisioningState": "Succeeded",
"timeCreated": "2018-09-14T12:17:32.2570000Z"
},
"resourceGroup": "MyResourceGroup",
"sku": {
"name": "Premium_LRS",
"tier": "Premium"
},
"subscriptionId": "<subscriptionId>",
"tags": {
"environment": "prod"
},
"type": "microsoft.compute/disks"
}
]
Explorer des machines virtuelles pour trouver des adresses IP publiques
Cet ensemble de requêtes recherche et stocke d’abord toutes les ressources de cartes réseaux (NIC) connectées à des machines virtuelles. Les requêtes utilisent ensuite la liste des cartes réseau pour trouver chaque ressource d’adresse IP qui correspond à une adresse IP publique et stocke ces valeurs. Puis, les requêtes fournissent la liste des adresses IP publiques.
# Use Resource Graph to get all NICs and store in the 'nics.txt' file
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project nic = tostring(properties['networkProfile']['networkInterfaces'][0]['id']) | where isnotempty(nic) | distinct nic | limit 20" --output table | tail -n +3 > nics.txt
# Review the output of the query stored in 'nics.txt'
cat nics.txt
# Use Resource Graph to get all NICs and store in the $nics variable
$nics = (Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project nic = tostring(properties['networkProfile']['networkInterfaces'][0]['id']) | where isnotempty(nic) | distinct nic | limit 20").Data
# Review the output of the query stored in the variable
$nics.nic
Dans la requête suivante, utilisez le fichier (Azure CLI) ou la variable (Azure PowerShell) pour obtenir les détails des ressources de la carte d’interface réseau qui ont une adresse IP publique attachée à la carte d’interface réseau.
# Use Resource Graph with the 'nics.txt' file to get all related public IP addresses and store in 'publicIp.txt' file
az graph query -q="Resources | where type =~ 'Microsoft.Network/networkInterfaces' | where id in ('$(awk -vORS="','" '{print $0}' nics.txt | sed 's/,$//')') | project publicIp = tostring(properties['ipConfigurations'][0]['properties']['publicIPAddress']['id']) | where isnotempty(publicIp) | distinct publicIp" --output table | tail -n +3 > ips.txt
# Review the output of the query stored in 'ips.txt'
cat ips.txt
# Use Resource Graph with the $nics variable to get all related public IP addresses and store in $ips variable
$ips = (Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Network/networkInterfaces' | where id in ('$($nics.nic -join "','")') | project publicIp = tostring(properties['ipConfigurations'][0]['properties']['publicIPAddress']['id']) | where isnotempty(publicIp) | distinct publicIp").Data
# Review the output of the query stored in the variable
$ips.publicIp
Enfin, nous allons utiliser la liste de ressources d’adresse IP publique stockée dans le fichier (Azure CLI) ou la variable (Azure PowerShell) pour obtenir et afficher leur adresse IP publique réelle à partir de l'objet associé.
# Use Resource Graph with the 'ips.txt' file to get the IP address of the public IP address resources
az graph query -q="Resources | where type =~ 'Microsoft.Network/publicIPAddresses' | where id in ('$(awk -vORS="','" '{print $0}' ips.txt | sed 's/,$//')') | project ip = tostring(properties['ipAddress']) | where isnotempty(ip) | distinct ip" --output table
# Use Resource Graph with the $ips variable to get the IP address of the public IP address resources
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Network/publicIPAddresses' | where id in ('$($ips.publicIp -join "','")') | project ip = tostring(properties['ipAddress']) | where isnotempty(ip) | distinct ip").Data | ConvertTo-Json
Pour savoir comment effectuer ces étapes au sein d’une même requête avec l’opérateur join
, accédez à l’exemple Lister les machines virtuelles avec leur interface réseau et leur adresse IP publique.
Étapes suivantes
- Découvrez plus en détails le langage de requête.
- Examinez le langage utilisé dans les requêtes de démarrage.
- Examinez les utilisations avancées dans les Requêtes avancées.