Get Azure Virtual Machine Inventory along last X days of CPU, Memory & Cost Data using Azure PowerShell

Taskal Samal
2 min readNov 23, 2021

$azureServicePrincipalId= “”

$azureServicePrincipalSecret=””

$tenandId=””

$dataForLastXDays = “”

$azureServicePrincipalSecretSecureString=ConvertTo-SecureString $azureServicePrincipalSecret -AsPlainText -Force -Verbose

$azureCredentail= New-Object System.Management.Automation.PSCredential ($azureServicePrincipalId, $azureServicePrincipalSecretSecureString)

Connect-AzAccount -ServicePrincipal -Tenant $tenandId -Credential $azureCredentail -verbose

$subscriptionList = Get-AzSubscription -TenantId $tenantid

“ResourceName, ResourceGroupName, location, PricingTier, ResourceCost , UsageMonth, ApplicationName, EnvironmentName, subscriptionName,DiskType,OsType,NumberOfCores,MemoryInMB,AverageCpuUtilization,AverageMemoryUtilization,ResourceId” | Out-File -FilePath “$env:HOMEPATH\Documents\AzureVirtualMachineCost.csv” -Append -Encoding utf8

foreach ($subscription in $subscriptionList) {

$SelectSubscription = Select-AzSubscription -Subscription $subscription

$subscriptionName = $SelectSubscription.Subscription.Name

$azureVirtualMachineList = Get-AzVM | Select-Object Name, ResourceGroupName, Location, id, @{“Name” = “Size”; Expression = { $_.HardwareProfile.VmSize } }, @{“Name” = “DiskType”; Expression = { $_.storageProfile.osDisk.managedDisk.storageAccountType } },@{“Name” = “OSType”; Expression = { $_.storageProfile.osDisk.osType } }, @{“Name” = “ApplicationName”; Expression = { $_.Tags.’APPLICATION NAME’ } }, @{“Name” = “EnvironmentName”; Expression = { $_.Tags.’ENVIRONMENT NAME’ } }

foreach ($azureVirtualMachine in $azureVirtualMachineList) {

$ResourceName = $azureVirtualMachine.Name

$ResourceGroupName = $azureVirtualMachine.ResourceGroupName

$location = $azureVirtualMachine.Location

$PricingTier = $azureVirtualMachine.Size

$ApplicationName = $azureVirtualMachine.ApplicationName

$EnvironmentName = $azureVirtualMachine.EnvironmentName

$DiskType = $azureVirtualMachine.DiskType

$OSType = $azureVirtualMachine.OSType

$ResourceId = $azureVirtualMachine.id

$GetVMSizeDetails = Get-AzVMSize -VMName $ResourceName -ResourceGroupName $ResourceGroupName | where { $_.Name -eq $PricingTier }

$NumberOfCores = $GetVMSizeDetails.NumberOfCores

$MemoryInMB = $GetVMSizeDetails.MemoryInMB

$days = “$dataForLastXDays”

$startDate = [datetime]::Today.AddDays($days)

$endDate = [datetime]::Today

$cpuUtilization_Average = 0.0

$cpuUtilization = Get-AzMetric -ResourceId $ResourceId -MetricName “Percentage CPU” -DetailedOutput -StartTime $startDate -EndTime $endDate -TimeGrain 12:00:00 -WarningAction SilentlyContinue

$cpuUtilization_Average = [System.Math]::Round($(($cpuUtilization.Data.Average | Measure-Object -Average).Average), 2)

$memoryUtilization_Average = 0.0

$memoryUtilization = Get-AzMetric -ResourceId $ResourceId -MetricName “Available Memory Bytes” -DetailedOutput -StartTime $startDate -EndTime $endDate -TimeGrain 12:00:00 -WarningAction SilentlyContinue

$memoryUtilization_Average = [System.Math]::Round($(($MemoryInMB — (($memoryUtilization.Data.Average | Measure-Object -Average).Average / 1MB)) / $MemoryInMB * 100), 2)

$month = “-1”

$UsageMonth = [datetime]::Today.AddMonths($month).ToString(‘MMM-yyyy’)

$CurrentBillPeriod = [datetime]::Today.AddMonths($month).ToString(‘yyyyMM’)

$ResourceUsage = Get-AzConsumptionUsageDetail -InstanceName $ResourceName -Expand MeterDetails -BillingPeriodName $CurrentBillPeriod

$ResourceCost = 0

foreach ($Usage in $ResourceUsage) {

$ResourceCost += $Usage.PretaxCost

}

Write-Host “$ResourceName, $ResourceGroupName, $location, $PricingTier, $ResourceCost , $UsageMonth, $ApplicationName,$EnvironmentName,$subscriptionName,$DiskType,$OSType,$NumberOfCores,$MemoryInMB,$cpuUtilization_Average,$memoryUtilization_Average,$ResourceId” -f Green

“$ResourceName, $ResourceGroupName, $location, $PricingTier, $ResourceCost , $UsageMonth, $ApplicationName,$EnvironmentName,$subscriptionName,$DiskType,$OSType,$NumberOfCores,$MemoryInMB,$cpuUtilization_Average,$memoryUtilization_Average,$ResourceId” | Out-File -FilePath “$env:HOMEPATH\Documents\AzureVirtualMachineCost.csv” -Append -Encoding utf8

}

}

--

--

Taskal Samal

A seasoned technical architect with proven track record of delivering innovative solutions for enterprise in digital ecosystem.