Azure Reserved Instances Geconfigureerd Voor Kostenoptimalisatie

💼 Management Samenvatting

Azure Reserved Instances vormen een krachtige kostenoptimalisatiestrategie voor organisaties met voorspelbare workloads en langdurige resourcebehoeften. Door vooraf te betalen voor Azure-resources kunnen organisaties aanzienlijke kostenbesparingen realiseren, variërend van 30 tot 72 procent ten opzichte van betalen-naar-gebruik-tarieven. Zonder een gestructureerde aanpak voor Reserved Instances missen organisaties belangrijke mogelijkheden om cloudkosten te optimaliseren en financiële efficiëntie te verbeteren.

Aanbeveling
IMPLEMENTEER AZURE RESERVED INSTANCES VOOR VOORSPELBARE WORKLOADS MET CONTINUE RUNTIME OM KOSTEN TE OPTIMALISEREN EN KOSTENBESPARINGEN TE REALISEREN VAN 30 TOT 72 PROCENT.
Risico zonder
Low
Risk Score
3/10
Implementatie
12u (tech: 8u)
Van toepassing op:
Azure

Voor Nederlandse overheidsorganisaties en andere gereguleerde sectoren is kostenoptimalisatie in de cloud een kritieke governancefunctie. Cloudomgevingen genereren continue kosten voor compute, storage, netwerk en andere services, waarbij betalen-naar-gebruik-tarieven kunnen leiden tot aanzienlijke uitgaven wanneer resources langdurig worden gebruikt. Azure Reserved Instances bieden een mechanisme om deze kosten te reduceren door vooraf te betalen voor een- of driejarige reserveringen, wat resulteert in aanzienlijke kortingen op de reguliere tarieven. Deze kortingen variëren per resourcetype, waarbij compute-resources zoals virtuele machines doorgaans de hoogste kortingen bieden, gevolgd door storage- en netwerkservices. Voor organisaties met stabiele, voorspelbare workloads die langdurig resources nodig hebben, kunnen Reserved Instances leiden tot kostenbesparingen van honderdduizenden euro's per jaar, wat essentieel is voor het realiseren van financiële efficiëntie en het optimaliseren van cloudbudgetten. Het ontbreken van een gestructureerde aanpak voor Reserved Instances betekent dat organisaties betalen-naar-gebruik-tarieven blijven betalen, zelfs voor resources die continu draaien en waarvan bekend is dat ze langdurig nodig zijn. Dit leidt tot onnodige kosten die hadden kunnen worden voorkomen door strategische reserveringen, wat impact heeft op de totale kosten van cloudoperaties en de financiële verantwoording richting bestuurders en stakeholders.

PowerShell Modules Vereist
Primary API: Azure API
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Billing, Az.Reservations

Implementatie

Dit artikel beschrijft hoe organisaties Azure Reserved Instances kunnen implementeren als onderdeel van een effectieve kostenoptimalisatiestrategie. We gaan in op het identificeren van workloads die geschikt zijn voor reserveringen, het analyseren van resourcegebruik om de juiste reserveringen te selecteren, het configureren van Reserved Instances voor verschillende resourcetypen zoals virtuele machines, SQL-databases en storage-accounts, en het beheren van reserveringen gedurende hun levenscyclus. Daarbij wordt uitgelegd hoe u workloads analyseert op basis van gebruikspatronen, voorspelbaarheid en verwachte duur, hoe u de juiste reserveringstypen selecteert zoals Standard of Compute Optimized, en hoe u reserveringen configureert met de juiste scope zoals shared of single subscription. Tot slot laten we zien hoe een ondersteunend PowerShell-script, reserved-instances.ps1, kan worden gebruikt om reserveringen te analyseren, te configureren en te monitoren voor optimale kostenbesparingen.

Reserved Instances strategie en planning

Een effectieve implementatie van Azure Reserved Instances begint met een grondige analyse van de huidige cloudworkloads en resourcegebruik. Voor Nederlandse overheidsorganisaties betekent dit dat reserveringen moeten worden afgestemd op de werkelijke behoeften, voorspelbare gebruikspatronen en langetermijnstrategieën voor cloudadoptie. De eerste stap is het identificeren van workloads die geschikt zijn voor reserveringen. Workloads die continu draaien, zoals productieservers, databases en applicaties die 24/7 beschikbaar moeten zijn, zijn ideale kandidaten voor Reserved Instances. Daarentegen zijn workloads met variabel gebruik, zoals development- en testomgevingen die alleen tijdens kantooruren draaien, minder geschikt voor reserveringen en kunnen beter worden geoptimaliseerd via andere strategieën zoals Azure Spot Virtual Machines of automatisch schalen. Bij het analyseren van workloads voor reserveringen is het belangrijk om verschillende factoren te overwegen. De eerste factor is de voorspelbaarheid van het gebruik. Workloads met stabiel, voorspelbaar gebruik gedurende langere perioden zijn beter geschikt voor reserveringen dan workloads met variabel of onvoorspelbaar gebruik. De tweede factor is de verwachte duur van het gebruik. Workloads die naar verwachting minimaal één tot drie jaar nodig zijn, zijn geschikt voor reserveringen, terwijl kortlopende projecten of experimentele workloads beter kunnen worden geoptimaliseerd via betalen-naar-gebruik-tarieven. De derde factor is de resourcegrootte en het type. Azure Reserved Instances zijn beschikbaar voor verschillende resourcetypen zoals virtuele machines, SQL-databases, Cosmos DB, Storage-accounts en andere services, waarbij elke resourcetype zijn eigen kortingspercentages en configuratieopties heeft. Een ander essentieel aspect van strategie en planning is het bepalen van de juiste reserveringsscope. Azure ondersteunt drie scope-opties: shared scope, single subscription scope en single resource group scope. Shared scope maakt reserveringen beschikbaar voor alle abonnementen binnen een factureringsaccount, wat handig is voor organisaties met meerdere abonnementen die flexibiliteit willen in het toepassen van reserveringen. Single subscription scope beperkt reserveringen tot een specifiek abonnement, wat waardevol is wanneer reserveringen moeten worden gekoppeld aan specifieke projecten of businessunits. Single resource group scope is de meest beperkte optie en is geschikt voor zeer specifieke use cases. De keuze voor scope heeft impact op de flexibiliteit en de manier waarop reserveringen worden toegepast op resources, wat belangrijk is om te overwegen bij het plannen van reserveringen.

Voor organisaties die moeten voldoen aan de Nederlandse Baseline voor Veilige Cloud en andere governance-frameworks, is het belangrijk om reserveringen te koppelen aan financiële governance-processen en verantwoordingslijnen. Dit betekent dat reserveringsbeslissingen moeten worden gedocumenteerd in financiële governance-documenten, dat reserveringen moeten worden geïntegreerd in budgetplanning en kostenbeheerprocessen, en dat de kostenbesparingen van reserveringen moeten worden gemonitord en gerapporteerd aan bestuurders en stakeholders. Door reserveringen expliciet te koppelen aan governance-processen ontstaat een samenhangend raamwerk voor kostenoptimalisatie dat zowel technische als organisatorische aspecten omvat.

Analyse en selectie van Reserved Instances

Het identificeren van de juiste workloads en resources voor Azure Reserved Instances vereist een systematische aanpak waarbij gebruikspatronen worden geanalyseerd, kostenbesparingen worden berekend en reserveringsaanbevelingen worden gegenereerd. Azure Cost Management biedt verschillende tools en rapporten die organisaties kunnen helpen bij het identificeren van reserveringskansen, waaronder de Reserved Instance Recommendations die automatisch workloads analyseert en aanbevelingen doet op basis van historisch gebruik. Deze aanbevelingen tonen welke resources geschikt zijn voor reserveringen, wat de verwachte kostenbesparingen zijn, en welke reserveringstypen het meest geschikt zijn voor specifieke workloads. Bij het analyseren van workloads voor reserveringen is het belangrijk om verschillende metriek te overwegen. De eerste metriek is de gemiddelde maandelijkse kosten voor specifieke resources, waarbij resources met hoge, consistente kosten prioriteit krijgen voor reserveringen. De tweede metriek is de runtime-percentage, waarbij resources die meer dan 80 procent van de tijd draaien ideale kandidaten zijn voor reserveringen. De derde metriek is de resourcegrootte en het type, waarbij standaard compute-resources zoals D-series virtuele machines doorgaans de hoogste kortingen bieden. Daarnaast is het belangrijk om te analyseren of resources kunnen worden geconsolideerd of gereconfigureerd om beter te profiteren van reserveringen, bijvoorbeeld door kleinere resources te combineren tot grotere resources die geschikt zijn voor reserveringen.

Voor geavanceerde scenario's kunnen organisaties gebruik maken van Azure Cost Management API's en PowerShell-scripts om gedetailleerde analyses uit te voeren van resourcegebruik en reserveringskansen. Het ondersteunende PowerShell-script reserved-instances.ps1 in deze baseline is ontworpen om deze analyses te faciliteren. Het script kan worden gebruikt om workloads te analyseren op basis van gebruikspatronen, kostenbesparingen te berekenen voor verschillende reserveringsopties, en aanbevelingen te genereren voor optimale reserveringsconfiguraties. Door het script te integreren in bestaande kostenbeheer- en governance-processen kunnen organisaties systematisch reserveringskansen identificeren en prioriteren op basis van kostenbesparingspotentieel en organisatiebehoeften.

Gebruik PowerShell-script reserved-instances.ps1 (functie Invoke-ReservationAnalysis) – Analyseert Azure-workloads en genereert aanbevelingen voor Reserved Instances op basis van gebruikspatronen en kostenbesparingspotentieel..

Na het identificeren van reserveringskansen is het belangrijk om de juiste reserveringstypen te selecteren. Azure biedt verschillende reserveringstypen zoals Standard Reserved Instances voor algemene workloads, Compute Optimized Reserved Instances voor compute-intensieve workloads, en specifieke reserveringen voor services zoals SQL-databases en Cosmos DB. Elke reserveringstype heeft zijn eigen kortingspercentages en configuratieopties, waarbij het belangrijk is om de juiste keuze te maken op basis van de specifieke workloadvereisten en kostenbesparingsdoelstellingen. Daarnaast is het belangrijk om te overwegen of flexibele reserveringen, die toestaan dat reserveringen worden toegepast op verschillende resourcegroottes binnen dezelfde familie, geschikt zijn voor workloads met variabele resourcebehoeften.

Configuratie en aankoop van Reserved Instances

De implementatie van Azure Reserved Instances begint met het selecteren van de juiste reserveringsopties via de Azure Portal of via programmatische interfaces. Via de Azure Portal kunnen beheerders navigeren naar Reservations, waar zij toegang hebben tot de Reserved Instance Marketplace en aanbevelingen. Hier kunnen nieuwe reserveringen worden gekocht door het selecteren van het resourcetype, de regio, de grootte, de termijn en de betalingsopties. Het is belangrijk om te realiseren dat reserveringen kunnen worden gekocht voor verschillende termijnen, zoals één jaar of drie jaar, waarbij langere termijnen doorgaans hogere kortingen bieden maar ook meer commitment vereisen. Bij het configureren van reserveringen is het essentieel om de juiste scope te selecteren. Shared scope maakt reserveringen beschikbaar voor alle abonnementen binnen een factureringsaccount, wat handig is voor organisaties met meerdere abonnementen die flexibiliteit willen in het toepassen van reserveringen. Single subscription scope beperkt reserveringen tot een specifiek abonnement, wat waardevol is wanneer reserveringen moeten worden gekoppeld aan specifieke projecten of businessunits. De keuze voor scope heeft impact op de flexibiliteit en de manier waarop reserveringen worden toegepast op resources, wat belangrijk is om te overwegen bij het configureren van reserveringen.

Voor geavanceerde scenario's kunnen reserveringen worden gekocht via Azure Resource Manager-templates of via PowerShell-scripts, wat het mogelijk maakt om reserveringen programmatisch te beheren en te integreren in bestaande automatisering en governance-processen. Het ondersteunende PowerShell-script reserved-instances.ps1 in deze baseline is ontworpen om deze automatisering te faciliteren. Het script kan worden gebruikt om reserveringen te analyseren, aanbevelingen te genereren, en reserveringen te configureren op basis van geanalyseerde workloads en organisatiestandaarden. Door het script te integreren in Azure Automation of CI/CD-pijplijnen kunnen organisaties ervoor zorgen dat reserveringsbeslissingen consistent worden genomen en dat reserveringen optimaal worden geconfigureerd voor kostenbesparingen.

Gebruik PowerShell-script reserved-instances.ps1 (functie Invoke-ReservationPurchase) – Configureert en koopt Azure Reserved Instances op basis van aanbevelingen en organisatiestandaarden..

Na het kopen van reserveringen is het belangrijk om te valideren dat reserveringen correct worden toegepast op resources en dat de verwachte kostenbesparingen worden gerealiseerd. Dit kan worden gedaan door periodiek te controleren of resources gebruik maken van reserveringen, door kostenbesparingen te monitoren via Azure Cost Management-rapporten, en door reserveringen te optimaliseren wanneer workloads of resourcebehoeften veranderen. Het is aan te raden om reserveringen minimaal kwartaal te reviewen en bij te werken op basis van nieuwe workloads, gewijzigde gebruikspatronen en veranderende organisatiebehoeften.

Beheer en optimalisatie van Reserved Instances

Effectief beheer van Azure Reserved Instances is essentieel om te waarborgen dat reserveringen optimaal worden benut en dat kostenbesparingen worden gerealiseerd gedurende de volledige levenscyclus van reserveringen. Zodra reserveringen zijn gekocht, moeten organisaties processen implementeren voor het monitoren van reserveringsgebruik, het optimaliseren van reserveringstoepassingen, en het beheren van reserveringswijzigingen zoals exchanges en refunds. Azure Cost Management biedt verschillende tools en rapporten die organisaties kunnen helpen bij het beheren van reserveringen, waaronder overzichten die laten zien welke resources gebruik maken van reserveringen, wat de realisatie van kostenbesparingen is, en waar mogelijkheden zijn voor verdere optimalisatie. Voor organisaties die moeten voldoen aan financiële governance-vereisten en verantwoordingsprocessen, is het belangrijk om reserveringsbeheer te integreren in bestaande rapportagelijnen. Dit kan betekenen dat reserveringsgegevens worden geëxporteerd naar financiële systemen, dat periodieke reserveringsrapportages worden gegenereerd voor bestuurders en stakeholders, en dat reserveringsprestaties worden besproken in governance-overleggen zoals Cloud Risk Boards of Financiële Commissies. Door reserveringsbeheer te koppelen aan formele verantwoordingsprocessen ontstaat een samenhangend raamwerk voor kostenoptimalisatie dat zowel technische als organisatorische aspecten omvat.

Gebruik PowerShell-script reserved-instances.ps1 (functie Invoke-Monitoring) – Monitort Azure Reserved Instances en genereert rapportages over reserveringsgebruik, kostenbesparingen en optimalisatiekansen..

Naast het monitoren van reserveringsgebruik moeten organisaties regelmatig evalueren of reserveringen nog steeds optimaal zijn geconfigureerd voor huidige workloads en resourcebehoeften. Dit omvat het analyseren van reserveringsbenutting, het identificeren van onderbenutte reserveringen, en het overwegen van exchanges of refunds wanneer reserveringen niet langer geschikt zijn voor huidige behoeften. Azure biedt flexibiliteit voor het wijzigen van reserveringen, waarbij organisaties reserveringen kunnen ruilen voor andere reserveringen of kunnen terugvorderen wanneer reserveringen niet langer nodig zijn, hoewel dit mogelijk kosten met zich meebrengt afhankelijk van de reserveringstermijn en de timing van wijzigingen.

Compliance, governance en financiële verantwoording

Azure Reserved Instances spelen een centrale rol in de manier waarop organisaties kostenoptimalisatie realiseren en verantwoording afleggen over hun cloudkostenbeheer. Voor Nederlandse overheidsorganisaties sluit dit nauw aan bij de principes van financiële governance, transparantie en verantwoordelijkheid die zijn verankerd in interne beleidsdocumenten en externe verantwoordingsvereisten. Een goed opgezet reserveringsraamwerk maakt het mogelijk om in audits en verantwoordingsprocessen direct inzicht te geven in de manier waarop cloudkosten worden geoptimaliseerd, welke reserveringen zijn geïmplementeerd, en hoe kostenbesparingen worden gerealiseerd en gerapporteerd. In de praktijk worden Azure Reserved Instances vaak gekoppeld aan formele financiële controles en governance-processen. Door reserveringen expliciet te koppelen aan financiële governance-documenten, verantwoordingsprocessen en interne controles, ontstaat een helder spoor tussen technische kostenoptimalisatie en organisatorische governance. Auditors en controllers kunnen dan niet alleen beoordelen of reserveringen zijn geïmplementeerd, maar ook of de organisatie structureel in control is met betrekking tot kostenoptimalisatie en of reserveringen effectief bijdragen aan kostenbesparingen. Voor organisaties die moeten voldoen aan de Nederlandse Baseline voor Veilige Cloud en andere governance-frameworks, is het belangrijk om reserveringen te documenteren in financiële governance-documenten, reserveringsbeslissingen te integreren in bestaande rapportage- en escalatieprocessen, en reserveringsprestaties te behandelen volgens interne procedures voor financiële goedkeuring en risicomanagement. Door reserveringen expliciet te koppelen aan governance-processen ontstaat een samenhangend raamwerk voor kostenoptimalisatie dat zowel technische als organisatorische aspecten omvat en dat aantoonbaar voldoet aan financiële governance-vereisten.

Monitoring

Gebruik PowerShell-script reserved-instances.ps1 (functie Invoke-Monitoring) – Monitort Azure Reserved Instances en valideert dat reserveringen correct zijn geconfigureerd en optimaal worden benut..

Effectieve monitoring van Azure Reserved Instances is essentieel om te waarborgen dat reserveringen optimaal worden benut en dat kostenbesparingen worden gerealiseerd. Monitoring omvat het continu volgen van reserveringsgebruik, het valideren dat reserveringen correct worden toegepast op resources, het controleren of kostenbesparingen worden gerealiseerd zoals verwacht, en het identificeren van mogelijkheden voor verdere optimalisatie. De basis van monitoring wordt gevormd door regelmatige verificatie van reserveringsconfiguraties via de Azure Portal of via PowerShell-scripts. Beheerders moeten maandelijks controleren of reserveringen correct zijn geconfigureerd, of reserveringen worden toegepast op de juiste resources, en of kostenbesparingen worden gerealiseerd zoals verwacht. Deze verificatie kan worden geautomatiseerd via PowerShell-scripts die reserveringsconfiguraties controleren en waarschuwingen genereren wanneer problemen worden gedetecteerd, zoals onderbenutte reserveringen of resources die niet gebruik maken van beschikbare reserveringen. Naast het controleren van reserveringsconfiguraties moeten organisaties regelmatig valideren dat kostenbesparingen daadwerkelijk worden gerealiseerd. Dit kan worden gedaan door kostenbesparingsrapporten te analyseren, door reserveringsbenutting te monitoren, en door te vergelijken of werkelijke kostenbesparingen overeenkomen met verwachte kostenbesparingen. Als kostenbesparingen lager zijn dan verwacht, kan dit wijzen op problemen met reserveringstoepassingen of op veranderende gebruikspatronen die reserveringsoptimalisatie vereisen. Voor organisaties die moeten voldoen aan financiële governance-vereisten, is het belangrijk om reserveringsmonitoring te integreren in bestaande rapportage- en verantwoordingsprocessen. Dit omvat het genereren van periodieke reserveringsrapportages voor bestuurders en stakeholders, het documenteren van reserveringsprestaties in financiële governance-documenten, en het bespreken van reserveringsoptimalisatie in governance-overleggen. Door deze monitoring en rapportage regelmatig uit te voeren kunnen organisaties ervoor zorgen dat reserveringen effectief bijdragen aan kostenoptimalisatie en dat reserveringsprestaties transparant zijn voor bestuurders en stakeholders.

Remediatie

Gebruik PowerShell-script reserved-instances.ps1 (functie Invoke-Remediation) – Analyseert workloads en configureert Azure Reserved Instances wanneer reserveringskansen worden geïdentificeerd..

Remediatie van Azure Reserved Instances omvat het identificeren van reserveringskansen, het analyseren van workloads op geschiktheid voor reserveringen, en het configureren van reserveringen wanneer deze ontbreken of suboptimaal zijn geconfigureerd. Het is belangrijk om te realiseren dat wanneer reserveringen niet zijn geïmplementeerd voor geschikte workloads, organisaties betalen-naar-gebruik-tarieven blijven betalen, zelfs voor resources die continu draaien en waarvan bekend is dat ze langdurig nodig zijn. Daarom moeten organisaties processen implementeren voor het systematisch identificeren en benutten van reserveringskansen. Wanneer reserveringskansen worden geïdentificeerd, kunnen reserveringen worden gekocht via de Azure Portal of via PowerShell-scripts. Het is aan te raden om reserveringen te baseren op gedetailleerde analyses van workloadgebruik, waarbij workloads worden geëvalueerd op basis van gebruikspatronen, voorspelbaarheid en verwachte duur. Na het kopen van reserveringen is het essentieel om te valideren dat reserveringen correct worden toegepast op resources en dat kostenbesparingen worden gerealiseerd zoals verwacht. Voor organisaties die moeten voldoen aan financiële governance-vereisten, is het belangrijk om reserveringsbeslissingen te documenteren in financiële governance-documenten en om reserveringen te koppelen aan bestaande verantwoordingsprocessen. Door deze documentatie en koppeling te implementeren kunnen organisaties aantonen dat zij structureel in control zijn met betrekking tot kostenoptimalisatie en dat reserveringen effectief bijdragen aan kostenbesparingen en financiële efficiëntie.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# .SYNOPSIS Azure Reserved Instances geconfigureerd voor kostenoptimalisatie .DESCRIPTION Dit script analyseert Azure-workloads op geschiktheid voor Reserved Instances, genereert aanbevelingen voor reserveringen, en monitort reserveringsgebruik en kostenbesparingen. Het script ondersteunt: - Analyse van workloads op geschiktheid voor reserveringen - Genereren van reserveringsaanbevelingen op basis van gebruikspatronen - Monitoring van reserveringsgebruik en kostenbesparingen - Validatie van reserveringsconfiguraties .NOTES Filename: reserved-instances.ps1 Author: Nederlandse Baseline voor Veilige Cloud Category: cost-management Related JSON: content/azure/cost-management/reserved-instances.json .EXAMPLE .\reserved-instances.ps1 -Monitoring Analyseert reserveringsgebruik en toont kostenbesparingen .EXAMPLE .\reserved-instances.ps1 -Remediation Genereert aanbevelingen voor nieuwe reserveringen .EXAMPLE .\reserved-instances.ps1 -Remediation -WhatIf Toont welke reserveringen zouden worden aanbevolen zonder wijzigingen door te voeren #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Billing, Az.Reservations, Az.Compute [CmdletBinding()] param( [Parameter(Mandatory = $false)] [switch]$Monitoring, [Parameter(Mandatory = $false)] [switch]$Remediation, [Parameter(Mandatory = $false)] [switch]$Revert, [Parameter(Mandatory = $false)] [switch]$WhatIf, [Parameter(Mandatory = $false)] [string]$SubscriptionId, [Parameter(Mandatory = $false)] [string]$ResourceGroupName, [Parameter(Mandatory = $false)] [string]$ReservationScope = "Shared", [Parameter(Mandatory = $false)] [int]$TermMonths = 12 ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure Reserved Instances" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Connect-RequiredServices { <# .SYNOPSIS Maakt verbinding met Azure-services #> try { if (-not (Get-AzContext)) { Write-Host "Verbinden met Azure..." -ForegroundColor Gray Connect-AzAccount -ErrorAction Stop | Out-Null } else { Write-Host "Al verbonden met Azure: $((Get-AzContext).Account.Id)" -ForegroundColor Gray } } catch { Write-Host "Fout bij verbinden met Azure: $_" -ForegroundColor Red throw } } function Get-VirtualMachineUsage { <# .SYNOPSIS Haalt gebruikspatronen op voor virtuele machines #> param( [string]$SubscriptionId ) try { $vms = Get-AzVM -ErrorAction SilentlyContinue $usageData = @() foreach ($vm in $vms) { # Haal metrische gegevens op voor runtime-analyse $metrics = Get-AzMetric -ResourceId $vm.Id -MetricName "Percentage CPU" -StartTime (Get-Date).AddDays(-30) -EndTime (Get-Date) -ErrorAction SilentlyContinue $avgCpu = 0 $dataPoints = 0 if ($metrics) { foreach ($metric in $metrics) { if ($metric.Data) { foreach ($data in $metric.Data) { if ($data.Average) { $avgCpu += $data.Average $dataPoints++ } } } } if ($dataPoints -gt 0) { $avgCpu = $avgCpu / $dataPoints } } # Bepaal runtime-percentage (aanname: als CPU > 0% dan draait VM) $runtimePercentage = if ($avgCpu -gt 0) { 100 } else { 0 } $usageData += [PSCustomObject]@{ ResourceId = $vm.Id ResourceName = $vm.Name ResourceGroup = $vm.ResourceGroupName VMSize = $vm.HardwareProfile.VmSize Location = $vm.Location RuntimePercentage = $runtimePercentage AvgCpu = [math]::Round($avgCpu, 2) SuitableForReservation = ($runtimePercentage -gt 80) } } return $usageData } catch { Write-Verbose "Kon VM-gebruik niet ophalen: $_" return @() } } function Get-CostData { <# .SYNOPSIS Haalt kosten gegevens op voor resources #> param( [string]$ScopeId, [int]$Months = 3 ) try { $endDate = Get-Date $startDate = $endDate.AddMonths(-$Months) $usage = Get-AzConsumptionUsageDetail -StartDate $startDate -EndDate $endDate -Scope $ScopeId -ErrorAction SilentlyContinue if ($usage) { $costByResource = $usage | Group-Object -Property InstanceId | ForEach-Object { $totalCost = ($_.Group | Measure-Object -Property PretaxCost -Sum).Sum $monthlyAverage = $totalCost / $Months [PSCustomObject]@{ ResourceId = $_.Name TotalCost = [math]::Round($totalCost, 2) MonthlyAverage = [math]::Round($monthlyAverage, 2) UsageCount = $_.Count } } return $costByResource } return @() } catch { Write-Verbose "Kon kosten gegevens niet ophalen: $_" return @() } } function Get-ReservationRecommendations { <# .SYNOPSIS Genereert aanbevelingen voor Reserved Instances #> param( [array]$UsageData, [array]$CostData ) $recommendations = @() # Combineer gebruik en kosten gegevens foreach ($usage in $UsageData) { if ($usage.SuitableForReservation) { $costInfo = $CostData | Where-Object { $_.ResourceId -like "*$($usage.ResourceName)*" } $monthlyCost = if ($costInfo) { $costInfo.MonthlyAverage } else { 0 } # Bereken geschatte kostenbesparing (aanname: 40% korting voor 1 jaar, 60% voor 3 jaar) $savingsPercentage = if ($TermMonths -eq 36) { 0.60 } else { 0.40 } $estimatedSavings = $monthlyCost * $savingsPercentage * $TermMonths if ($monthlyCost -gt 0) { $recommendations += [PSCustomObject]@{ ResourceId = $usage.ResourceId ResourceName = $usage.ResourceName ResourceGroup = $usage.ResourceGroup VMSize = $usage.VMSize Location = $usage.Location MonthlyCost = $monthlyCost RuntimePercentage = $usage.RuntimePercentage TermMonths = $TermMonths EstimatedSavings = [math]::Round($estimatedSavings, 2) Priority = if ($monthlyCost -gt 100) { "High" } elseif ($monthlyCost -gt 50) { "Medium" } else { "Low" } } } } } return $recommendations | Sort-Object -Property EstimatedSavings -Descending } function Get-ExistingReservations { <# .SYNOPSIS Haalt bestaande reserveringen op #> param( [string]$SubscriptionId ) try { $reservations = Get-AzReservation -ErrorAction SilentlyContinue $reservationData = @() foreach ($reservation in $reservations) { $reservationData += [PSCustomObject]@{ ReservationId = $reservation.Id ReservationName = $reservation.Name State = $reservation.Properties.ProvisioningState Term = $reservation.Properties.Term Scope = $reservation.Properties.Scope Quantity = $reservation.Properties.Quantity ReservedResourceType = $reservation.Properties.ReservedResourceType } } return $reservationData } catch { Write-Verbose "Kon reserveringen niet ophalen: $_" return @() } } function Invoke-ReservationAnalysis { <# .SYNOPSIS Analyseert workloads en genereert reserveringsaanbevelingen #> try { Connect-RequiredServices $subscriptions = if ($SubscriptionId) { Get-AzSubscription -SubscriptionId $SubscriptionId -ErrorAction Stop } else { Get-AzSubscription -ErrorAction Stop } $allRecommendations = @() foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction Stop | Out-Null Write-Host "Analyseren abonnement: $($sub.Name)" -ForegroundColor Cyan $scopeId = "/subscriptions/$($sub.Id)" # Haal gebruik en kosten gegevens op Write-Host " Gebruikspatronen analyseren..." -ForegroundColor Gray $usageData = Get-VirtualMachineUsage -SubscriptionId $sub.Id Write-Host " Kosten gegevens ophalen..." -ForegroundColor Gray $costData = Get-CostData -ScopeId $scopeId # Genereer aanbevelingen Write-Host " Aanbevelingen genereren..." -ForegroundColor Gray $recommendations = Get-ReservationRecommendations -UsageData $usageData -CostData $costData if ($recommendations.Count -gt 0) { Write-Host " [OK] $($recommendations.Count) aanbevelingen gegenereerd" -ForegroundColor Green $allRecommendations += $recommendations } else { Write-Host " [INFO] Geen geschikte workloads gevonden voor reserveringen" -ForegroundColor Yellow } } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Reserveringsaanbevelingen" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if ($allRecommendations.Count -gt 0) { Write-Host "`nTop 10 aanbevelingen (gesorteerd op kostenbesparing):" -ForegroundColor White $topRecommendations = $allRecommendations | Select-Object -First 10 $topRecommendations | Format-Table -AutoSize -Property ResourceName, VMSize, Location, MonthlyCost, RuntimePercentage, EstimatedSavings, Priority $totalSavings = ($allRecommendations | Measure-Object -Property EstimatedSavings -Sum).Sum Write-Host "`nTotale geschatte kostenbesparing: €$([math]::Round($totalSavings, 2))" -ForegroundColor Green Write-Host "Aantal aanbevelingen: $($allRecommendations.Count)" -ForegroundColor White } else { Write-Host "`n[INFO] Geen reserveringsaanbevelingen gevonden" -ForegroundColor Yellow } exit 0 } catch { Write-Host "`n[FAIL] ERROR: $_" -ForegroundColor Red Write-Host "Error Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Monitoring { <# .SYNOPSIS Monitort Azure Reserved Instances en valideert configuraties #> try { Connect-RequiredServices $subscriptions = if ($SubscriptionId) { Get-AzSubscription -SubscriptionId $SubscriptionId -ErrorAction Stop } else { Get-AzSubscription -ErrorAction Stop } $allReservations = @() $allUsage = @() foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction Stop | Out-Null Write-Host "Controleren abonnement: $($sub.Name)" -ForegroundColor Cyan # Haal bestaande reserveringen op $reservations = Get-ExistingReservations -SubscriptionId $sub.Id if ($reservations -and $reservations.Count -gt 0) { Write-Host " [OK] Reserveringen gevonden: $($reservations.Count)" -ForegroundColor Green foreach ($reservation in $reservations) { Write-Host " Reservering: $($reservation.ReservationName)" -ForegroundColor White Write-Host " Type: $($reservation.ReservedResourceType)" -ForegroundColor Gray Write-Host " Term: $($reservation.Term)" -ForegroundColor Gray Write-Host " Scope: $($reservation.Scope)" -ForegroundColor Gray Write-Host " Status: $($reservation.State)" -ForegroundColor $(if ($reservation.State -eq "Succeeded") { 'Green' } else { 'Yellow' }) $allReservations += [PSCustomObject]@{ SubscriptionId = $sub.Id SubscriptionName = $sub.Name ReservationName = $reservation.ReservationName ReservedResourceType = $reservation.ReservedResourceType Term = $reservation.Term Scope = $reservation.Scope State = $reservation.State Quantity = $reservation.Quantity } } } else { Write-Host " [INFO] Geen reserveringen gevonden voor dit abonnement" -ForegroundColor Yellow } # Analyseer VM-gebruik voor reserveringsbenutting Write-Host " VM-gebruik analyseren..." -ForegroundColor Gray $usageData = Get-VirtualMachineUsage -SubscriptionId $sub.Id if ($usageData) { $suitableVMs = $usageData | Where-Object { $_.SuitableForReservation } Write-Host " Geschikte VM's voor reserveringen: $($suitableVMs.Count)" -ForegroundColor $(if ($suitableVMs.Count -gt 0) { 'Yellow' } else { 'Green' }) $allUsage += $usageData } } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Monitoring Resultaten" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if ($allReservations.Count -gt 0) { Write-Host "`nGeconfigureerde reserveringen:" -ForegroundColor White $allReservations | Format-Table -AutoSize } $suitableVMs = $allUsage | Where-Object { $_.SuitableForReservation } if ($suitableVMs.Count -gt 0 -and $allReservations.Count -eq 0) { Write-Host "`n[WAARSCHUWING] $($suitableVMs.Count) VM's zijn geschikt voor reserveringen maar er zijn geen reserveringen geconfigureerd" -ForegroundColor Yellow Write-Host "Overweeg het uitvoeren van -Remediation voor reserveringsaanbevelingen" -ForegroundColor Yellow } if ($allReservations.Count -gt 0) { Write-Host "`n[OK] Reserveringen geconfigureerd en gemonitord" -ForegroundColor Green exit 0 } else { Write-Host "`n[INFO] Geen reserveringen gevonden" -ForegroundColor Yellow exit 0 } } catch { Write-Host "`n[FAIL] ERROR: $_" -ForegroundColor Red Write-Host "Error Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Remediation { <# .SYNOPSIS Genereert aanbevelingen voor nieuwe reserveringen #> try { Connect-RequiredServices Write-Host "Reserveringsaanbevelingen genereren..." -ForegroundColor Cyan Write-Host "LET OP: Dit script genereert alleen aanbevelingen. Reserveringen moeten handmatig worden gekocht via de Azure Portal." -ForegroundColor Yellow Write-Host "" # Gebruik de analyse functie $subscriptions = if ($SubscriptionId) { Get-AzSubscription -SubscriptionId $SubscriptionId -ErrorAction Stop } else { Get-AzSubscription -ErrorAction Stop } $allRecommendations = @() foreach ($sub in $subscriptions) { Set-AzContext -SubscriptionId $sub.Id -ErrorAction Stop | Out-Null Write-Host "Analyseren abonnement: $($sub.Name)" -ForegroundColor Cyan $scopeId = "/subscriptions/$($sub.Id)" $usageData = Get-VirtualMachineUsage -SubscriptionId $sub.Id $costData = Get-CostData -ScopeId $scopeId $recommendations = Get-ReservationRecommendations -UsageData $usageData -CostData $costData if ($recommendations) { $allRecommendations += $recommendations } } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Remediatie Aanbevelingen" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan if ($allRecommendations.Count -gt 0) { Write-Host "`nAanbevolen reserveringen:" -ForegroundColor White $highPriority = $allRecommendations | Where-Object { $_.Priority -eq "High" } if ($highPriority.Count -gt 0) { Write-Host "`nHoge prioriteit (maandelijkse kosten > €100):" -ForegroundColor Yellow $highPriority | Format-Table -AutoSize -Property ResourceName, VMSize, Location, MonthlyCost, EstimatedSavings } $mediumPriority = $allRecommendations | Where-Object { $_.Priority -eq "Medium" } if ($mediumPriority.Count -gt 0) { Write-Host "`nGemiddelde prioriteit (maandelijkse kosten €50-€100):" -ForegroundColor Yellow $mediumPriority | Format-Table -AutoSize -Property ResourceName, VMSize, Location, MonthlyCost, EstimatedSavings } $totalSavings = ($allRecommendations | Measure-Object -Property EstimatedSavings -Sum).Sum Write-Host "`nTotale geschatte kostenbesparing: €$([math]::Round($totalSavings, 2))" -ForegroundColor Green Write-Host "Aantal aanbevelingen: $($allRecommendations.Count)" -ForegroundColor White Write-Host "`nVolgende stappen:" -ForegroundColor Cyan Write-Host "1. Review de aanbevelingen hierboven" -ForegroundColor Gray Write-Host "2. Ga naar Azure Portal > Reservations > Purchase" -ForegroundColor Gray Write-Host "3. Selecteer de aanbevolen resourcetypen en configureer reserveringen" -ForegroundColor Gray Write-Host "4. Monitor reserveringsgebruik en kostenbesparingen na aankoop" -ForegroundColor Gray } else { Write-Host "`n[INFO] Geen reserveringsaanbevelingen gevonden" -ForegroundColor Yellow Write-Host "Dit kan betekenen dat:" -ForegroundColor Gray Write-Host "- Workloads niet geschikt zijn voor reserveringen (variabel gebruik)" -ForegroundColor Gray Write-Host "- Resources al gebruik maken van reserveringen" -ForegroundColor Gray Write-Host "- Onvoldoende historische gegevens beschikbaar zijn" -ForegroundColor Gray } exit 0 } catch { Write-Host "`n[FAIL] ERROR: $_" -ForegroundColor Red Write-Host "Error Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } try { if ($Revert) { Write-Host "Revert functionaliteit is niet beschikbaar voor Reserved Instances." -ForegroundColor Yellow Write-Host "Reserveringen kunnen worden geannuleerd of geruild via de Azure Portal." -ForegroundColor Gray } elseif ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { Write-Host "Gebruik:" -ForegroundColor Yellow Write-Host " -Monitoring Analyseer reserveringsgebruik en kostenbesparingen" -ForegroundColor Gray Write-Host " -Remediation Genereer aanbevelingen voor nieuwe reserveringen" -ForegroundColor Gray Write-Host "`nParameters:" -ForegroundColor Yellow Write-Host " -SubscriptionId Specifiek abonnement (optioneel)" -ForegroundColor Gray Write-Host " -ResourceGroupName Specifieke resourcegroep (optioneel)" -ForegroundColor Gray Write-Host " -ReservationScope Reserveringsscope: Shared, SingleSubscription (optioneel)" -ForegroundColor Gray Write-Host " -TermMonths Reserveringstermijn: 12 of 36 maanden (optioneel, default: 12)" -ForegroundColor Gray } } catch { throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
Low: Zonder Azure Reserved Instances betalen organisaties betalen-naar-gebruik-tarieven voor alle resources, zelfs voor workloads die continu draaien en langdurig nodig zijn. Dit leidt tot onnodige kosten die hadden kunnen worden voorkomen door strategische reserveringen, wat impact heeft op de totale kosten van cloudoperaties en financiële efficiëntie.

Management Samenvatting

Implementeer Azure Reserved Instances voor voorspelbare workloads met continue runtime. Analyseer workloads op geschiktheid voor reserveringen, koop reserveringen voor één of drie jaar, en monitor reserveringsgebruik en kostenbesparingen. Gebruik het PowerShell-script reserved-instances.ps1 om reserveringskansen te identificeren en reserveringen te configureren.