Construa um Relatório Detalhado de Uso do Azure com PowerShell

Um dos aspectos mais importantes ao executar cargas de trabalho no Azure é acompanhar os gastos. A maneira de fazer isso é rastreando o uso de recursos com um relatório detalhado de uso do Azure. Neste artigo, você aprenderá como criar um script do PowerShell para consultar facilmente o uso de recursos e as cobranças no Azure em todas as suas recursos por data.

Recursos no Azure estão constantemente aumentando suas despesas de várias maneiras. Embora seja possível ver o uso de recursos por meio de um portal da web, isso é limitado. Mas usando alguns cmdlets do PowerShell, é possível criar um relatório útil para fornecer uma visão geral do tipo de uso (e, portanto, despesas) de seus recursos do Azure.

Este artigo foi criado a partir de um vídeo do YouTube da TechSnips. Se você é um aprendiz mais visual, sinta-se à vontade para conferir o vídeo. Caso contrário, continue lendo!

Download de Relatórios via Centro de Conta do Azure

Você pode baixar muitos relatórios de uso diferentes do Centro de Conta do Azure. O Centro de Conta do Azure é um portal da web que permite visualizar o histórico do seu ciclo de faturamento, baixar faturas e ver uma visão geral da sua assinatura do Azure.

Embora seja possível baixar relatórios de uso do Azure através do Centro de Conta do Azure, não há flexibilidade na escolha de um intervalo de datas. Você não pode limitar o uso a um intervalo de datas porque as datas são fixadas para coincidir com o seu ciclo de faturamento.

Você pode ver abaixo um exemplo de período de faturamento e links para baixar relatórios de uso.

Azure Account Center usage reports

Dentro desses relatórios de uso contém muitas outras informações que você pode não precisar.

Talvez você precise de relatórios de uso dos últimos 60 dias. Para obter estas informações usando o Centro de Conta do Azure, você teria que baixar relatórios de uso de pelo menos três ciclos de faturamento para cobrir todas as datas necessárias.

Depois de baixados os relatórios, você teria que remover os dados em excesso. Em seguida, teria que descobrir uma maneira de consolidar esses dados de alguma forma. Não, obrigado! Isso é muita sobrecarga.

Usando o PowerShell, você pode criar um script, função ou módulo reutilizável para obter relatórios de uso de recursos do Azure. Esses, por sua vez, podem ser executados manualmente com algumas linhas de comandos ou como uma tarefa agendada para automatizar a execução.

Pré-requisitos

Este é um artigo passo a passo. Para acompanhar, você precisará ter algumas coisas em vigor.

Como obter dados de uso de recursos

Antes de criar o script, vamos primeiro discutir os conceitos básicos usando o cmdlet Get-UsageAggregates. Este é um cmdlet que permite extrair o uso de recursos do Azure por intervalo de datas, métricas como por hora ou diariamente e muito mais. O cmdlet Get-UsageAggregates é o principal cmdlet que realiza a maior parte da mágica que você aprenderá neste artigo.

Para demonstrar o cmdlet Get-UsageAggregates, digamos que você precise encontrar o uso de recursos do Azure de 1º de abril de 2019 a 12 de setembro de 2019. A mesma técnica pode ser usada para qualquer intervalo de datas. Abaixo, você verá um trecho para encontrar dados de uso com base nessas datas.

$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.

(Mês Dia Ano)

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

(Mês Dia Ano)

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

Se houver dados retornados, você deve obter resultados semelhantes à captura de tela abaixo. Você pode ver que os dados reais de uso são armazenados na propriedade UsageAggregations.

Raw UsageAggregations output properties

Lidando com Paginação em Get-UsageAggregates

Na seção acima, é comum o comando retornar muitos milhares de objetos, especialmente para intervalos de datas longos. Para evitar sobrecarregar a API, o comando Get-UsageAggregates retorna apenas no máximo 1000 resultados. Se você salvou a variável $usageData conforme abordado na seção anterior, você pode confirmar executando este comando $usageData.UsageAggregations.count.

E se houver mais de 1000 resultados? Você terá que fazer um pouco mais de trabalho.

Quando você examinar as propriedades retornadas por Get-UsageAggregates, você notará uma propriedade chamada ContinuationToken como mostrado abaixo. Você pode ver que esse token é uma longa cadeia de caracteres.

Usage aggregates continuation token

O ContinuationToken é um ponteiro para o próximo conjunto de resultados. Essa propriedade atua como um marcador para saber de qual página obter o próximo lote de resultados.

Para demonstrar, pegue o último item no resultado anterior usando $usageData.UsageAggregations[-1] como mostrado abaixo. Note os tempos de Início de Uso e Fim de Uso.

First usage object

Agora passe os mesmos parâmetros para o comando Get-UsageAggregates novamente. Mas desta vez, use o parâmetro ContinuationToken e use o valor da propriedade ContinuationToken retornada anteriormente. Abaixo você pode ver um exemplo de como fazer isso.

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

Agora pegue o último item no array de propriedades UsageAggregations usando $usageData.UsageAggregations[-1]. Compare-o com o resultado anterior para confirmar que os novos resultados são diferentes.

A comparação deve ser semelhante às que você vê abaixo. Observe que os intervalos de datas têm sete dias de diferença. Ao usar o ContinuationToken, você recuperou a segunda página de resultados.

Second page of usage reports
First page of usage reports

Construindo uma Função de Relatório de Uso de Recursos do Azure

Deve saber como funciona o paginação e como usar a propriedade e parâmetro ContinuationToken. Mas e se houver dezenas ou até centenas de milhares de resultados para recuperar? Usar manualmente o token dessa forma não vai funcionar muito bem.

Vamos construir um PowerShell que lida com esse requisito de paginação para nós e nos permite alguma flexibilidade adicional. Este script permitirá que você forneça seus próprios parâmetros e lide com o requisito de paginação. Também lhe dará a flexibilidade de estendê-lo futuramente para realizar outras tarefas, se necessário.

Construindo os Parâmetros

Primeiro, construa algum esqueleto de função. Abaixo, você pode ver um exemplo de função chamada Get-AzureUsage. Esta função tem três parâmetros que podem parecer familiares.

Anteriormente, esses parâmetros eram definidos no próprio cmdlet Get-UsageAggregates. Agora, você está construindo uma função “wrapper” que passará valores para este cmdlet.

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

Abaixo está uma tabela fornecendo mais informações sobre todos esses parâmetros.

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.

Consultando o Uso de Recursos

Assim que a função for criada e todos os parâmetros definidos, é hora de preencher o restante da função.

Você pode ver o restante da função Get-AzureUsage abaixo. Certifique-se de dar uma olhada nos comentários para entender melhor o que o código está fazendo.

Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    ## Iniciar o loop do/while para lidar automaticamente com o token de continuação
    do {    
        ## Definir todos os parâmetros para passar para Get-UsageAggregates
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        ## Utilizar o parâmetro ContinuationToken apenas se esta não for a primeira execução
        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)
}

O Script Completo (Copiável)

Depois de juntar os parâmetros e o código funcional, você obterá um script completo como pode ver abaixo. Agora você pode copiá-lo para o seu próprio script ou diretamente para o console do PowerShell para testar.

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)
}

Consultando o Uso de Recursos com Nossa Função

Agora é hora de testar a função. Cole o código acima em um script e dot source dentro da sua sessão atual do PowerShell ou copie o código diretamente para a sua sessão do PowerShell.

Dica: Se estiver usando o PowerShell ISE ou o Visual Studio Code, você pode destacar o código que deseja importar e pressionar F8. Caso contrário, é mais fácil copiar e colar o código em uma sessão do PowerShell.

Agora execute a função fornecendo um valor para FromTime, ToTime e o intervalo que gostaria de ver os resultados. Você pode ver um exemplo abaixo de como chamar esta função.

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

Assim que isso é executado, você verá algumas mensagens verbosas se tiver escolhido usar o parâmetro opcional Verbose. Como você pode ver no exemplo abaixo, a contagem do relatório de uso é 4.659. Você também notará que a função executou a função Get-UsageAggregates quatro vezes, obtendo a próxima página de resultados cada vez. A função foi capaz de fazer isso porque usou o ContinuationToke correto para cada chamada.

Automatically handling the continuation token

Filtrando o Relatório

Neste ponto, o relatório inclui todos os detalhes de uso sobre todos os tipos de recursos disponíveis. Mas você pode filtrar o relatório para exibir apenas o recurso desejado. Para fazer isso, você poderia estender a função para permitir essa funcionalidade ou encaminhar a saída para outros cmdlets do PowerShell.

A saída da função Get-Azure retorna todos os tipos de recursos, mas inclui uma propriedade chamada MeterCategory. Esta propriedade define o tipo de recurso que a linha representa. Por exemplo, para obter apenas relatórios de uso de Máquinas Virtuais do Azure, você poderia agrupar todos os objetos com um MeterCategory de Máquinas Virtuais usando o cmdlet Group-Object.

O cmdlet Group-Object retornará quantas linhas estavam presentes na saída como a propriedade Count. Então, limitando a saída apenas para a Count e Name propriedade (valor para MeterCategory), você pode ver quantas linhas de relatório de uso existem para todos os tipos de recursos do Azure.

Como você pode ver na captura de tela abaixo, existem 768 entradas para Máquinas Virtuais no relatório.

Azure Virtual Machines resource usage

Para levar esse conceito de filtragem um pouco mais adiante, você também pode aproveitar propriedades calculadas para criar uma saída mais amigável, como mostrado abaixo.

$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

Ao executar o trecho de código acima, você deve ver uma saída semelhante ao que é mostrado abaixo.

Advanced filtering for Get-AzureUsage

Ideias para Expandir o Relatório

Usando o código neste artigo, você pode estender a funcionalidade da ferramenta recém-criada de muitas maneiras diferentes.

Você poderia exportar a saída para um arquivo CSV e manipular seus dados no Excel ou criar um relatório HTML usando ConvertTo-HTML ou o módulo PowerShell EnhancedHTML2.

Leve as coisas um pouco mais além e adicione uma notificação por e-mail ao resultado também com o cmdlet Send-MailMessage. O mundo é seu!

Resumo

Neste post, você aprendeu como recuperar relatórios de uso de recursos do Azure. Você também aprendeu como construir uma função personalizada do PowerShell para automatizar o processo e usar essa função para manipular a saída.

Da próxima vez que receber uma fatura inesperada do Azure, você não tem desculpas! Crie uma função PowerShell para consultar o uso de recursos do Azure a qualquer momento e fique de olho nessa fatura.

Leitura Adicional

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