如何高效获取Azure各资源上月月度消费总额?
高效获取Azure资源月度聚合消费成本的方案
方法1:让Azure服务端直接聚合(最优)
使用Get-AzConsumptionUsageDetail的-GroupBy参数,指定按资源维度分组,让Azure在服务端完成聚合,直接返回每个资源的月度总成本,大幅减少返回的数据量和本地处理时间:
# 获取上月的计费周期格式(yyyyMM) $lastMonth = Get-Date (Get-Date).AddMonths(-1) -Format "yyyyMM" # 按ResourceId和ResourceName分组,聚合月度总成本 $aggregatedCosts = Get-AzConsumptionUsageDetail -BillingPeriod $lastMonth ` -GroupBy "ResourceId", "ResourceName" ` -Aggregation @{ Name = "PreTaxCost"; Function = "Sum" }
这个命令会直接返回每个资源的汇总成本,不需要本地处理10万条原始记录,运行时间会大幅缩短,也避免了遍历Get-AzResource的开销。
方法2:本地快速聚合原始数据(如果服务端聚合不适用)
如果因为权限或其他原因无法使用服务端聚合,可以先获取原始数据,然后用PowerShell的Group-Object结合计算属性快速本地聚合,比遍历Get-AzResource高效得多:
$lastMonth = Get-Date (Get-Date).AddMonths(-1) -Format "yyyyMM" $data = Get-AzConsumptionUsageDetail -BillingPeriod $lastMonth # 按ResourceId分组,计算每个资源的总成本 $resourceCosts = $data | Group-Object -Property ResourceId | ForEach-Object { [PSCustomObject]@{ ResourceId = $_.Name ResourceName = $_.Group[0].ResourceName TotalCost = ($_.Group | Measure-Object -Property PreTaxCost -Sum).Sum } }
这种方法不需要额外调用Get-AzResource,直接从原始账单数据中提取资源名称和计算成本,200个资源的处理时间会降到几秒内。
额外优化建议
- 避免单独调用
Get-AzResource遍历匹配:原始账单数据已经包含ResourceId和ResourceName,完全不需要再调用资源查询API,既节省时间又避免触发Azure API调用阈值。 - 按需筛选数据:如果只需要特定资源类型/区域的成本,可以在
Get-AzConsumptionUsageDetail中添加-Filter参数提前过滤,进一步减少返回数据量,例如:# 只筛选华东地区的虚拟机成本 $data = Get-AzConsumptionUsageDetail -BillingPeriod $lastMonth -Filter "Location eq 'eastasia' and ResourceType eq 'Microsoft.Compute/virtualMachines'"
内容的提问来源于stack exchange,提问作者Andrew Draper
相关产品推荐
相关产品推荐

