Eine detaillierte Azure-Nutzungsbericht mit PowerShell erstellen

Einer der wichtigsten Aspekte beim Betrieb von Arbeitslasten in Azure ist die Überwachung der Ausgaben. Dies geschieht durch die Verfolgung der Ressourcennutzung mithilfe eines detaillierten Azure-Nutzungsberichts. In diesem Artikel erfahren Sie, wie Sie ein PowerShell-Skript erstellen, um die Azure-Ressourcennutzung und -kosten über alle Ihre Azure-Ressourcen hinweg nach Datum abzufragen.

Ressourcen in Azure verursachen kontinuierlich Kosten auf verschiedene Weise. Obwohl Sie die Ressourcennutzung über ein Webportal einsehen können, ist dies begrenzt. Mit Hilfe einiger PowerShell-Cmdlets können Sie jedoch einen praktischen Bericht erstellen, der Ihnen einen Überblick darüber gibt, welche Art von Nutzung (und damit verbundene Kosten) Ihre Azure-Ressourcen haben.

Dieser Artikel wurde aus einem TechSnips-YouTube-Video erstellt. Wenn Sie eher visuell lernen, können Sie sich gerne das Video ansehen. Andernfalls lesen Sie weiter!

Abrufen von Berichten über das Azure Account Center

Sie können viele verschiedene Nutzungsberichte aus dem Azure Account Center herunterladen. Das Azure Account Center ist ein Webportal, das es Ihnen ermöglicht, Ihren Abrechnungszyklusverlauf einzusehen, Rechnungen herunterzuladen und eine Übersicht über Ihr Azure-Abonnement zu erhalten.

Obwohl Sie Azure-Nutzungsberichte über das Azure Account Center herunterladen können, besteht keine Flexibilität bei der Auswahl eines Datumsbereichs. Sie können die Nutzung nicht auf einen bestimmten Zeitraum beschränken, da die Daten so festgelegt sind, dass sie mit Ihrem Abrechnungszyklus übereinstimmen.

Unten sehen Sie ein Beispiel für einen Abrechnungszeitraum und Links zum Herunterladen von Nutzungsberichten.

Azure Account Center usage reports

In diesen Nutzungsberichten finden Sie viele weitere Informationen, die Sie möglicherweise nicht benötigen.

Möglicherweise benötigen Sie Nutzungsberichte für die letzten 60 Tage. Um diese Informationen mithilfe des Azure Account Center zu erhalten, müssten Sie Nutzungsberichte für mindestens drei Abrechnungszyklen herunterladen, um alle erforderlichen Daten abzudecken.

Nachdem die Berichte heruntergeladen wurden, müssten Sie dann die überschüssigen Daten entfernen. Sie müssten dann eine Möglichkeit finden, diese Daten irgendwie zusammenzufassen. Nein danke! Das ist zu viel Aufwand.

Mit PowerShell können Sie ein wiederverwendbares Skript, eine Funktion oder ein Modul erstellen, um Azure-Ressourcennutzungsberichte abzurufen. Diese können wiederum manuell mit ein paar Zeilen Befehlen oder als geplante Aufgabe zur Automatisierung der Ausführung ausgeführt werden.

Voraussetzungen

Dies ist ein Schritt-für-Schritt-Artikel. Um mitzumachen, müssen Sie einige Dinge bereithalten.

Wie man Ressourcennutzungsdaten erhält

Bevor wir das Skript erstellen, diskutieren wir zuerst die Grundlagen unter Verwendung des Get-UsageAggregates-Cmdlets. Dies ist ein Cmdlet, mit dem Sie Azure-Ressourcennutzung nach Datum, Metriken wie Stunden oder Tage und mehr abrufen können. Das Get-UsageAggregates-Cmdlet ist das Haupt-Cmdlet, das den Großteil der Magie ausführt, die Sie in diesem Artikel lernen werden.

Um das Get-UsageAggregates-Cmdlet zu demonstrieren, nehmen wir an, Sie müssen die Azure-Ressourcennutzung vom 1. April 2019 bis zum 12. September 2019 finden. Die gleiche Technik kann für jeden beliebigen Zeitraum verwendet werden. Im Folgenden finden Sie einen Ausschnitt, um die Nutzungsinformationen basierend auf diesen Daten zu finden.

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

(Monat Tag Jahr)

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

(Monat Tag Jahr)

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

Wenn Daten zurückgegeben werden, sollten Sie ähnliche Ergebnisse wie in diesem Screenshot sehen. Sie können sehen, dass die tatsächlichen Nutzungsdaten in der UsageAggregations-Eigenschaft gespeichert sind.

Raw UsageAggregations output properties

Umgang mit Paging in Get-UsageAggregates

In dem obigen Abschnitt ist es üblich, dass der Befehl viele tausend Objekte zurückgibt, insbesondere für lange Zeiträume. Um die API nicht zu überlasten, gibt der Befehl Get-UsageAggregates maximal 1000 Ergebnisse zurück. Wenn Sie die Variable $usageData wie im vorherigen Abschnitt gespeichert haben, können Sie dies bestätigen, indem Sie den Befehl $usageData.UsageAggregations.count ausführen.

Was ist, wenn es mehr als 1000 Ergebnisse gibt? Du musst ein wenig mehr Arbeit leisten.

Wenn du die von Get-UsageAggregates zurückgegebenen Eigenschaften untersuchst, wirst du eine Eigenschaft namens ContinuationToken bemerken, wie unten gezeigt. Du kannst sehen, dass dieser Token eine lange Zeichenkette ist.

Usage aggregates continuation token

Der ContinuationToken ist ein Zeiger auf den nächsten Satz von Ergebnissen. Diese Eigenschaft fungiert als Lesezeichen, um zu wissen, von welcher Seite die nächsten Ergebnisse abgerufen werden sollen.

Zur Veranschaulichung: Rufe das letzte Element im vorherigen Ergebnis mit $usageData.UsageAggregations[-1] ab, wie unten gezeigt. Beachte die Zeiten für Usage Start und Usage End.

First usage object

Gib nun dieselben Parameter erneut an den Befehl Get-UsageAggregates weiter. Verwende jedoch diesmal den Parameter ContinuationToken und den Wert der zuvor zurückgegebenen Eigenschaft ContinuationToken. Unten siehst du ein Beispiel, wie dies gemacht wird.

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

Rufe nun das letzte Element im Array UsageAggregations mit $usageData.UsageAggregations[-1] ab. Vergleiche es mit dem vorherigen Ergebnis, um zu bestätigen, dass die neuen Ergebnisse unterschiedlich sind.

Der Vergleich sollte ähnlich aussehen wie die unten gezeigten. Beachte, dass die Datumsbereiche sieben Tage auseinanderliegen. Durch Verwendung des ContinuationToken hast du die zweite Seite der Ergebnisse abgerufen.

Second page of usage reports
First page of usage reports

Erstellen einer Azure-Ressourcen-Nutzungsberichtsfunktion

Sie sollten wissen, wie das Paging funktioniert und wie Sie die Eigenschaft und den Parameter „ContinuationToken“ verwenden können. Aber was ist, wenn Sie Zehntausende oder sogar Hunderttausende von Ergebnissen abrufen müssen? Das manuelle Verwenden des Tokens auf diese Weise funktioniert nicht besonders gut.

Lasst uns ein PowerShell-Skript erstellen, das diese Paging-Anforderung für uns behandelt und uns einige weitere Flexibilität ermöglicht. Mit diesem Skript können Sie Ihre eigenen Parameter angeben und die Paging-Anforderung behandeln. Es gibt Ihnen auch die Flexibilität, es später zu erweitern, um bei Bedarf andere Aufgaben auszuführen.

Erstellen der Parameter

Zuerst erstellen Sie ein Funktionsskelett. Im Folgenden sehen Sie ein Beispiel für eine Funktion namens „Get-AzureUsage“. Diese Funktion hat drei Parameter, die Ihnen vielleicht bekannt vorkommen.

Zuvor wurden diese Parameter direkt im „Get-UsageAggregates“ Cmdlet definiert. Sie erstellen jetzt jedoch eine „Wrapper“-Funktion, die Werte an dieses Cmdlet übergibt.

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

Im Folgenden finden Sie eine Tabelle mit weiteren Informationen zu all diesen Parametern.

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.

Abrufen der Ressourcennutzung

Sobald die Funktion erstellt und alle Parameter definiert wurden, ist es an der Zeit, den Rest der Funktion auszufüllen.

Im Folgenden sehen Sie den Rest der „Get-AzureUsage“ Funktion. Beachten Sie die Kommentare für ein tieferes Verständnis dessen, was der Code tut.

Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    ## Starten Sie die do/while-Schleife, um das Fortsetzungstoken automatisch zu behandeln
    do {    
        ## Definieren Sie alle Parameter, die an Get-UsageAggregates übergeben werden sollen
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        ## Verwenden Sie den ContinuationToken-Parameter nur, wenn dies nicht der erste Durchlauf ist
        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)
}

Das abgeschlossene Skript (kopierbar)

Nachdem Sie die Parameter und den Funktionscode zusammengefügt haben, erhalten Sie ein abgeschlossenes Skript, wie Sie unten sehen können. Sie können dies nun in Ihr eigenes Skript oder direkt in die PowerShell-Konsole kopieren, um es zu testen.

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

Abrufen von Ressourcennutzung mit unserer Funktion

Jetzt ist es an der Zeit, die Funktion zu testen. Entweder fügen Sie den obenstehenden Code in ein Skript ein und dot sourcen Sie es in Ihre aktuelle PowerShell-Sitzung ein oder kopieren Sie den Code direkt in die PowerShell-Sitzung.

Tipp: Wenn Sie PowerShell ISE oder Visual Studio Code verwenden, können Sie den Code, den Sie importieren möchten, markieren und F8 drücken. Andernfalls ist es einfacher, den Code in eine PowerShell-Sitzung zu kopieren und einzufügen.

Führen Sie nun die Funktion aus, indem Sie einen Wert für FromTime, ToTime und das gewünschte Intervall angeben, um die Ergebnisse anzuzeigen. Sie können unten ein Beispiel sehen, wie Sie diese Funktion aufrufen.

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

Sobald dies ausgeführt wird, sehen Sie einige ausführliche Meldungen, wenn Sie den optionalen Verbose-Parameter verwendet haben. Wie Sie aus dem folgenden Beispiel sehen können, beträgt die Anzahl der Nutzungsmeldungen 4.659. Sie werden auch bemerken, dass die Funktion die Funktion Get-UsageAggregates viermal ausgeführt hat, um jeweils die nächste Seite der Ergebnisse zu erhalten. Die Funktion konnte dies tun, weil sie für jeden Aufruf den richtigen ContinuationToken-Wert verwendet hat.

Automatically handling the continuation token

Filtern des Berichts

Zu diesem Zeitpunkt enthält der Bericht alle Nutzungsdetails zu allen verfügbaren Ressourcentypen. Sie können jedoch den Bericht filtern, um nur die gewünschte Ressource anzuzeigen. Dazu könnten Sie entweder die Funktion erweitern, um diese Funktionalität zu ermöglichen, oder die Ausgabe an andere PowerShell-Cmdlets weiterleiten.

Die Ausgabe der Funktion Get-Azure enthält alle Ressourcentypen, aber auch eine Eigenschaft namens MeterCategory. Diese Eigenschaft definiert den Typ der Ressource, die diese Zeile darstellt. Um beispielsweise nur Berichte über die Nutzung von Azure Virtual Machines zu erhalten, könnten Sie alle Objekte mit einer MeterCategory von Virtual Machines mit dem Cmdlet Group-Object gruppieren.

Das Cmdlet Group-Object gibt zurück, wie viele Zeilen in der Ausgabe vorhanden waren, als Eigenschaft Count. Dann können Sie die Ausgabe auf die Eigenschaften Count und Name (Wert für MeterCategory) beschränken, um zu sehen, wie viele Nutzungsberichtszeilen für alle Azure-Ressourcentypen vorhanden sind.

Wie Sie im untenstehenden Screenshot sehen können, gibt es 768 Einträge für virtuelle Maschinen im Bericht.

Azure Virtual Machines resource usage

Um dieses Filterkonzept noch weiter zu entwickeln, könnten Sie auch berechnete Eigenschaften nutzen, um eine benutzerfreundlichere Ausgabe zu erstellen, wie unten gezeigt.

$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

Wenn Sie den obigen Code-Ausschnitt ausführen, sollten Sie eine ähnliche Ausgabe wie unten sehen.

Advanced filtering for Get-AzureUsage

Ideen zur Erweiterung des Berichts

Mit dem in diesem Artikel gezeigten Code können Sie die Funktionalität des erstellten Tools auf verschiedene Weise erweitern.

Sie könnten die Ausgabe in eine CSV-Datei exportieren und Ihre Daten in Excel bearbeiten oder einen HTML-Bericht mit ConvertTo-HTML oder dem PowerShell-Modul EnhancedHTML2 erstellen.

Gehen Sie noch einen Schritt weiter und fügen Sie der Ausgabe eine E-Mail-Benachrichtigung mit dem Cmdlet Send-MailMessage hinzu. Die Welt steht Ihnen offen!

Zusammenfassung

In diesem Beitrag haben Sie gelernt, wie Sie Nutzungsberichte für Ressourcen aus Azure abrufen können. Sie haben auch gelernt, wie Sie eine benutzerdefinierte PowerShell-Funktion erstellen, um den Prozess zu automatisieren und die Ausgabe zu manipulieren.

Das nächste Mal, wenn Sie mit einer unerwarteten Azure-Rechnung konfrontiert werden, haben Sie keine Ausrede! Erstellen Sie sich selbst eine PowerShell-Funktion, um die Azure-Ressourcennutzung jederzeit abzufragen und ein Auge auf diese Rechnung zu haben.

Weitere Informationen

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