Udostępnij za pośrednictwem


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 Data właściwości . Wartość domyślna parametru Depth 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/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"
  }
]

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 location właściwości , 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 Standard_B2sjednostki SKU . Zwrócony kod JSON pokazuje, że wartość jest przechowywana w pliku properties.hardwareprofile.vmsize. Aktualizujemy zapytanie, aby znaleźć wszystkie maszyny wirtualne zgodne z tym rozmiarem 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 Standard_B2s maszyn wirtualnych, 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 eksplorujesz 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_11111111111111111111111111111111"
  }
]
Resources
| where type =~ 'Microsoft.Compute/disks' and id == '/subscriptions/<subscriptionId>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/disks/ContosoVM1_OsDisk_1_11111111111111111111111111111111'

Zanim uruchomisz zapytanie, jak wiedzieliśmy, że type element powinien być Microsoft.Compute/disksteraz ? Jeśli spojrzysz na pełny identyfikator, zauważysz /providers/Microsoft.Compute/disks/ , że jest to 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 type właściwość 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_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

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

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

Eksplorowanie maszyn wirtualnych w celu znalezienia publicznych adresów IP

Ten zestaw zapytań najpierw znajduje i przechowuje wszystkie zasoby kart interfejsu sieciowego połączone 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

W następnym zapytaniu użyj pliku (interfejsu wiersza polecenia platformy Azure) lub zmiennej (Azure PowerShell), aby uzyskać szczegółowe informacje o powiązanych zasobach karty sieciowej, które mają 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 za pomocą operatora, przejdź do sekcji Wyświetlanie listy maszyn wirtualnych za pomocą interfejsu join 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.