Создание подробного отчета об использовании Azure с помощью PowerShell

Один из самых важных аспектов работы с нагрузками в Azure – это контроль расходов. Это можно сделать, отслеживая использование ресурсов с помощью подробного отчета об использовании Azure. В этой статье вы узнаете, как создать сценарий PowerShell для удобного запроса использования ресурсов Azure и расходов по всем вашим ресурсам Azure по дате.

Ресурсы в Azure постоянно увеличивают ваш счет разными способами. Хотя вы можете видеть использование ресурсов через веб-портал, это ограничено. Но с помощью нескольких командлетов PowerShell вы можете создать удобный отчет, который даст вам общую картину того, какое использование (и, следовательно, расходы) у ваших ресурсов Azure.

Эта статья была создана на основе видео на YouTube от TechSnips. Если вы предпочитаете более визуальный подход, посмотрите видео. В противном случае продолжайте чтение!

Загрузка отчетов через центр учетной записи Azure

Вы можете загрузить множество различных отчетов об использовании из Центра учетной записи Azure. Центр учетной записи Azure – это веб-портал, который позволяет просматривать историю цикла оплаты, загружать счета и видеть обзор вашей подписки Azure.

Хотя вы можете загрузить отчеты об использовании Azure через Центр учетной записи Azure, нет возможности выбрать диапазон дат. Вы не можете ограничить использование в заданном диапазоне дат, потому что даты фиксированы и совпадают с вашим циклом оплаты.

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

Azure Account Center usage reports

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

Возможно, вам нужны отчеты об использовании за последние 60 дней. Чтобы получить эту информацию с помощью Центра учетной записи Azure, вам придется загрузить отчеты об использовании хотя бы за три цикла оплаты, чтобы охватить все необходимые даты.

После загрузки отчетов вам придется удалить лишние данные. Затем вам нужно будет найти способ объединить эти данные как-то. Нет, спасибо! Это слишком много накладных расходов.

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

Предварительные требования

Это статья-инструкция. Чтобы следовать инструкциям, вам потребуется выполнить несколько предварительных действий.

Как получить данные об использовании ресурсов

Перед созданием скрипта давайте сначала обсудим основы, используя Get-UsageAggregates cmdlet. Это командлет, который позволяет извлекать использование ресурсов Azure по диапазону дат, метрикам, таким как почасовое или ежедневное, и многому другому. Командлет Get-UsageAggregates является основным командлетом, который выполняет основную часть магии, которую вы будете изучать в этой статье.

Чтобы продемонстрировать командлет Get-UsageAggregates, предположим, что вам нужно найти использование ресурсов Azure с 1 апреля 2019 года по 12 сентября 2019 года. Ту же самую технику можно использовать для любого диапазона дат. Ниже вы увидите фрагмент кода для поиска данных использования на основе этих дат.

$params = @{
    ReportedStartTime = '04-01-19'
    ReportedEndTime = '09-12-19'
    AggregationGranularity = 'Hourly'
    ShowDetails = $true
}
$usageData = Get-UsageAggregates @params
Parameter Value Usage Explanation
ReportStartTime 04-01-19 This is the oldest date you want to retrieve.

(Месяц День Год)

ReportEndTime 09-12-19 This is the latest date you want to retrieve.

(Месяц День Год)

AggregationGranularity Hourly The granularity of data to return. Valid values are “Daily” and “Hourly”
ShowDetails $True Indicates whether the instance-level details are expanded

Если данные возвращаются, вы должны получить результаты, аналогичные этому скриншоту ниже. Вы можете увидеть, что фактические данные использования хранятся в свойстве UsageAggregations.

Raw UsageAggregations output properties

Работа с разбиением на страницы в Get-UsageAggregates

В вышеприведенном разделе необходимо учитывать, что команда может вернуть много тысяч объектов, особенно для длинных диапазонов дат. Чтобы не перегрузить API, команда Get-UsageAggregates возвращает только максимум 1000 результатов. Если вы сохранили переменную $usageData, как описано в предыдущем разделе, вы можете подтвердить это, выполнив следующую команду $usageData.UsageAggregations.count.

Что, если результатов больше 1000? Вам придется выполнить немного больше работы.

При анализе возвращаемых свойств Get-UsageAggregates вы заметите свойство с именем ContinuationToken как показано ниже. Вы можете видеть, что этот токен представляет собой длинную строку символов.

Usage aggregates continuation token

ContinuationToken является указателем на следующий набор результатов. Это свойство действует как закладка, чтобы знать, с какой страницы получить следующую партию результатов.

Для демонстрации получите последний элемент в предыдущем результате, используя $usageData.UsageAggregations[-1], как показано ниже. Обратите внимание на времена Usage Start и Usage End.

First usage object

Теперь передайте те же параметры команде Get-UsageAggregates еще раз. Но на этот раз используйте параметр ContinuationToken и значение свойства ContinuationToken, возвращенное ранее. Ниже вы можете видеть пример того, как это сделать.

$params = @{
    ReportedStartTime      = '04-01-19'
    ReportedEndTime        = '09-12-19'
    AggregationGranularity = 'Hourly'
    ShowDetails            = $true
    ContinuationToken      = $usageData.ContinuationToken
}
$usageData = Get-UsageAggregates @params

Теперь получите последний элемент в массиве свойства UsageAggregations с помощью $usageData.UsageAggregations[-1]. Сравните его с предыдущим результатом, чтобы подтвердить, что новые результаты отличаются.

Сравнение должно быть похоже на то, что вы видите ниже. Обратите внимание, что диапазоны дат разделены на 7 дней. Используя ContinuationToken, вы получили вторую страницу результатов.

Second page of usage reports
First page of usage reports

Построение функции отчетности об использовании ресурсов Azure

Вы должны знать, как работает постраничное отображение и как использовать свойство и параметр ContinuationToken. Но что, если нужно получить десятки или даже сотни тысяч результатов? Вручную использовать токен в таком случае не сработает.

Давайте создадим сценарий PowerShell, который будет обрабатывать эту требование постраничного отображения для нас и позволит нам некоторую дополнительную гибкость. Этот сценарий позволит вам указывать свои собственные параметры и обрабатывать требование постраничного отображения. Кроме того, он даст вам гибкость для расширения его в будущем для выполнения других задач, если это потребуется.

Создание параметров

Сначала создайте функциональную основу. Ниже вы можете увидеть пример функции с именем Get-AzureUsage. У этой функции три параметра, которые могут показаться вам знакомыми.

Ранее эти параметры определялись в самой командлете Get-UsageAggregates. Теперь вы создаете “оберточную” функцию, которая будет передавать значения этому командлету.

Function Get-AzureUsage {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$FromTime,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$ToTime,
 
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Hourly', 'Daily')]
        [string]$Interval = 'Daily'
    )

Ниже приведена таблица, предоставляющая дополнительную информацию о всех этих параметрах.

Parameter Usage
FromTime This is a mandatory parameter that accepts a DateTime value. The value represents the oldest date of the report.
ToTime This is a mandatory parameter that accepts a DateTime value. The value represents the latest date of the report.
Interval This is a non-empty parameter that accepts two possible values: ‘Daily’ and ‘Hourly’. The default value is Daily. This represents the granularity of the report to return.

Запрос использования ресурсов

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

Ниже приведен оставшийся код функции Get-AzureUsage. Обратите внимание на комментарии, чтобы глубже понять, что делает код.

Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    ## Запустите цикл do/while для автоматической обработки маркера продолжения
    do {    
        ## Определите все параметры для передачи в Get-UsageAggregates
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        ## Используйте параметр ContinuationToken только если это не первый запуск
        if ((Get-Variable -Name usageData -ErrorAction Ignore) -and $usageData) {
            Write-Verbose -Message "Querying usage data with continuation token $($usageData.ContinuationToken)..."
            $params.ContinuationToken = $usageData.ContinuationToken
        }
        $usageData = Get-UsageAggregates @params
        $usageData.UsageAggregations | Select-Object -ExpandProperty Properties
    } while ('ContinuationToken' -in $usageData.psobject.properties.name -and $usageData.ContinuationToken)
}

Готовый скрипт (копируется/вставляется)

Собрав параметры и функциональный код вместе, вы получите готовый скрипт, как показано ниже. Теперь вы можете скопировать его в свой собственный скрипт или непосредственно в консоль PowerShell для тестирования.

Function Get-AzureUsage {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$FromTime,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$ToTime,
 
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Hourly', 'Daily')]
        [string]$Interval = 'Daily'
    )
    
    Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    do {    
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        if ((Get-Variable -Name usageData -ErrorAction Ignore) -and $usageData) {
            Write-Verbose -Message "Querying usage data with continuation token $($usageData.ContinuationToken)..."
            $params.ContinuationToken = $usageData.ContinuationToken
        }
        $usageData = Get-UsageAggregates @params
        $usageData.UsageAggregations | Select-Object -ExpandProperty Properties
    } while ('ContinuationToken' -in $usageData.psobject.properties.name -and $usageData.ContinuationToken)
}

Запрос использования ресурсов с помощью нашей функции

Пришло время проверить функцию. Вставьте код выше в скрипт и выполните его в текущей сессии PowerShell или скопируйте код непосредственно в сеанс PowerShell.

Совет: Если вы используете PowerShell ISE или Visual Studio Code, вы можете выделить код, который хотите импортировать, и нажать F8. В противном случае проще скопировать и вставить код в сеанс PowerShell.

Теперь запустите функцию, указав значения для FromTime, ToTime и интервал, в котором вы хотите видеть результаты. Ниже приведен пример вызова этой функции.

$usage = Get-AzureUsage -FromTime '08-12-19' -ToTime '09-12-19' -Interval Hourly -Verbose

После запуска вы увидите подробные сообщения, если выбрали параметр Verbose. Как видно из приведенного ниже примера, количество отчетов о использовании составляет 4 659. Вы также заметите, что функция запустила функцию Get-UsageAggregates четыре раза, получая следующую страницу результатов каждый раз. Функция смогла сделать это, потому что использовала правильное значение ContinuationToken для каждого вызова.

Automatically handling the continuation token

Фильтрация отчета

На данном этапе отчет содержит все сведения об использовании всех доступных типов ресурсов. Но вы можете отфильтровать отчет, чтобы отобразить только нужный ресурс. Для этого вы можете либо расширить функцию, чтобы добавить эту функциональность, либо передать вывод другим командам PowerShell через конвейер.

Вывод от функции Get-Azure возвращает все типы ресурсов, но включает свойство с именем MeterCategory. Это свойство определяет тип ресурса, который представляет данная строка. Например, чтобы получить только отчеты об использовании виртуальных машин Azure, вы можете сгруппировать все объекты с MeterCategory равным Virtual Machines с помощью командлета Group-Object.

Командлет Group-Object вернет количество строк в выводе в свойстве Count. Затем, ограничивая вывод только свойствами Count и Name (значение для MeterCategory), вы можете увидеть, сколько строк отчетов об использовании существует для всех типов ресурсов Azure.

Как вы можете видеть на скриншоте ниже, в отчете есть 768 записей для Виртуальных машин.

Azure Virtual Machines resource usage

Чтобы продолжить идею фильтрации, вы также можете использовать вычисляемые свойства для создания более дружественного вывода, как показано ниже.

$usage | Where-Object {$_.MeterCategory -eq 'Virtual Machines'} | `
Format-Table UsageStartTime,UsageEndTime,@{n="VM Name";e={(($_.InstanceData | `
ConvertFrom-Json).'Microsoft.Resources'.resourceURI -split "/")[-1]}},Quantity,Unit

При выполнении фрагмента кода вы должны увидеть вывод, аналогичный показанному ниже.

Advanced filtering for Get-AzureUsage

Идеи для расширения отчета

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

Вы можете экспортировать вывод в CSV файл и обрабатывать данные в Excel или создать HTML отчет, используя ConvertTo-HTML или модуль PowerShell EnhancedHTML2.

Зайдите еще дальше и добавьте также уведомление по электронной почте с помощью командлета Send-MailMessage. Мир у вас в кармане!

Вывод

В этом посте вы узнали, как получить отчеты о использовании ресурсов из Azure. Вы также узнали, как создать пользовательскую функцию PowerShell для автоматизации процесса и использовать эту функцию для обработки вывода.

В следующий раз, когда вы будете удивлены неожиданно высоким счетом от Azure, у вас не будет оправдания! Создайте себе функцию PowerShell для запроса использования ресурсов Azure в любое время, чтобы следить за этим счетом.

Дополнительная информация

Source:
https://adamtheautomator.com/azure-detailed-usage-report/