Примеры запросов к Resource Graph для начинающих

Первым шагом на пути к пониманию запросов к Azure Resource Graph является общее понимание языка запросов. Если вы еще не знакомы с языком запросов Kusto (KQL), советуем просмотреть учебник по KQL, чтобы понять, как составлять запросы к ресурсам, которые вы ищете.

Мы рассмотрим следующие запросы для начинающих:

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.

Поддержка языков

Azure CLI (с помощью расширения) и Azure PowerShell (с помощью модуля) поддерживают Azure Resource Graph. Перед выполнением любого из следующих запросов убедитесь, что среда готова. В разделах об Azure CLI и Azure PowerShell приведены инструкции по установке и проверке выбранной вами среды оболочки.

Подсчет ресурсов Azure

Этот запрос возвращает количество ресурсов Azure в доступных вам подписках. Этот запрос также удобно использовать, чтобы проверить, установлены ли в выбранной оболочке соответствующие компоненты Azure Resource Graph и работают ли они.

Resources
| summarize count()
az graph query -q "Resources | summarize count()"

Подсчет ресурсов хранилища ключей

Для подсчета количества возвращаемых записей в этом запросе используется count вместо summarize. В подсчет включаются только хранилища ключей.

Resources
| where type =~ 'microsoft.keyvault/vaults'
| count
az graph query -q "Resources | where type =~ 'microsoft.keyvault/vaults' | count"

Вывод списка ресурсов, отсортированных по имени

Этот запрос возвращает любой тип ресурса, но только свойства name, type и location. Он использует выражение order by, чтобы сортировать свойства по свойству name в порядке возрастания (asc).

Resources
| project name, type, location
| order by name asc
az graph query -q "Resources | project name, type, location | order by name asc"

Отображение всех виртуальных машин, упорядоченных по имени в порядке убывания

Чтобы вывести только список виртуальных машин (относящихся к типу Microsoft.Compute/virtualMachines), в результатах можно применить сопоставление по свойству type. Аналогично предыдущему запросу, desc изменяет order by для сортировки по убыванию. =~ в сопоставлении типа указывает Resource Graph не учитывать регистр.

Resources
| project name, location, type
| where type =~ 'Microsoft.Compute/virtualMachines'
| order by name desc
az graph query -q "Resources | project name, location, type| where type =~ 'Microsoft.Compute/virtualMachines' | order by name desc"

Отображение первых пяти виртуальных машин по имени и типу ОС

Этот запрос будет использовать top для извлечения только пяти соответствующих записей, упорядоченных по имени. Типом ресурса Azure является Microsoft.Compute/virtualMachines. project указывает Azure Resource Graph, какие свойства следует включить.

Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| project name, properties.storageProfile.osDisk.osType
| top 5 by name desc
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project name, properties.storageProfile.osDisk.osType | top 5 by name desc"

Подсчет виртуальных машин по типу ОС

Основываясь на предыдущем запросе, мы по-прежнему ограничиваем результаты типом ресурса Azure Microsoft.Compute/virtualMachines, но больше не ограничиваем количество возвращаемых записей. Вместо этого мы использовали summarize и count(), чтобы определить способ группирования и объединения значений по свойству (properties.storageProfile.osDisk.osType в этом примере). Чтобы получить представление о том, как эта строка выглядит в полном объекте, ознакомьтесь с просмотром ресурсов и обнаружением виртуальных машин.

Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| summarize count() by tostring(properties.storageProfile.osDisk.osType)
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | summarize count() by tostring(properties.storageProfile.osDisk.osType)"

Этот запрос можно составить по-другому. Можно extend свойство и присвоить ему временное имя для использования в запросе, в этом случае — os. os будет использоваться в summarize и count(), как показано в предыдущем примере.

Resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| extend os = properties.storageProfile.osDisk.osType
| summarize count() by tostring(os)
az graph query -q "Resources | where type =~ 'Microsoft.Compute/virtualMachines' | extend os = properties.storageProfile.osDisk.osType | summarize count() by tostring(os)"

Примечание

Имейте в виду, что, хотя =~ позволяет сопоставление без учета регистра, использование свойств (таких как properties.storageProfile.osDisk.osType) в запросе требует соблюдения регистра. Если свойство указано в неправильном регистре, возвращается значение NULL или неверное значение. Группирование или сведение данных будет выполняться неправильно.

Отображение ресурсов, которые содержат хранилище

Вместо явного сопоставления определенного типа этот пример запроса будет искать все ресурсы Azure, содержащие (contains) слово storage.

Resources
| where type contains 'storage' | distinct type
az graph query -q "Resources | where type contains 'storage' | distinct type"

Вывод списка всех подсетей виртуальной сети Azure

Этот запрос возвращает список виртуальных сетей Azure, включая имена подсетей и префиксы адресов. Благодарим Саула Долгина за вклад.

Resources
| where type == 'microsoft.network/virtualnetworks'
| extend subnets = properties.subnets
| mv-expand subnets
| project name, subnets.name, subnets.properties.addressPrefix, location, resourceGroup, subscriptionId
az graph query -q "Resources | where type == 'microsoft.network/virtualnetworks' | extend subnets = properties.subnets | mv-expand subnets | project name, subnets.name, subnets.properties.addressPrefix, location, resourceGroup, subscriptionId"

Вывод списка общедоступных IP-адресов

Аналогично предыдущему примеру этот запрос ищет все ресурсы, тип которых содержит слово publicIPAddresses. Этот запрос расширяет данный шаблон, чтобы можно было включить в результаты только ресурсы с properties.ipAddressisnotempty, возвращать только properties.ipAddress и limit только 100 лучших результатов. В зависимости от выбранной оболочки может потребоваться выйти за пределы цитат.

Resources
| where type contains 'publicIPAddresses' and isnotempty(properties.ipAddress)
| project properties.ipAddress
| limit 100
az graph query -q "Resources | where type contains 'publicIPAddresses' and isnotempty(properties.ipAddress) | project properties.ipAddress | limit 100"

Подсчет ресурсов с IP-адресами, настроенными посредством подписки

Используя предыдущий пример запроса и добавив summarize и count(), мы можем получить список ресурсов с настроенными IP-адресами для подписки.

Resources
| where type contains 'publicIPAddresses' and isnotempty(properties.ipAddress)
| summarize count () by subscriptionId
az graph query -q "Resources | where type contains 'publicIPAddresses' and isnotempty(properties.ipAddress) | summarize count () by subscriptionId"

Вывод списка ресурсов с определенным значением тега

Мы можем ограничить результаты не только по типу ресурса Azure, а, например, по тегу. В этом примере мы применяем фильтр для получения ресурсов Azure с тегом Environment со значением Internal.

Resources
| where tags.environment=~'internal'
| project name
az graph query -q "Resources | where tags.environment=~'internal' | project name"

Чтобы указать теги ресурсов и их значения, добавьте свойство tags для ключевого слова project.

Resources
| where tags.environment=~'internal'
| project name, tags
az graph query -q "Resources | where tags.environment=~'internal' | project name, tags"

Вывод списка всех учетных записей хранения с определенным значением тега

Объедините функции фильтра в предыдущем примере и фильтрацию по типу ресурса Azure с помощью свойства type. Этот запрос также ограничивает поиск определенных типов ресурсов Azure за счет использования конкретного имени и значения тега.

Resources
| where type =~ 'Microsoft.Storage/storageAccounts'
| where tags['tag with a space']=='Custom value'
az graph query -q "Resources | where type =~ 'Microsoft.Storage/storageAccounts' | where tags['tag with a space']=='Custom value'"

Примечание

В этом примере для сопоставления используется условный оператор == вместо =~. При использовании == учитывается регистр.

Вывод всех тегов и их значений

В этом запросе приведены теги для групп управления, подписок и ресурсов, а также их значения. Сначала запрос ограничивается ресурсами с тегами isnotempty(), затем ограничивается включаемыми полями, в том числе тегами в project, а затем — mvexpand и extend для получения связанных данных из контейнера свойств. Затем он использует union для объединения результатов из контейнеров ресурсов, чтобы получить результаты из ресурсов, предоставляя полные сведения о том, какие теги получены. Наконец, он ограничивается результатами для сопоставленных данных distinct и исключает скрытые системой теги.

ResourceContainers
| where isnotempty(tags)
| project tags
| mvexpand tags
| extend tagKey = tostring(bag_keys(tags)[0])
| extend tagValue = tostring(tags[tagKey])
| union (
    resources
    | where isnotempty(tags)
    | project tags
    | mvexpand tags
    | extend tagKey = tostring(bag_keys(tags)[0])
    | extend tagValue = tostring(tags[tagKey])
)
| distinct tagKey, tagValue
| where tagKey !startswith "hidden-"
az graph query -q "ResourceContainers | where isnotempty(tags) | project tags | mvexpand tags | extend tagKey = tostring(bag_keys(tags)[0]) | extend tagValue = tostring(tags[tagKey]) | union (resources | where notempty(tags) | project tags | mvexpand tags | extend tagKey = tostring(bag_keys(tags)[0]) | extend tagValue = tostring(tags[tagKey]) ) | distinct tagKey, tagValue | where tagKey !startswith "hidden-""

Отображение несвязанных групп безопасности сети

Этот запрос возвращает группы безопасности сети (NSG), которые не связаны с сетевым интерфейсом или подсетью.

Resources
| where type =~ "microsoft.network/networksecuritygroups" and isnull(properties.networkInterfaces) and isnull(properties.subnets)
| project name, resourceGroup
| sort by name asc
az graph query -q "Resources | where type =~ 'microsoft.network/networksecuritygroups' and isnull(properties.networkInterfaces) and isnull(properties.subnets) | project name, resourceGroup | sort by name asc"

Дальнейшие действия