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:
- Pokaż wersję interfejsu API dla każdego typu zasobu
- Uzyskiwanie pojemności i rozmiaru zestawu skalowania maszyn wirtualnych
- Usuwanie kolumn z wyników
- Wyświetlanie listy wszystkich nazw tagów
- Wyświetlanie maszyn wirtualnych dopasowanych przez wyrażenie regularne
- Wyświetlanie listy usługi Azure Cosmos DB z określonymi lokalizacjami zapisu
- Magazyny kluczy o nazwie subskrypcji
- Wyświetlanie listy baz danych SQL i ich elastycznych pul
- Wyświetlanie listy maszyn wirtualnych przy użyciu interfejsu sieciowego i publicznego adresu IP
- Wyświetlanie listy wszystkich rozszerzeń zainstalowanych na maszynie wirtualnej
- Znajdowanie kont magazynu z określonym tagiem w grupie zasobów
- Łączenie wyników z dwóch zapytań w jeden wynik
- Pobieranie sieci wirtualnych i podsieci interfejsów sieciowych
- Podsumowywanie maszyny wirtualnej według właściwości rozszerzonej stanów zasilania
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ż wersję interfejsu API dla każdego typu zasobu
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 typem leftouter. Zapytanie ogranicza tabelę przyłączoną do zasobów subskrypcji i zawiera project
tylko oryginalne pole subscriptionId i nazwę 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 leftouter join
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 stronie join
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 typem leftouter , 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 join
elementu . 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-expand
bagexpansion . 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.