Creare un Report Dettagliato sull’Utilizzo di Azure con PowerShell

Uno degli aspetti più importanti nell’eseguire carichi di lavoro in Azure è tenere traccia delle spese. Come fare ciò è tramite il monitoraggio dell’utilizzo delle risorse con un report dettagliato sull’utilizzo di Azure. In questo articolo, imparerai come creare uno script PowerShell per interrogare facilmente l’utilizzo delle risorse di Azure e le spese di tutte le tue risorse di Azure per data.

Le risorse in Azure aumentano costantemente la tua fattura in molti modi diversi. Sebbene sia possibile visualizzare l’utilizzo delle risorse tramite un portale web, è limitato. Ma utilizzando un paio di cmdlet PowerShell, puoi creare un pratico rapporto per darti una panoramica di che tipo di utilizzo (e quindi di spese) le tue risorse di Azure stanno facendo.

Questo articolo è stato creato da un video di TechSnips su YouTube. Se sei un apprendista più visivo, sentiti libero di guardare il video. Altrimenti, continua a leggere!

Scaricando i report tramite il Centro account di Azure

È possibile scaricare molti diversi report di utilizzo dal Centro account Azure. Il Centro account Azure è un portale web che consente di visualizzare la cronologia del ciclo di fatturazione, scaricare le fatture e vedere la panoramica dell’abbonamento Azure.

Anche se è possibile scaricare i report di utilizzo di Azure tramite il Centro account Azure, non è possibile selezionare un intervallo di date. Non è possibile limitare l’utilizzo a un intervallo di date perché le date sono fisse e coincidono con il ciclo di fatturazione.

Di seguito è riportato un esempio di periodo di fatturazione e i link per scaricare i report di utilizzo.

Azure Account Center usage reports

All’interno di questi report di utilizzo sono presenti molte altre informazioni che potrebbero non essere necessarie.

Forse hai bisogno di report di utilizzo degli ultimi 60 giorni. Per ottenere queste informazioni utilizzando il Centro account Azure, dovresti scaricare i report di utilizzo per almeno tre cicli di fatturazione per coprire tutte le date richieste.

Dopo aver scaricato i report, dovrai quindi rimuovere i dati in eccesso. Dovrai poi trovare un modo per consolidare quei dati in qualche modo. No grazie! È troppo lavoro aggiuntivo.

Utilizzando PowerShell, puoi creare uno script, una funzione o un modulo riutilizzabile per estrarre i report sull’utilizzo delle risorse di Azure. Questi, a loro volta, possono essere eseguiti manualmente con poche righe di comandi, o come attività pianificata per automatizzare l’esecuzione.

Prerequisiti

Questo è un articolo passo-passo. Per seguirmi, avrai bisogno di alcune cose già in atto.

Come ottenere i dati sull’utilizzo delle risorse

Prima di creare lo script, discutiamo prima delle basi utilizzando il cmdlet Get-UsageAggregates. Questo è un cmdlet che ti consente di estrarre l’utilizzo delle risorse di Azure per intervallo di date, metriche come orarie o giornaliere e altro ancora. Il cmdlet Get-UsageAggregates è il cmdlet principale che permette di ottenere la maggior parte delle funzionalità che imparerai in questo articolo.

Per dimostrare il cmdlet Get-UsageAggregates, supponiamo che tu abbia bisogno di trovare l’utilizzo delle risorse di Azure dal 1° aprile 2019 al 12 settembre 2019. La stessa tecnica può essere utilizzata per qualsiasi intervallo di date. Di seguito troverai un esempio per trovare i dati di utilizzo in base a quelle date.

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

(Mese Giorno Anno)

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

(Mese Giorno Anno)

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 vengono restituiti dei dati, dovresti ottenere risultati simili a quelli mostrati nella schermata sottostante. Puoi vedere che i dati di utilizzo effettivi sono memorizzati nella proprietà UsageAggregations.

Raw UsageAggregations output properties

Gestione della paginazione in Get-UsageAggregates

Nella sezione precedente, sarebbe comune che il comando restituisse molti oggetti, specialmente per intervalli di date lunghi. Per evitare di sovraccaricare l’API, il comando Get-UsageAggregates restituisce solo un massimo di 1000 risultati. Se hai salvato la variabile $usageData come descritto nella sezione precedente, puoi confermarlo eseguendo questo comando $usageData.UsageAggregations.count.

Cosa succede se ci sono più di 1000 risultati? Dovrai fare un po’ più di lavoro.

Quando esamini le proprietà restituite da Get-UsageAggregates, noterai una proprietà chiamata ContinuationToken come mostrato di seguito. Puoi vedere che questo token è una lunga stringa di caratteri.

Usage aggregates continuation token

Il ContinuationToken è un puntatore al set successivo di risultati. Questa proprietà funge da segnalibro per sapere da quale pagina ottenere il prossimo lotto di risultati.

Per dimostrare, ottieni l’ultimo elemento nel risultato precedente utilizzando $usageData.UsageAggregations[-1] come mostrato di seguito. Nota gli orari di Usage Start e Usage End.

First usage object

Ora passa gli stessi parametri al comando Get-UsageAggregates di nuovo. Ma questa volta, utilizza il parametro ContinuationToken e usa il valore della proprietà ContinuationToken restituito in precedenza. Di seguito puoi vedere un esempio di come fare ciò.

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

Ora ottieni l’ultimo elemento nell’array della proprietà UsageAggregations utilizzando $usageData.UsageAggregations[-1]. Confrontalo con il risultato precedente per confermare che i nuovi risultati siano diversi.

Il confronto dovrebbe essere simile a quelli che vedi di seguito. Nota che gli intervalli di date sono distanziati di sette giorni. Utilizzando il ContinuationToken, hai recuperato la seconda pagina di risultati.

Second page of usage reports
First page of usage reports

Creazione di una funzione di report sull’utilizzo delle risorse di Azure

Dovresti sapere come funziona il paging e come utilizzare la proprietà e il parametro ContinuationToken. Ma cosa succede se ci sono decine o addirittura centinaia di migliaia di risultati da recuperare? Utilizzare manualmente il token in questo modo non funzionerà molto bene.

Costruiamo uno script PowerShell che gestisca questo requisito di paging per noi e ci permetta una maggiore flessibilità. Questo script ti permetterà di fornire i tuoi parametri e gestire il requisito di paging. Ti darà anche la flessibilità di estenderlo in futuro per svolgere altre attività se necessario.

Costruzione dei parametri

Prima costruisci una struttura di base per la funzione. Di seguito puoi vedere un esempio di funzione chiamata Get-AzureUsage. Questa funzione ha tre parametri che potrebbero sembrarti familiari.

In precedenza, questi parametri erano definiti nel cmdlet Get-UsageAggregates stesso. Ora stai costruendo una funzione “wrapper” che passerà i valori a questo cmdlet.

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

Di seguito è riportata una tabella che fornisce ulteriori informazioni su tutti questi parametri.

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.

Recupero dell’utilizzo delle risorse

Una volta creata la funzione e definiti tutti i parametri, è ora di completare il resto della funzione.

Puoi vedere il resto della funzione Get-AzureUsage di seguito. Assicurati di leggere i commenti per una comprensione più approfondita di ciò che il codice sta facendo.

Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    ## Avvia il ciclo do/while per gestire automaticamente il continuation token
    do {    
        ## Definisci tutti i parametri da passare a Get-UsageAggregates
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        ## Utilizza il parametro ContinuationToken solo se non è il primo ciclo
        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)
}

Script completato (copiabile/incollabile)

Dopo aver messo insieme i parametri e il codice funzionale, otterrai uno script completato come puoi vedere di seguito. Ora puoi copiare questo script nel tuo script o direttamente nella console di PowerShell per testarlo.

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

Interrogazione dell’utilizzo delle risorse con la nostra funzione

È ora il momento di mettere alla prova la funzione. Puoi incollare il codice sopra in uno script e eseguirlo come script nella tua sessione corrente di PowerShell o copiare direttamente il codice nella tua sessione di PowerShell.

Suggerimento: se stai usando PowerShell ISE o Visual Studio Code, puoi evidenziare il codice che desideri importare e premere F8. Altrimenti, è più facile copiare e incollare il codice in una sessione di PowerShell.

Ora esegui la funzione fornendo un valore per FromTime, ToTime e l’intervallo con cui desideri visualizzare i risultati. Puoi vedere un esempio di come chiamare questa funzione di seguito.

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

Una volta che questo viene eseguito, vedrai alcuni messaggi dettagliati se hai scelto di utilizzare il parametro Verbose opzionale. Come puoi vedere dall’esempio qui sotto, il conteggio del rapporto di utilizzo è di 4.659. Noterai anche che la funzione ha eseguito la funzione Get-UsageAggregates quattro volte ottenendo ogni volta la pagina successiva dei risultati. La funzione è stata in grado di fare ciò perché ha utilizzato il corretto valore ContinuationToke per ogni chiamata.

Automatically handling the continuation token

Filtraggio del rapporto

A questo punto, il rapporto include tutti i dettagli sull’utilizzo di tutti i tipi di risorse disponibili. Ma è possibile filtrare il rapporto per visualizzare solo la risorsa desiderata. Per fare ciò, potresti estendere la funzione per consentire questa funzionalità o instradare l’output ad altri cmdlet di PowerShell.

L’output della funzione Get-Azure restituisce tutti i tipi di risorse, ma include una proprietà chiamata MeterCategory. Questa proprietà definisce il tipo di risorsa che quella riga rappresenta. Ad esempio, per ottenere solo i rapporti sull’utilizzo delle macchine virtuali di Azure, potresti raggruppare tutti gli oggetti con una MeterCategory di Virtual Machines utilizzando il cmdlet Group-Object.

Il cmdlet Group-Object restituirà il numero di righe presenti nell’output come proprietà Count. Quindi, limitando l’output solo alle proprietà Count e Name (valore per MeterCategory), puoi vedere quante righe di rapporto sull’utilizzo esistono per tutti i tipi di risorse di Azure.

Come puoi vedere dallo screenshot qui sotto, ci sono 768 voci per Macchine Virtuali nel report.

Azure Virtual Machines resource usage

Per portare avanti questo concetto di filtraggio, potresti anche sfruttare le proprietà calcolate per creare un output più user-friendly come mostrato di seguito.

$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

Quando esegui il frammento di codice sopra, dovresti vedere un output simile a quello mostrato di seguito.

Advanced filtering for Get-AzureUsage

Idee per estendere il report

Utilizzando il codice in questo articolo, puoi estendere la funzionalità dello strumento appena creato in molti modi diversi.

Potresti esportare l’output in un file CSVe manipolare i tuoi dati in Excel o creare un report HTML utilizzando ConvertTo-HTML o il modulo PowerShell EnhancedHTML2.

Porta le cose un po’ più avanti e aggiungi anche una notifica email al risultato con il cmdlet Send-MailMessage. Il mondo è tuo!

Riepilogo

In questo post, hai imparato come recuperare i report sull’utilizzo delle risorse da Azure. Hai anche imparato come creare una funzione PowerShell personalizzata per automatizzare il processo e utilizzare quella funzione per manipolare l’output.

La prossima volta che ti trovi di fronte a una fattura Azure inaspettata, non hai scuse! Costruisciti una funzione PowerShell per interrogare l’utilizzo delle risorse di Azure in qualsiasi momento per tenere d’occhio quella fattura.

Ulteriori letture

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