Crear un informe detallado de uso de Azure con PowerShell

Uno de los aspectos más importantes al ejecutar cargas de trabajo en Azure es llevar un seguimiento de los gastos. La forma de hacerlo es mediante el seguimiento del uso de recursos con un informe detallado de uso de Azure. En este artículo, aprenderás cómo crear un script de PowerShell para consultar fácilmente el uso de recursos y los cargos en Azure en todas tus recursos de Azure por fecha.

Los recursos en Azure están constantemente acumulando costos de diversas maneras. Aunque puedes ver el uso de recursos a través de un portal web, es limitado. Pero utilizando algunos cmdlets de PowerShell, puedes construir un informe útil que te brinde una visión general de qué tipo de uso (y, por lo tanto, gastos) tienen tus recursos de Azure.

Este artículo fue creado a partir de un video de TechSnips en YouTube. Si eres más visual, siéntete libre de ver el video. ¡De lo contrario, sigue leyendo!

Descarga de informes a través del Centro de Cuentas de Azure

Puede descargar muchos informes de uso diferentes desde el Centro de cuentas de Azure. El Centro de cuentas de Azure es un portal web que le permite ver el historial de su ciclo de facturación, descargar facturas y ver el resumen de su suscripción a Azure.

Aunque puede descargar informes de uso de Azure a través del Centro de cuentas de Azure, no hay flexibilidad para elegir un rango de fechas. No puede limitar el uso a un rango de fechas porque las fechas están fijadas para coincidir con su ciclo de facturación.

A continuación, puede ver un ejemplo de un período de facturación y enlaces para descargar informes de uso.

Azure Account Center usage reports

Dentro de estos informes de uso se incluye mucha otra información que quizás no necesite.

Tal vez necesite informes de uso de los últimos 60 días. Para obtener esta información utilizando el Centro de cuentas de Azure, tendría que descargar informes de uso durante al menos tres ciclos de facturación para cubrir todas las fechas requeridas.

Después de descargar los informes, tendrías que eliminar los datos excesivos. Luego tendrías que encontrar una manera de consolidar esos datos de alguna manera. ¡No gracias! Eso es demasiada sobrecarga.

Usando PowerShell, puedes crear un script, función o módulo reutilizable para extraer informes de uso de recursos de Azure. Estos, a su vez, se pueden ejecutar manualmente con unas pocas líneas de comandos, o como una tarea programada para automatizar la ejecución.

Prerrequisitos

Este es un artículo de guía paso a paso. Para seguirlo, necesitarás tener algunas cosas en su lugar.

Cómo obtener los datos de uso de recursos

Antes de crear el script, discutamos primero los conceptos básicos utilizando el cmdlet Get-UsageAggregates. Este es un cmdlet que te permite obtener el uso de recursos de Azure por rango de fechas, métricas como por hora o por día, y más. El cmdlet Get-UsageAggregates es el principal responsable de la mayoría de las funciones que aprenderás en este artículo.

Para demostrar el cmdlet Get-UsageAggregates, supongamos que necesitas encontrar el uso de recursos de Azure desde el 1 de abril de 2019 hasta el 12 de septiembre de 2019. La misma técnica se puede utilizar para cualquier rango de fechas. A continuación, verás un fragmento para encontrar datos de uso basados en esas fechas.

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

(Mes Día Año)

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

(Mes Día Año)

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

Si hay datos devueltos, deberías obtener resultados similares a los de la captura de pantalla que se muestra a continuación. Puedes ver que los datos reales de uso se almacenan en la propiedad UsageAggregations.

Raw UsageAggregations output properties

Manejo de Paginación en Get-UsageAggregates

En la sección anterior, sería común que el comando devolviera muchos miles de objetos, especialmente para rangos de fechas extensos. Para evitar abrumar la API, el comando Get-UsageAggregates solo devuelve un máximo de 1000 resultados. Si has guardado la variable $usageData como se explicó en la sección anterior, puedes confirmarlo ejecutando este comando $usageData.UsageAggregations.count.

¿Qué pasa si hay más de 1000 resultados? Vas a tener que hacer un poco más de trabajo.

Cuando examinas las propiedades devueltas por Get-UsageAggregates, notarás una propiedad llamada ContinuationToken, como se muestra a continuación. Puedes ver que este token es una larga cadena de caracteres.

Usage aggregates continuation token

El ContinuationToken es un puntero al siguiente conjunto de resultados. Esta propiedad actúa como un marcador para saber desde qué página obtener el siguiente lote de resultados.

Para demostrarlo, obtén el último elemento en el resultado anterior usando $usageData.UsageAggregations[-1], como se muestra a continuación. Observa las horas de inicio y fin de uso (Usage Start y Usage End).

First usage object

Ahora pasa los mismos parámetros al comando Get-UsageAggregates nuevamente. Pero esta vez, usa el parámetro ContinuationToken y utiliza el valor de la propiedad ContinuationToken devuelta anteriormente. A continuación, puedes ver un ejemplo de cómo hacer esto.

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

Ahora obtén el último elemento en la matriz de propiedades UsageAggregations usando $usageData.UsageAggregations[-1]. Compáralo con el resultado anterior para confirmar que los nuevos resultados son diferentes.

La comparación debería ser similar a las que ves a continuación. Observa que los rangos de fechas tienen una diferencia de siete días. Al utilizar el ContinuationToken, has recuperado la segunda página de resultados.

Second page of usage reports
First page of usage reports

Creación de una Función de Informes de Uso de Recursos de Azure

Debe conocer cómo funciona el paginado y cómo utilizar la propiedad y parámetro ContinuationToken. Pero ¿qué pasa si hay decenas o incluso cientos de miles de resultados para recuperar? Utilizar manualmente el token de esta manera no funcionará demasiado bien.

Vamos a construir un script de PowerShell que maneje este requisito de paginado para nosotros y nos permita cierta flexibilidad adicional. Este script le permitirá proporcionar sus propios parámetros y manejar el requisito de paginado. También le dará la flexibilidad de ampliarlo más adelante para realizar otras tareas si es necesario.

Construyendo los Parámetros

Primero construya algún armazón de función. A continuación, puede ver un ejemplo de función llamada Get-AzureUsage. Esta función tiene tres parámetros que pueden resultar familiares.

Anteriormente, estos parámetros se definían en el propio cmdlet Get-UsageAggregates. Ahora está construyendo una función “envoltorio” que pasará valores a 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'
    )

A continuación se muestra una tabla que proporciona más información sobre todos estos 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 el Uso de Recursos

Una vez que se ha creado la función y se han definido todos los parámetros, es hora de completar el resto de la función.

Puede ver el resto de la función Get-AzureUsage a continuación. Asegúrese de revisar los comentarios para comprender más profundamente qué está haciendo el código.

Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    ## Iniciar el bucle do/while para manejar automáticamente el token de continuación
    do {    
        ## Definir todos los parámetros a pasar a Get-UsageAggregates
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        ## Utilizar el parámetro ContinuationToken solo si no es la primera ejecución
        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)
}

El Script Completado (Copiable/Pegable)

Después de juntar los parámetros y el código funcional, obtendrás un script completo como puedes ver a continuación. Ahora puedes copiar esto en tu propio script o directamente en la consola de PowerShell para probarlo.

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 el Uso de Recursos con Nuestra Función

Ahora es el momento de poner a prueba la función. Pega el código anterior en un script y haz un dot source en tu sesión actual de PowerShell, o copia el código directamente en tu sesión de PowerShell.

Consejo: Si estás utilizando PowerShell ISE o Visual Studio Code, puedes resaltar el código que deseas importar y presionar F8. De lo contrario, es más fácil copiar y pegar el código en una sesión de PowerShell.

Ahora ejecuta la función proporcionando un valor para FromTime, ToTime y el intervalo que te gustaría ver en los resultados. Puedes ver un ejemplo a continuación de cómo llamar a esta función.

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

Una vez que esto se ejecute, verás algunos mensajes detallados si has elegido usar el parámetro opcional Verbose. Como puedes ver en el ejemplo a continuación, el recuento de informes de uso es de 4,659. También notarás que la función ejecutó la función Get-UsageAggregates cuatro veces, obteniendo la siguiente página de resultados cada vez. La función pudo hacer esto porque utilizó el valor correcto de ContinuationToken para cada llamada.

Automatically handling the continuation token

Filtrando el Informe

En este punto, el informe incluye todos los detalles de uso sobre todos los tipos de recursos disponibles. Pero puedes filtrar el informe para mostrar solo el recurso que deseas. Para hacer esto, podrías extender la función para permitir esta funcionalidad o canalizar la salida a otros cmdlets de PowerShell.

La salida de la función Get-Azure devuelve todos los tipos de recursos pero incluye una propiedad llamada MeterCategory. Esta propiedad define el tipo de recurso que representa esa fila. Por ejemplo, para obtener solo informes de uso de máquinas virtuales de Azure, podrías agrupar todos los objetos con una MeterCategory de Virtual Machines usando el cmdlet Group-Object.

El cmdlet Group-Object devolverá cuántas filas estaban presentes en la salida como la propiedad Count. Luego, limitando la salida solo a las propiedades Count y Name (valor para MeterCategory), puedes ver cuántas filas de informe de uso existen para todos los tipos de recursos de Azure.

Como puede ver en la captura de pantalla a continuación, hay 768 entradas para Máquinas virtuales en el informe.

Azure Virtual Machines resource usage

Para llevar este concepto de filtrado un poco más lejos, también podría aprovechar propiedades calculadas para crear una salida más amigable como se muestra a continuación.

$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

Cuando ejecuta el fragmento de código anterior, debería ver una salida similar a la que se muestra a continuación.

Advanced filtering for Get-AzureUsage

Ideas para ampliar el informe

Utilizando el código de este artículo, puede ampliar la funcionalidad de la herramienta creada de muchas maneras diferentes.

Puede exportar la salida a un archivo CSV y manipular sus datos en Excel o crear un informe HTML utilizando ConvertTo-HTML o el módulo de PowerShell EnhancedHTML2.

Lleve las cosas un poco más lejos y agregue una notificación por correo electrónico al resultado también con el cmdlet Send-MailMessage. ¡El mundo es suyo!

Resumen

En esta publicación, aprendió cómo obtener informes de uso de recursos de Azure. También aprendió cómo construir una función personalizada de PowerShell para automatizar el proceso y utilizar esa función para manipular la salida.

La próxima vez que te encuentres con una factura inesperada de Azure, ¡no tienes excusa! Constrúyete una función de PowerShell para consultar el uso de recursos de Azure en cualquier momento y así vigilar esa factura.

Lecturas Adicionales

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