Badanie zasobów platformy Azure przy użyciu usługi Resources Graph

Usługa Azure Resource Graph ułatwia szybkie eksplorowanie i odnajdywanie zasobów platformy Azure na dużą skalę. Zaprojektowana pod kątem szybkich odpowiedzi to doskonały sposób, aby dowiedzieć się więcej o środowisku, a także o właściwościach istniejących w zasobach platformy Azure.

Uwaga

W zależności od tabeli Resource Graph właściwości będą zgodne z wielkością liter, jak pokazano w witrynie Azure Portal lub są małe. Na przykład nazwa grupy zasobów podczas wykonywania zapytania resourceContainers do tabeli będzie zgodna z portalem, ale resourceGroup właściwość zasobów z resources tabeli będzie mała. Może to spowodować nieoczekiwane wyniki i można je uwzględnić w zapytaniach przy użyciu operatorów porównania bez uwzględniania wielkości liter, takich jak =~ zamiast == i konwertowania właściwości na małe litery w sprzężeniach z funkcją tolower() .

Eksplorowanie maszyn wirtualnych

Typowym zasobem na platformie Azure jest maszyna wirtualna. Jako typ zasobu maszyny wirtualne mają wiele właściwości, których można wykonywać zapytania. Każda właściwość udostępnia opcję filtrowania lub znajdowania dokładnie szukanego zasobu.

Odnajdywanie maszyn wirtualnych

Zacznijmy od prostego zapytania, aby uzyskać jedną maszynę wirtualną z naszego środowiska i przyjrzeć się zwróconym właściwościom.

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

Uwaga

Polecenie cmdlet programu Azure PowerShell Search-AzGraph domyślnie zwraca wartość PSResourceGraphResponse . Aby dane wyjściowe wyglądały tak samo jak dane wyjściowe zwracane przez interfejs wiersza polecenia platformy Azure, ConvertTo-Json polecenie cmdlet jest używane we właściwości Data . Wartość domyślna dla wartości Głębokość to 2. Ustawienie wartości 100 powinno przekonwertować wszystkie zwrócone poziomy.

Wyniki JSON mają strukturę podobną do poniższego przykładu:

[
  {
    "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/contosovm1535",
            "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_9676b7e1b3c44e2cb672338ebe6f5166",
            "resourceGroup": "MyResourceGroup",
            "storageAccountType": "Premium_LRS"
          },
          "name": "ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166",
          "osType": "Windows"
        }
      },
      "vmId": "bbb9b451-6dc7-4117-bec5-c971eb1118c6"
    },
    "resourceGroup": "MyResourceGroup",
    "sku": {},
    "subscriptionId": "<subscriptionId>",
    "tags": {},
    "type": "microsoft.compute/virtualmachines"
  }
]

Właściwości informują nas o dodatkowych informacjach o zasobie maszyny wirtualnej. Te właściwości obejmują: system operacyjny, dyski, tagi oraz grupę zasobów i subskrypcję, do których należy.

Maszyny wirtualne według lokalizacji

Biorąc pod uwagę zdobytą wiedzę na temat zasobu maszyn wirtualnych, użyjmy właściwości location , aby zliczyć wszystkie maszyny wirtualne według lokalizacji. Aby zaktualizować zapytanie, usuwamy limit i podsumujemy liczbę wartości lokalizacji.

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

Wyniki JSON mają strukturę podobną do poniższego przykładu:

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

Teraz możemy zobaczyć, ile maszyn wirtualnych mamy w każdym regionie świadczenia usługi Azure.

Maszyny wirtualne według jednostki SKU

Wróćmy do oryginalnych właściwości maszyny wirtualnej, spróbujmy znaleźć wszystkie maszyny wirtualne, które mają rozmiar jednostki SKU Standard_B2s. Zwrócony kod JSON pokazuje, że jest on przechowywany w pliku properties.hardwareprofile.vmsize. Zaktualizujemy zapytanie, aby znaleźć wszystkie maszyny wirtualne pasujące do tego rozmiaru i zwrócić tylko nazwę maszyny wirtualnej i regionu.

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

Maszyny wirtualne połączone z dyskami zarządzanymi w warstwie Premium

Aby uzyskać szczegółowe informacje o dyskach zarządzanych w warstwie Premium dołączonych do tych maszyn wirtualnych Standard_B2s , rozszerzamy zapytanie, aby zwrócić identyfikator zasobu tych dysków zarządzanych.

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

Wynikiem jest lista identyfikatorów dysków.

Odnajdywanie dysków zarządzanych

Przy pierwszym rekordzie z poprzedniego zapytania zbadamy właściwości istniejące na dysku zarządzanym dołączonym do pierwszej maszyny wirtualnej. Zaktualizowane zapytanie używa identyfikatora dysku i zmienia typ.

Przykładowe dane wyjściowe z poprzedniego zapytania, na przykład:

[
  {
    "disk_id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166"
  }
]
Resources
| where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166'

Zanim uruchomisz zapytanie, jak wiedzieliśmy , że typ powinien teraz mieć wartość Microsoft.Compute/disks? Jeśli spojrzysz na pełny identyfikator, zobaczysz ciąg /providers/Microsoft.Compute/disks/ jako część ciągu. Ten fragment ciągu zawiera wskazówkę dotyczącą typu do wyszukania. Alternatywną metodą jest usunięcie limitu według typu, a zamiast tego wyszukiwanie tylko według pola identyfikatora. Ponieważ identyfikator jest unikatowy, zwracany jest tylko jeden rekord, a właściwość type na nim dostarcza te szczegóły.

Uwaga

W tym przykładzie należy zastąpić pole ID wynikiem własnego środowiska.

az graph query -q "Resources | where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166'"
(Search-AzGraph -Query "Resources | where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166'").Data | ConvertTo-Json

Wyniki JSON mają strukturę podobną do poniższego przykładu:

[
  {
    "id": "/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166",
    "kind": "",
    "location": "westus2",
    "managedBy": "",
    "name": "ContosoVM1_OsDisk_1_9676b7e1b3c44e2cb672338ebe6f5166",
    "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"
  }
]

Eksplorowanie maszyn wirtualnych w celu znalezienia publicznych adresów IP

Ten zestaw zapytań najpierw znajduje i przechowuje wszystkie zasoby interfejsów sieciowych połączonych z maszynami wirtualnymi. Następnie zapytania używają listy kart sieciowych, aby znaleźć każdy zasób adresu IP, który jest publicznym adresem IP i przechowywać te wartości. Na koniec zapytania zawierają listę publicznych adresów IP.

# 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

Użyj pliku (interfejsu wiersza polecenia platformy Azure) lub zmiennej (Azure PowerShell) w następnym zapytaniu, aby uzyskać szczegółowe informacje o powiązanych zasobach interfejsu sieciowego, w których znajduje się publiczny adres IP dołączony do karty sieciowej.

# 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

Na koniec użyj listy zasobów publicznego adresu IP przechowywanych w pliku (interfejs wiersza polecenia platformy Azure) lub zmiennej (Azure PowerShell), aby uzyskać rzeczywisty publiczny adres IP z powiązanego obiektu i wyświetlić.

# 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

Aby zobaczyć, jak wykonać te kroki w jednym zapytaniu z operatorem join , zobacz Wyświetlanie listy maszyn wirtualnych przy użyciu interfejsu sieciowego i publicznego adresu IP przykładu.

Następne kroki

  • Dowiedz się więcej o języku zapytań.
  • Zobacz język używany w zapytaniach startowych.
  • Zobacz zaawansowane zastosowania w zapytaniach zaawansowanych.