Примеры запросов к Resource Graph для начинающих
Первым шагом на пути к пониманию запросов к Azure Resource Graph является общее понимание языка запросов. Если вы еще не знакомы с языком запросов Kusto (KQL), советуем просмотреть учебник по KQL, чтобы понять, как составлять запросы к ресурсам, которые вы ищете.
В этой статье используются следующие начальные запросы:
- Подсчет ресурсов Azure
- Подсчет ресурсов хранилища ключей
- Вывод списка ресурсов, отсортированных по имени
- Отображение всех виртуальных машин, упорядоченных по имени в порядке убывания
- Отображение первых пяти виртуальных машин по имени и типу ОС
- Подсчет виртуальных машин по типу ОС
- Отображение ресурсов, которые содержат хранилище
- Список всех подсетей виртуальной сети Azure
- Вывод списка общедоступных IP-адресов
- Подсчет ресурсов с IP-адресами, настроенными посредством подписки
- Вывод списка ресурсов с определенным значением тега
- Вывод списка всех учетных записей хранения с определенным значением тега
- Вывод всех тегов и их значений
- Отображение несвязанных групп безопасности сети
- Перечисление оповещений Azure Monitor, упорядоченных по серьезности
- Вывод списка оповещений Azure Monitor, упорядоченных по уровню серьезности и состоянию оповещения
- Вывод списка оповещений Azure Monitor, упорядоченных по серьезности, мониторингу службы и типу целевого ресурса
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Azure CLI (с помощью расширения) и Azure PowerShell (с помощью модуля) поддерживают Azure Resource Graph. Перед выполнением любого из следующих запросов убедитесь, что среда готова. В разделах об Azure CLI и Azure PowerShell приведены инструкции по установке и проверке выбранной вами среды оболочки.
Этот запрос возвращает количество ресурсов 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, включая имена подсетей и префиксы адресов. Благодарим Саула Долгина за вклад.
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"
Аналогично предыдущему примеру этот запрос ищет все ресурсы, тип которых содержит слово 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"
Используя предыдущий пример запроса и добавив 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"
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
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
| 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
- Узнайте больше о языке запросов.
- Узнайте больше о том, как изучать ресурсы.
- Ознакомьтесь с примерами усложненных запросов.