Zaawansowane przykłady zapytań usługi Resource Graph

Pierwszym krokiem do zrozumienia zapytań usługi Azure Resource Graph jest podstawowa wiedza na temat języka zapytań. Jeśli nie znasz jeszcze usługi Azure Data Explorer, zalecane jest zapoznanie się z podstawami, aby zrozumieć sposób tworzenia żądań dotyczących zasobów, których szukasz.

Omówimy następujące zaawansowane zapytania:

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Obsługa języków

Interfejs wiersza polecenia platformy Azure (za pośrednictwem rozszerzenia) i program Azure PowerShell (za pośrednictwem modułu) obsługują usługę Azure Resource Graph. Przed uruchomieniem dowolnego z poniższych zapytań sprawdź, czy Twoje środowisko jest gotowe. Zobacz Interfejs wiersza polecenia platformy Azure i Program Azure PowerShell, gdzie znajdziesz kroki instalacji i weryfikacji wybranego środowiska powłoki.

Pokaż typy zasobów i wersje interfejsu API

Usługa Resource Graph używa przede wszystkim najnowszej wersji interfejsu API dostawcy zasobów do GET właściwości zasobów podczas aktualizacji. W niektórych przypadkach używana wersja interfejsu API została zastąpiona w celu zapewnienia bardziej aktualnych lub powszechnie używanych właściwości w wynikach. Następujące zapytanie zawiera szczegółowe informacje o wersji interfejsu API używanej do zbierania właściwości dla każdego typu zasobu:

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"

Uzyskiwanie pojemności zestawu skalowania i rozmiaru maszyny wirtualnej

To zapytanie szuka zasobów zestawu skalowania maszyn wirtualnych i pobiera różne szczegółowe informacje, takie jak rozmiar maszyny wirtualnej i pojemność zestawu skalowania. To zapytanie używa funkcji toint(), aby rzutować pojemność na liczbę, co pozwala na sortowanie. Na koniec następuje zmiana nazw kolumn na właściwości o niestandardowej nazwie.

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"

Usuwanie kolumn z wyników

Poniższe zapytanie używa summarize metody do zliczenia zasobów według subskrypcji, join aby połączyć je ze szczegółami subskrypcji z tabeli ResourceContainers , a następnie project-away usunąć niektóre kolumny.

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"

Wyświetlanie listy wszystkich nazw tagów

To zapytanie rozpoczyna się od tagu i tworzy obiekt JSON zawierający listę wszystkich unikatowych nazw tagów i odpowiadających im typów.

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

Wyświetlanie maszyn wirtualnych dopasowanych przez wyrażenie regularne

To zapytanie szuka maszyn wirtualnych, które odpowiadają wyrażeniu regularnemu (nazywanemu regex). Polecenie matches regex @ pozwala na określenie wyrażenia regularnego do dopasowania, czyli ^Contoso(.*)[0-9]+$. Definicja tego wyrażenia regularnego jest wyjaśniona jako:

  • ^ - Dopasowanie musi zaczynać się od początku ciągu.
  • Contoso - Ciąg z uwzględnieniem wielkości liter.
  • (.*) - Dopasowanie podwyrażu:
    • . - Dopasowuje dowolny pojedynczy znak (z wyjątkiem nowego wiersza).
    • * - Dopasowuje poprzedni element zero lub więcej razy.
  • [0-9] - Dopasowanie grupy znaków dla cyfry od 0 do 9.
  • + - Dopasowuje poprzedni element co najmniej raz.
  • $ - Dopasowanie poprzedniego elementu musi wystąpić na końcu ciągu.

Po dopasowaniu według nazwy zapytanie rzutuje nazwę i porządkuje rosnąco według nazwy.

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"

Wyświetlanie listy usługi Azure Cosmos DB z określonymi lokalizacjami zapisu

Następujące limity zapytań do zasobów usługi Azure Cosmos DB są używane mv-expand do rozszerzania torby właściwości dla właściwości properties.writeLocations, a następnie projektują określone pola i ograniczają wyniki dalej do wartości properties.writeLocations.locationName pasujących do wartości "Wschodnie stany USA" lub "Zachodnie stany USA".

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"

Magazyny kluczy o nazwie subskrypcji

Poniższe zapytanie przedstawia złożone użycie typu join z typemleftouter. Zapytanie ogranicza tabelę przyłączoną do zasobów subskrypcji i zawiera project tylko oryginalne pole subscriptionId inazwę pola zmieniono na SubName. Zmiana nazwy pola pozwala uniknąć join dodawania go jako nazwy1 , ponieważ pole już istnieje w zasobach. Oryginalna tabela jest filtrowana za pomocą where elementu , a poniżej project znajdują się kolumny z obu tabel. Wynik zapytania to wszystkie magazyny kluczy, które wyświetlają typ, nazwę magazynu kluczy i nazwę subskrypcji, w którym się znajduje.

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"

Wyświetlanie listy baz danych SQL i ich elastycznych pul

Poniższe zapytanie używa funkcji leftouterjoin do łączenia zasobów usługi SQL Database i powiązanych pul elastycznych, jeśli istnieją.

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"

Wyświetlanie listy maszyn wirtualnych przy użyciu interfejsu sieciowego i publicznego adresu IP

To zapytanie używa dwóch poleceń po lewej stroniejoin do łączenia maszyn wirtualnych utworzonych za pomocą modelu wdrażania usługi Resource Manager, powiązanych interfejsów sieciowych i dowolnego publicznego adresu IP powiązanego z tymi interfejsami sieciowymi.

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"

Wyświetlanie listy wszystkich rozszerzeń zainstalowanych na maszynie wirtualnej

Najpierw to zapytanie używa extend typu zasobu maszyn wirtualnych, aby uzyskać identyfikator w wielkiej literze (toupper()) identyfikator, uzyskać nazwę i typ systemu operacyjnego oraz uzyskać rozmiar maszyny wirtualnej. Uzyskanie identyfikatora zasobu w wielkim przypadku jest dobrym sposobem przygotowania do dołączenia do innej właściwości. Następnie zapytanie używa join typu z typemleftouter , aby uzyskać rozszerzenia maszyny wirtualnej, pasując do górnego litery substring identyfikatora rozszerzenia. Część identyfikatora przed wartością "/extensions/<ExtensionName>" jest taka sama jak identyfikator maszyn wirtualnych, dlatego używamy tej właściwości dla joinelementu . summarize Parametr jest następnie używany make_list z nazwą rozszerzenia maszyny wirtualnej, aby połączyć nazwę każdego rozszerzenia, w którym id, OSName, OSType i VMSize są takie same w jednej właściwości tablicy. Na koniec order by mamy dolną literę OSName z asc. Domyślnie order by jest malejąco.

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"

Znajdowanie kont magazynu z określonym tagiem w grupie zasobów

Poniższe zapytanie używa wewnętrznego join konta magazynu z grupami zasobów, które mają określoną nazwę tagu z uwzględnieniem wielkości liter i wartość tagu.

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"

Jeśli konieczne jest wyszukanie nazwy tagu bez uwzględniania wielkości liter i wartości tagu, użyj parametru mv-expandbagexpansion . To zapytanie używa większego limitu przydziału niż poprzednie zapytanie, więc użyj mv-expand tylko w razie potrzeby.

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"

Łączenie wyników z dwóch zapytań w jeden wynik

Poniższe zapytanie używa union metody do pobierania wyników z tabeli ResourceContainers i dodawania ich do wyników z tabeli 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)"

Pobieranie sieci wirtualnych i podsieci interfejsów sieciowych

Użyj wyrażenia parse regularnego, aby uzyskać nazwy sieci wirtualnej i podsieci z właściwości identyfikatora zasobu. Chociaż parse umożliwia pobieranie danych ze złożonego pola, optymalne jest uzyskiwanie dostępu do właściwości bezpośrednio, jeśli istnieją zamiast używać polecenia 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"

Podsumowywanie maszyny wirtualnej według właściwości rozszerzonej stanów zasilania

To zapytanie używa właściwości rozszerzonych na maszynach wirtualnych do podsumowania według stanów zasilania.

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

Następne kroki

  • Zobacz przykłady zapytań startowych.
  • Dowiedz się więcej o języku zapytań.
  • Dowiedz się więcej o sposobie eksplorowania zasobów.