如何用Invoke-AzCostManagementQuery实现自定义时间范围Azure用量查询?
使用Invoke-AzCostManagementQuery查询自定义用量数据的问题解决
问题分析
你遇到的空值返回问题,核心源于时间范围计算错误和参数格式不匹配,加上Azure用量数据的同步延迟特性,共同导致了查询结果异常。以下是具体问题点和修正方案:
原代码的核心问题
- 上月日期计算逻辑错误:
原代码中$prev_month_same_day = (Get-Date).AddMonths(-1).AddDays(-1)会导致日期偏移错误,比如4月1日执行时,会得到2月28/29日,而非预期的3月1日。 - 时间参数格式不兼容:
Invoke-AzCostManagementQuery的-TimePeriodFrom和-TimePeriodTo要求传入ISO 8601格式的字符串(如2024-03-01T00:00:00Z),直接传入DateTime对象可能引发API解析异常。 - 忽略数据同步延迟:
Azure用量数据通常有24-48小时的同步延迟,月初查询当月数据返回空值属于正常现象,需等待数据同步完成。
修正后的代码
# 获取当前日期 $currentDate = Get-Date # 计算上月对应日期区间 # 上月第一天:取当前年份+上月月份的1号 $prevMonthFirstDay = Get-Date -Year $currentDate.Year -Month ($currentDate.Month - 1) -Day 1 # 上月对应日:取当前日期的日数,若上月无该日(如3月31日查2月),自动取上月最后一天 $prevMonthSameDay = try { Get-Date -Year $currentDate.Year -Month ($currentDate.Month - 1) -Day $currentDate.Day } catch { Get-Date -Year $currentDate.Year -Month ($currentDate.Month - 1) -Day ([DateTime]::DaysInMonth($currentDate.Year, $currentDate.Month - 1)) } # 转换为Azure API要求的ISO 8601格式字符串(UTC时间) $prevMonthFirstDayStr = $prevMonthFirstDay.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") $prevMonthSameDayStr = $prevMonthSameDay.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") # 定义资源组范围 $scope_managed_rg = "/subscriptions/$subscription_id/resourceGroups/$db_managed_rg" $scope_unmanaged_rg = "/subscriptions/$subscription_id/resourceGroups/$db_unmanaged_rg" # 查询当月累计用量 $rg1_currMonthRaw = Invoke-AzCostManagementQuery -Type "Usage" -Scope $scope_managed_rg -Timeframe "MonthToDate" $rg2_currMonthRaw = Invoke-AzCostManagementQuery -Type "Usage" -Scope $scope_unmanaged_rg -Timeframe "MonthToDate" # 查询上月对应区间用量(使用Custom时间范围,传入正确格式的时间字符串) $rg1_prevMonthRaw = Invoke-AzCostManagementQuery -Type "Usage" -Scope $scope_managed_rg ` -Timeframe "Custom" ` -TimePeriodFrom $prevMonthFirstDayStr ` -TimePeriodTo $prevMonthSameDayStr $rg2_prevMonthRaw = Invoke-AzCostManagementQuery -Type "Usage" -Scope $scope_unmanaged_rg ` -Timeframe "Custom" ` -TimePeriodFrom $prevMonthFirstDayStr ` -TimePeriodTo $prevMonthSameDayStr
额外注意事项
- 权限验证:确保执行脚本的账号拥有目标订阅/资源组的
Cost Management Reader或Reader角色,无权限会直接返回空值。 - 结果解析:返回的查询对象需通过
$rg1_currMonthRaw.Properties.Rows提取具体用量数据,直接输出对象只能看到元信息。 - 延迟规避:若查询最近24小时内的数据,建议等待1-2天后再尝试,避免因数据未同步导致空值。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

