Bouw een Azure Gedetailleerd Gebruiksrapport met PowerShell

Een van de belangrijkste aspecten van het uitvoeren van workloads in Azure is het bijhouden van kosten. Hoe je dat doet, is door het bijhouden van het gebruik van resources met een gedetailleerd gebruiksoverzicht van Azure. In dit artikel leer je hoe je een PowerShell-script kunt maken om eenvoudig het gebruik van Azure-resources en kosten over al je Azure-resources op datum te bevragen.

Resources in Azure draaien voortdurend op je factuur op vele verschillende manieren. Hoewel je het gebruik van resources kunt zien via een webportaal, is het beperkt. Maar door een paar PowerShell-cmdlets te gebruiken, kun je een handig rapport opbouwen om een overzicht te krijgen van het soort gebruik (en dus kosten) waaraan je Azure-resources bijdragen.

Dit artikel is gemaakt op basis van een TechSnips YouTube-video. Als je meer visueel bent ingesteld, bekijk dan gerust de video. Anders, lees verder!

Het downloaden van rapporten via het Azure-accountcentrum

Je kunt veel verschillende gebruiksrapporten downloaden vanuit het Azure Account Center. Het Azure Account Center is een webportaal waarmee je je factureringscyclusgeschiedenis kunt bekijken, facturen kunt downloaden en het overzicht van je Azure-abonnement kunt zien.

Hoewel je Azure gebruiksrapporten kunt downloaden via het Azure Account Center, is er geen flexibiliteit in het kiezen van een datumbereik. Je kunt het gebruik niet beperken tot een datumbereik omdat de datums vastliggen om samen te vallen met je factureringscyclus.

Hieronder zie je een voorbeeld van een factureringsperiode en links om gebruiksrapporten te downloaden.

Azure Account Center usage reports

In deze gebruiksrapporten staat veel andere informatie die je misschien niet nodig hebt.

Misschien heb je gebruiksrapporten nodig voor de laatste 60 dagen. Om deze informatie te krijgen via het Azure Account Center, moet je gebruiksrapporten downloaden voor minstens drie factureringscycli om al je vereiste datums te dekken.

Nadat de rapporten zijn gedownload, moet je vervolgens de overtollige gegevens verwijderen. Je moet dan een manier bedenken om die gegevens op de een of andere manier te consolideren. Nee bedankt! Dat is te veel overhead.

Met PowerShell kunt u een herbruikbaar script, functie of module bouwen om Azure-bronverbruiksrapporten op te halen. Deze kunnen op hun beurt handmatig worden uitgevoerd met een paar regels commando’s, of als een geplande taak om de uitvoering te automatiseren.

Vereisten

Dit is een stapsgewijze handleiding. Om mee te doen, moet je een paar dingen op hun plaats hebben.

Hoe krijg je gegevens over het gebruik van resources

Voor het maken van het script, laten we eerst de basisprincipes bespreken met behulp van de Get-UsageAggregates cmdlet. Dit is een cmdlet waarmee u Azure-bronverbruik per datumreeks, metrische gegevens zoals uur- of daggegevens en meer kunt ophalen. De Get-UsageAggregates cmdlet is de belangrijkste cmdlet die het grootste deel van de magie uitvoert die u in dit artikel zult leren.

Om de Get-UsageAggregates cmdlet te demonstreren, laten we zeggen dat u Azure-bronverbruik van 1 april 2019 tot 12 september 2019 moet vinden. Dezelfde techniek kan worden gebruikt voor elke datumreeks. Hieronder ziet u een voorbeeld om gebruik te maken van die data’s.

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

(Maand Dag Jaar)

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

(Maand Dag Jaar)

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

Als er gegevens worden geretourneerd, zou u resultaten moeten krijgen die vergelijkbaar zijn met de onderstaande screenshot. U kunt zien dat de werkelijke gebruikte gegevens zijn opgeslagen in de UsageAggregations eigenschap.

Raw UsageAggregations output properties

Omgaan met Paging in Get-UsageAggregates

In de bovenstaande sectie zou het gebruikelijk zijn dat de opdracht vele duizenden objecten retourneert, vooral voor lange datumreeksen. Om de API niet te overbelasten, retourneert de Get-UsageAggregates opdracht slechts een maximum van 1000 resultaten. Als u de $usageData variabele zoals beschreven in de vorige sectie heeft opgeslagen, kunt u dit bevestigen door deze opdracht uit te voeren $usageData.UsageAggregations.count.

Wat als er meer dan 1000 resultaten zijn? Je zult een beetje meer werk moeten doen.

Wanneer je de eigenschappen bekijkt die worden geretourneerd door Get-UsageAggregates, zul je een eigenschap genaamd ContinuationToken opmerken zoals hieronder getoond. Je ziet dat deze token een lange reeks karakters is.

Usage aggregates continuation token

De ContinuationToken is een verwijzer naar de volgende reeks resultaten. Deze eigenschap fungeert als een bladwijzer om te weten vanaf welke pagina de volgende batch resultaten moet worden opgehaald.

Om dit te demonstreren, haal je het laatste item uit het vorige resultaat op met $usageData.UsageAggregations[-1] zoals hieronder getoond. Let op de tijden van Usage Start en Usage End.

First usage object

Geef nu dezelfde parameters door aan de opdracht Get-UsageAggregates. Maar gebruik deze keer de parameter ContinuationToken en gebruik de waarde van de eerder geretourneerde eigenschap ContinuationToken. Hieronder zie je een voorbeeld van hoe je dit kunt doen.

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

Haal nu het laatste item op in de array van de eigenschap UsageAggregations met $usageData.UsageAggregations[-1]. Vergelijk het met het vorige resultaat om te bevestigen dat de nieuwe resultaten verschillend zijn.

De vergelijking moet vergelijkbaar zijn met degene die je hieronder ziet. Let op dat de datums zeven dagen uit elkaar liggen. Door de ContinuationToken te gebruiken, heb je de tweede pagina met resultaten opgehaald.

Second page of usage reports
First page of usage reports

Het bouwen van een Azure Resource Usage Reporting Functie

Je moet weten hoe paginering werkt en hoe je de eigenschap en parameter ContinuationToken gebruikt. Maar wat als er tientallen of zelfs honderdduizenden resultaten zijn om op te halen? Handmatig de token op deze manier gebruiken werkt niet zo goed.

Laten we een PowerShell-script bouwen dat deze paginabehoefte voor ons afhandelt en ons wat verdere flexibiliteit biedt. Dit script stelt je in staat om je eigen parameters op te geven en de paginabehoefte te beheren. Het geeft je ook de flexibiliteit om het in de toekomst uit te breiden om andere taken uit te voeren indien nodig.

Opbouwen van de Parameters

Bouw eerst wat functioneel skelet. Hieronder zie je een voorbeeldfunctie genaamd Get-AzureUsage. Deze functie heeft drie parameters die er bekend uit kunnen zien.

Deze parameters werden eerder gedefinieerd op de cmdlet Get-UsageAggregates zelf. Je bouwt nu een “wrapper” functie die waarden naar deze cmdlet zal doorgeven.

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

Hieronder staat een tabel met verdere informatie over al deze parameters.

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.

Queryen van Resourcegebruik

Als de functie is gemaakt en alle parameters zijn gedefinieerd, is het tijd om de rest van de functie in te vullen.

Je kunt hieronder de rest van de functie Get-AzureUsage zien. Neem zeker een kijkje naar de opmerkingen voor een dieper begrip van wat de code doet.

Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    ## Start de do/while-lus om automatisch de voortzettingscode te verwerken
    do {    
        ## Definieer alle parameters om door te geven aan Get-UsageAggregates
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        ## Gebruik de ContinuationToken-parameter alleen als dit niet de eerste keer is
        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)
}

Het Voltooide Script (Kopieerbaar)

Na het samenvoegen van de parameters en functionele code, krijg je een voltooid script zoals je hieronder kunt zien. Je kunt dit nu kopiëren naar je eigen script of rechtstreeks in de PowerShell-console plakken voor testdoeleinden.

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

Opvragen van Resourcegebruik met Onze Functie

Het is nu tijd om de functie te testen. Plak de code hierboven in een script en dot source het in je huidige PowerShell-sessie of kopieer de code rechtstreeks naar je PowerShell-sessie.

Tip: Als je PowerShell ISE of Visual Studio Code gebruikt, kun je de code die je wilt importeren markeren en op F8 drukken. Anders is het gemakkelijker om de code te kopiëren en te plakken in een PowerShell-sessie.

Voer nu de functie uit met een waarde voor FromTime, ToTime en het interval waarin je de resultaten wilt zien. Hieronder zie je een voorbeeld van hoe je deze functie kunt aanroepen.

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

Zodra dit wordt uitgevoerd, ziet u enkele uitgebreide berichten als u ervoor hebt gekozen om de optionele Verbose-parameter te gebruiken. Zoals u kunt zien in het onderstaande voorbeeld, is het gebruikstellingstellingstellingstellingstellingstellingen 4.659. U zult ook opmerken dat de functie de Get-UsageAggregates-functie vier keer heeft uitgevoerd om telkens de volgende pagina met resultaten op te halen. De functie kon dit doen omdat het de juiste ContinuationToken w waarde gebruikte voor elke oproep.

Automatically handling the continuation token

Het rapport filteren

Op dit punt bevat het rapport alle gebruiksgegevens over alle beschikbare resourcetypen. Maar u kunt het rapport filteren om alleen de resource weer te geven die u wilt. Dit kunt u doen door ofwel de functie uit te breiden om deze functionaliteit toe te staan, of de uitvoer door te leiden naar andere PowerShell-cmdlets.

De uitvoer van de Get-Azure-functie retourneert alle soorten resources, maar bevat een eigenschap genaamd MeterCategory. Deze eigenschap definieert het type resource dat de rij vertegenwoordigt. Bijvoorbeeld, om alleen Azure Virtual Machine-gebruiksrapporten te krijgen, kunt u alle objecten met een MeterCategory van Virtual Machines groeperen met behulp van de Group-Object-cmdlet.

De Group-Object-cmdlet geeft terug hoeveel rijen aanwezig waren in de uitvoer als de eigenschap Count. Vervolgens, door de uitvoer te beperken tot alleen de eigenschap Count en Name (waarde voor MeterCategory), kunt u zien hoeveel gebruiksrapportrijen er zijn voor alle Azure-resourcetypen.

Zoals je kunt zien in de onderstaande schermafbeelding, zijn er 768 vermeldingen voor Virtual Machines in het rapport.

Azure Virtual Machines resource usage

Om dit filterconcept een stap verder te brengen, kun je ook gebruikmaken van berekende eigenschappen om een vriendelijkere uitvoer te creëren, zoals hieronder wordt getoond.

$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

Wanneer je de bovenstaande codefragment uitvoert, zou je een uitvoer moeten zien die vergelijkbaar is met wat je hieronder ziet.

Advanced filtering for Get-AzureUsage

Ideeën voor het uitbreiden van het rapport

Met de code in dit artikel kun je de functionaliteit van de zojuist gecreëerde tool op vele verschillende manieren uitbreiden.

Je kunt de uitvoer bijvoorbeeld exporteren naar een CSV-bestand en je gegevens in Excel manipuleren of een HTML-rapport maken met behulp van ConvertTo-HTML of de EnhancedHTML2 PowerShell-module.

Ga nog een stap verder en voeg ook een e-mailmelding toe aan het resultaat met de Send-MailMessage cmdlet. De wereld ligt aan je voeten!

Samenvatting

In deze post heb je geleerd hoe je rapporten over het gebruik van resources uit Azure kunt halen. Je hebt ook geleerd hoe je een aangepaste PowerShell-functie kunt bouwen om het proces te automatiseren en die functie kunt gebruiken om de uitvoer te manipuleren.

De volgende keer dat je wordt verrast door een onverwachte Azure-rekening, heb je geen excuus meer! Bouw zelf een PowerShell-functie om op elk moment Azure-brongebruik op te vragen en zo een oogje te houden op die rekening.

Verder lezen

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