Как стать автором
Обновить
446.63
FirstVDS
Виртуальные серверы в ДЦ в Москве и Амстердаме

Оптимизируем запросы ресурсов Azure с помощью Resource Graph и PowerShell

Время на прочтение6 мин
Количество просмотров1.5K
Автор оригинала: Baki Onur Okutucu

Можете представить, сколько времени уйдёт на генерацию списка VM среди сотен подписок Azure? Целая вечность. Известно, что портал Azure выводит только первые 1000 подписок, что усложняет запрос ресурсов с его помощью, когда подписок у вас намного больше. К счастью, есть способ делать это гораздо быстрее и динамичнее. В этой статье мы разберём функционал Azure Resource Graph и используем эту службу с помощью PowerShell, существенно повысив гибкость управления запросами.

Содержание статьи:

— Resource Graph и Kusto Query Language
— Модуль Resource Graph для PowerShell
— Ограничения
— Полезные виды запросов
— Форматирование результатов
— Заключение

Resource Graph и Kusto Query Language


Azure Resource Graph — это сервис, который позволяет более точно запрашивать ресурсы среди множества подписок, используя таблицы Resource Graph.

Kusto Query Language (KQL) — это язык запросов, с помощью которого Resource Graph возвращает запрашиваемые данные. KQL поддерживает много операторов, включая join и union, которые позволяют устанавливать межтабличные связи для возвращения более подробных результатов сразу по нескольким таблицам.


Прим. переводчика:

Чуть подробнее о Kusto. Это специальный процесс, язык, который позволяет получить ридонли результаты из ваших источников данных. Вся система очень похожа на SQL.
Сам запрос состоит из последовательности инструкций, разделяемых точкой с запятой. Точно как мы с вами привыкли видеть в практически любой оболочке БД. Последняя инструкция должна возвращать то, что мы называем Tabular Expression Statement. Первая инструкция обычно получает данные из какого-либо источника, последующие операторы преобразуют данные, а последний оператор рендерит эти данные.

Данные передаются от инструкции к инструкции через конвейер |. Обычный запрос в Kusto выглядит примерно так (пример из docs.microsoft.com):

StormEvents 
| where StartTime >= datetime(2007-11-01) and StartTime < datetime(2007-12-01)
| where State == "FLORIDA"  
| count

Любому хабрачеловеку тут всё будет понятно.

Запросы Resource Graph можно выполнять на портале Azure. Но мы-то с вами продвинутые пользователи, поэтому использовать будем PowerShell. Да, конечно, у нас есть Resource Graph Explorer, предлагающий UI, где можно найти доступные для использования в запросах таблицы Resource Graph. Запросы также можно сохранять для последующего использования. Но после написания пары десятков этих запросов вы уже будете знать все таблицы наизусть и сможете строчить их напрямую.


Запросы в Azure Portal можно делать с помощью проводника Resource Graph

В примере выше перечислены все ресурсы с их базовыми подробностями, такими как ID, name, subscriptionID, resourceGroup и далее.

Модуль Resource Graph для PowerShell


Модуль Az.ResourceGraph можно использовать в PowerShell для запроса ресурсов Azure по всему клиенту или среди набора подписок. Так выглядит простой запрос, который можно выполнить через PowerShell:

$KustoQuery = "
resources
| where name starts with 'Network'
"
$result = Search-AzGraph -Query $KustoQuery
$result | select name

Простой запрос Kusto для вывода списка всех ресурсов:

PS C: $KustoQuery = "
>> resources
>> | where name starts with 'Network'
>> "
$result = Search-AzGraph -Query $KustoQuery
$result | select name

name
- - - -
NetworkWatcher_cenralus
NetworkWatcher_norteurope
NetworkWatcher_westeurope
NetworkWatcher_westus
NetworkWatcher_eastus
NetworkWatcher_japanwest
NetworkWatcher_norteurope
NetworkWatcher_uksouth
NetworkWatcher_westeurope
NetworkWatcher_eastus
NetworkWatcher_norteurope

PS C:\>

Этот запрос выведет список всех ресурсов с именами, начинающимися с Network.

Прим. переводчика:
Для удобной работы с PowerShell очень рекомендуется установить oh-my-posh и использовать Windows Terminal. oh-my-posh добавляет большое количество функций к Powershell, которых так не хватает пользователям командной строки в Linux. В частности, reverse-i-search.


Ограничения


Имейте в виду, что PowerShell может запрашивать через Resource Graph только первые 1000 подписок. Если же у вас их больше, то потребуется разбить их на отдельные пакеты.

С одной стороны, это очень странное ограничение. Любой, кто работал с базами данных, тут может удивиться. Но если подумать, то оно кажется достаточно разумным. Мы же не с базой данных работаем, а запрашиваем объекты из AD. Если их наплодится больше 1000, то возможно, вам стоит подумать о том, как их структурировать в более приличном виде.

Ещё одним ограничением является вывод в ответ на запрос максимум 1000 результатов. Чтобы его обойти, можно проигнорировать определённое их число с помощью параметра Skip. В примере ниже первая команда выдаёт первые пять результатов, а вторая игнорирует эти первые результаты и выводит остальные. Так что можно просто динамически устанавливать параметры first и Skip, чтобы возвращать все результаты, не ограничиваясь 1000.

Всем, кто сталкивается с подобными ограничениями, рекомендуется обратиться к этому документу. Там вам более подробно изложат варианты работы.

$result = Search-AzGraph -Query $KustoQuery -first 5
$result | select name
$result = Search-AzGraph -Query $KustoQuery -Skip 5
$result | select name


Параметры first и Skip помогают, когда нужно вывести более 1000 ресурсов

Полезные виды запросов


Вот несколько примеров запросов, которые можно совершать с помощью Resource Graph.

Вывод ресурсов по типу


Запрос для вывода определённого типа ресурсов:

$KustoQuery = "
Resources
| where type == 'microsoft.storage/storageaccounts'
"
$result = Search-AzGraph -Query $KustoQuery
$result | select name


Вывод ресурсов учётной записи хранения

Вывод виртуальных машин Windows


Запрос для вывода только VM с Windows:

$KustoQuery = "
Resources
| where type == 'microsoft.compute/virtualmachines'
| where properties.storageProfile.osDisk.osType == 'Windows'
"
$result = Search-AzGraph -Query $KustoQuery
$result | select name, @{l="OsType";e={$_.properties.storageProfile.osDisk.osType}}


Вывод VM с Windows

Вывод всех публичных IP


В сценарии ниже мы выводим все публичные адреса IP вместе с идентификаторами их ресурсов, но в качестве имени для идентификаторов будет отображаться SampleColumnToRepresentResourceId.


Вывод публичных адресов IP с кастомным именем для ResourceId

Вывод групп ресурсов с конкретным тегом


Следующий запрос выведет только группы ресурсов с заданным тегом:

$KustoQuery = "
resourcecontainers
| where type == 'microsoft.resources/subscriptions/resourcegroups'
| where tags['Importance'] == 'High'
"
$result = Search-AzGraph -Query $KustoQuery
$result | select name


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

Подсчёт ресурсов в определённом регионе


Следующий запрос позволит получить количество ресурсов в North Europe, сгруппированных по их subscriptionId:

$KustoQuery = "
resources
| where location == 'northeurope'
| summarize total=count () by subscriptionId
"
$result = Search-AzGraph -Query $KustoQuery
$result | select total, subscriptionId, @{l="location";e={"North Europe"}}


Подсчёт ресурсов в регионе North Europe

Вывод запущенных VM


Для вывода только запущенных VM используем такой запрос:

$KustoQuery = "
resources
| where type == 'microsoft.compute/virtualmachines'
| where properties.extended.instanceView.powerState.displayStatus == 'VM running'
| project name, location, resourceGroup
"
$result = Search-AzGraph -Query $KustoQuery
$result


Запрос для получения запущенных VM

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


VM, не соответствующие текущим политикам, выводятся так:

$KustoQuery = "
policyresources
| where type == 'microsoft.policyinsights/policystates'
| where properties.complianceState == 'NonCompliant'
| where properties.resourceType =~ 'microsoft.compute/virtualmachines'
| project resourceGroup, id=properties.resourceId, ComplianceStatus = properties.complianceState
"
$result = Search-AzGraph -Query $KustoQuery
$result | fl *


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


Прим. переводчика:

Форматирование результатов


Конечно, не стоит забывать про то, что PowerShell имеет большое количество различных способов форматирования конечных результатов. В данном случае запросы в Kusto можно форматировать с помощью параметра в вызове метода. Существуют два способа форматирования конечных данных: Таблица и Массив Объектов.

Более того, эти данные отлично обрабатываются встроенной функцией ConvertTo-Json.

Вот пример возвращаемой таблицы данных, созданной с помощью параметра resultFormat=Table, пропущенных через ConvertTo-JSON:

{
    "totalRecords": 47,
    "count": 1,
    "data": {
        "columns": [{
                "name": "name",
                "type": "string"
            },
            {
                "name": "type",
                "type": "string"
            },
            {
                "name": "location",
                "type": "string"
            },
            {
                "name": "subscriptionId",
                "type": "string"
            }
        ],
        "rows": [
            [
                "veryscaryvm2-nsg",
                "microsoft.network/networksecuritygroups",
                "eastus",
                "11111111-1111-1111-1111-111111111111"
            ]
        ]
    },
    "facets": [],
    "resultTruncated": "true"
} 

Подобные данные очень просто обрабатывать в любых других программах. Подробности о том, как правильно отформатировать ваши данные, описаны здесь.


Заключение


Resource Graph является очень удобным и быстрым решением для выполнения запросов в Azure, который позволяет в развёрнутом виде запрашивать ресурсы среди огромного числа подписок. При этом язык KQL существенно упрощает получение данных с помощью PowerShell и Resource Graph.

Каждый уважающий себя системный администратор всегда держит под рукой репозиторий с набором скриптов, упрощающих жизнь. KQL позволяет быстро писать простейшие утилиты, позволяющие анализировать данные в Azure. Более того, уже готовые данные, собранные в виде JSON, достаточно просто отправлять в различные no-SQL базы данных для их последующего анализа. В этом случае KQL может упростить жизнь любителям ELK, Graylog и тому подобных систем сбора информации.


НЛО прилетело и оставило здесь промокод для читателей нашего блога:

Теги:
Хабы:
Всего голосов 10: ↑10 и ↓0+10
Комментарии0

Публикации

Информация

Сайт
firstvds.ru
Дата регистрации
Дата основания
Численность
51–100 человек
Местоположение
Россия
Представитель
FirstJohn