Untersuchen Ihrer Azure-Ressourcen mit Resource Graph

Mit Azure Resource Graph können Sie Ihre Azure-Ressourcen schnell und bedarfsgerecht erkunden und ermitteln. Resource Graph wurde speziell für schnelle Reaktionen entwickelt und bietet eine gute Möglichkeit, eine Umgebung sowie die Eigenschaften kennenzulernen, die in Azure-Ressourcen enthalten sind.

Hinweis

Abhängig von der Resource Graph-Tabelle entsprechen Eigenschaften entweder der Groß- und Kleinschreibung, wie im Azure-Portal dargestellt, oder sie werden in Kleinbuchstaben geschrieben. Beispielsweise entspricht der Name einer Ressourcengruppe beim Abfragen der resourceContainers-Tabelle dem Portal, aber die Eigenschaft „resourceGroup“ der Ressourcen aus der resources-Tabelle wird klein geschrieben. Dies kann zu unerwarteten Ergebnissen führen. Sie können dies in Ihren Abfragen berücksichtigen, indem Sie Vergleichsoperatoren verwenden, die die Groß- und Kleinschreibung nicht berücksichtigen, z. B. =~ statt ==, und indem Eigenschaften in Joins mit der tolower()-Funktion in Kleinbuchstaben konvertiert werden.

Erkunden von virtuellen Computern

Ein virtueller Computer ist eine typische Ressource in Azure. Als Ressourcentyp verfügen virtuelle Computer über viele Eigenschaften, die abgefragt werden können. Anhand der einzelnen Eigenschaften kann nach der jeweils gewünschten Ressource gefiltert oder gesucht werden.

Ermittlung von virtuellen Computern

Wir beginnen zunächst mit einer einfachen Abfrage zum Abrufen eines einzelnen virtuellen Computers in unserer Umgebung und untersuchen anschließend die zurückgegebenen Eigenschaften.

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

Hinweis

Das Azure PowerShell-Cmdlet Search-AzGraph gibt standardmäßig PSResourceGraphResponse zurück. Damit die Ausgabe dem von der Azure-Befehlszeilenschnittstelle zurückgegebenen Ergebnis entspricht, wird das Cmdlet ConvertTo-Json für die Data-Eigenschaft verwendet. Der Standardwert für Depth ist 2. Bei einem Wert von 100 sollten alle zurückgegebenen Ebenen konvertiert werden.

Die JSON-Ergebnisse sind etwa wie im folgenden Beispiel strukturiert:

[
  {
    "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"
  }
]

Die Eigenschaften vermitteln uns zusätzliche Informationen über den virtuellen Computer selbst. Die Eigenschaften umfassen: Betriebssystem, Datenträger, Tags sowie die Ressourcengruppe und das Abonnement, denen der virtuelle Computer angehört.

Virtuelle Computer nach Standort

Ausgehend von dem, was wir über die VM-Ressource erfahren haben, zählen wir mit der location-Eigenschaft alle virtuellen Computer nach Standort. Wir aktualisieren die Abfrage, indem wir den Grenzwert entfernen und die Anzahl der Speicherortwerte summieren.

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

Die JSON-Ergebnisse sind etwa wie im folgenden Beispiel strukturiert:

[
  {
    "count_": 386,
    "location": "eastus"
  },
  {
    "count_": 215,
    "location": "southcentralus"
  },
  {
    "count_": 59,
    "location": "westus"
  }
]

Wir sehen nun, wie viele virtuelle Computer sich in den einzelnen Azure-Regionen befinden.

Virtuelle Computer nach SKU

Kehren wir zu den ursprünglichen Eigenschaften des virtuellen Computers zurück und suchen nun alle virtuellen Computer mit der SKU-Größe Standard_B2s. Der zurückgegebene JSON-Code zeigt den in properties.hardwareprofile.vmsize gespeicherten Wert. Also aktualisieren wir die Abfrage so, dass alle virtuellen Computer mit dieser Größe gesucht und nur die Namen der virtuellen Computer und die jeweiligen Regionen zurückgegeben werden.

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

Mit Managed Disks Premium vernetzte virtuelle Computer

Um die Details von verwalteten Premium-Datenträgern abzurufen, die diesen virtuellen Standard_B2s-Computern zugeordnet sind, erweitern wir die Abfrage, sodass die Ressourcen-IDs dieser verwalteten Datenträger zurückgegeben werden.

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

Das Ergebnis ist eine Liste mit Datenträger-IDs.

Ermittlung von verwalteten Datenträgern

Mit dem ersten Datensatz aus der vorherigen Abfrage untersuchen wir die Eigenschaften für den verwalteten Datenträger, der dem ersten virtuellen Computer zugeordnet wurde. Für die aktualisierte Abfrage wird die Datenträger-ID verwendet und der Typ geändert.

Beispielausgabe aus der vorherigen Abfrage:

[
  {
    "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'

Bevor Sie die Abfrage ausführen: Wie wussten wir, dass type jetzt Microsoft.Compute/disks sein sollte? Wenn Sie sich die vollständige ID ansehen, bemerken Sie /providers/Microsoft.Compute/disks/ als Teil der Zeichenfolge. Dieses Zeichenfolgenfragment ist ein Hinweis darauf, nach welchem Typ gesucht werden muss. Alternativ kann auch der Grenzwert nach Typ entfernt und stattdessen nur nach dem ID-Feld gesucht werden. Da die ID eindeutig ist, wird nur ein Datensatz zurückgegeben, und dessen type-Eigenschaft enthält diese Information.

Hinweis

Damit dieses Beispiel funktioniert, müssen Sie das ID-Feld durch ein Ergebnis aus Ihrer Umgebung ersetzen.

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

Die JSON-Ergebnisse sind etwa wie im folgenden Beispiel strukturiert:

[
  {
    "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"
  }
]

Erkunden von virtuellen Computern zum Suchen nach öffentlichen IP-Adressen

Mit dieser Gruppe von Abfragen werden zuerst alle NIC-Ressourcen (Netzwerkschnittstellenkarten) gefunden und gespeichert, die mit virtuellen Computern verbunden sind. Anschließend wird die Liste mit den Netzwerkschnittstellen von den Abfragen genutzt, um nach den einzelnen IP-Adressressourcen zu suchen, bei denen es sich um eine öffentliche IP-Adresse handelt. Diese Werte werden dann gespeichert. Abschließend wird von den Abfragen eine Liste mit den öffentlichen IP-Adressen bereitgestellt.

# 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

Verwenden Sie in der nächsten Abfrage die Datei (Azure CLI) oder die Variable (Azure PowerShell) zum Abrufen der Details der entsprechenden NIC-Ressourcen, denen eine öffentliche IP-Adresse zugeordnet ist.

# 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

Zum Schluss verwenden Sie die in der Datei (Azure CLI) oder der Variablen (Azure PowerShell) gespeicherte Liste der öffentlichen IP-Adressressourcen zum Abrufen der tatsächlichen öffentlichen IP-Adresse aus dem zugehörigen Objekt und zeigen diese an.

# 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

Im Beispiel Auflisten virtueller Computer mit deren Netzwerkschnittstelle und der öffentlichen IP-Adresse wird gezeigt, wie Sie diese Schritte in einer einzelnen Abfrage mit dem Operator join ausführen.

Nächste Schritte