Примеры запросов к 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()

По умолчанию Azure CLI запрашивает все доступные подписки, но можно указать --subscriptions параметр для запроса определенных подписок.

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

В этом примере используется переменная для идентификатора подписки.

subid=$(az account show --query id --output tsv)
az graph query -q "Resources | summarize count()" --subscriptions $subid

Вы также можете запросить область для группы управления и клиента. Замените <managementGroupId> и <tenantId> собственными значениями.

az graph query -q "Resources | summarize count()" --management-groups '<managementGroupId>'
az graph query -q "Resources | summarize count()" --management-groups '<tenantId>'

Можно также использовать переменную для идентификатора клиента.

tenantid=$(az account show --query tenantId --output tsv)
az graph query -q "Resources | summarize count()" --management-groups $tenantid

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

Для подсчета количества возвращаемых записей в этом запросе используется 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 используется в хранилище слов.

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.ipAddress, чтобы вернуть только properties.ipAddressisnotempty, а также 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"

Перечисление оповещений Azure Monitor, упорядоченных по серьезности

Этот запрос использует таблицу для возврата оповещений alertsmanagementresources Azure Monitor, упорядоченных по серьезности.

alertsmanagementresources
| where type =~ 'microsoft.alertsmanagement/alerts'
| where todatetime(properties.essentials.startDateTime) >= ago(2h) and todatetime(properties.essentials.startDateTime) < now()
| project Severity = tostring(properties.essentials.severity)
| summarize AlertsCount = count() by Severity
az graph query -q "alertsmanagementresources | where type =~ 'microsoft.alertsmanagement/alerts' | where todatetime(properties.essentials.startDateTime) >= ago(2h) and todatetime(properties.essentials.startDateTime) < now() | project Severity = tostring(properties.essentials.severity) | summarize AlertsCount = count() by Severity"

Вывод списка оповещений Azure Monitor, упорядоченных по уровню серьезности и состоянию оповещения

Этот запрос использует таблицу для возврата оповещений alertsmanagementresources Azure Monitor, упорядоченных по уровню серьезности и состоянию оповещения.

alertsmanagementresources
| where type =~ 'microsoft.alertsmanagement/alerts'
| where todatetime(properties.essentials.startDateTime) >= ago(2h) and todatetime(properties.essentials.startDateTime) < now()
| project Severity = tostring(properties.essentials.severity), AlertState = tostring(properties.essentials.alertState)
| summarize AlertsCount = count() by Severity, AlertState
az graph query -q "alertsmanagementresources | where type =~ 'microsoft.alertsmanagement/alerts' | where todatetime(properties.essentials.startDateTime) >= ago(2h) and todatetime(properties.essentials.startDateTime) < now() | project Severity = tostring(properties.essentials.severity), AlertState = tostring(properties.essentials.alertState) | summarize AlertsCount = count() by Severity, AlertState"

Вывод списка оповещений Azure Monitor, упорядоченных по серьезности, мониторингу службы и типу целевого ресурса

Этот запрос использует таблицу для возврата оповещений alertsmanagementresources Azure Monitor, упорядоченных по серьезности, мониторингу службы и целевому типу ресурсов.

alertsmanagementresources
| where type =~ 'microsoft.alertsmanagement/alerts'
| where todatetime(properties.essentials.startDateTime) >= ago(2h) and todatetime(properties.essentials.startDateTime) < now()
| project Severity = tostring(properties.essentials.severity),
MonitorCondition = tostring(properties.essentials.monitorCondition),
ObjectState = tostring(properties.essentials.alertState),
MonitorService = tostring(properties.essentials.monitorService),
AlertRuleId = tostring(properties.essentials.alertRule),
SignalType = tostring(properties.essentials.signalType),
TargetResource = tostring(properties.essentials.targetResourceName),
TargetResourceType = tostring(properties.essentials.targetResourceName), id
| summarize AlertsCount = count() by Severity, MonitorService , TargetResourceType
az graph query -q "alertsmanagementresources | where type =~ 'microsoft.alertsmanagement/alerts' | where todatetime(properties.essentials.startDateTime) >= ago(2h) and todatetime(properties.essentials.startDateTime) < now() | project Severity = tostring(properties.essentials.severity), MonitorCondition = tostring(properties.essentials.monitorCondition), ObjectState = tostring(properties.essentials.alertState), MonitorService = tostring(properties.essentials.monitorService), AlertRuleId = tostring(properties.essentials.alertRule), SignalType = tostring(properties.essentials.signalType), TargetResource = tostring(properties.essentials.targetResourceName), TargetResourceType = tostring(properties.essentials.targetResourceName), id | summarize AlertsCount = count() by Severity, MonitorService , TargetResourceType"

Следующие шаги