如何通过Terraform或Azure API实现Azure成本管理每日导出当日/前日数据
Azure Cost Management 每日导出配置问题解答
1. time_frame = "Custom" 的作用与必填配置
当time_frame设为Custom时,必须同时配置start_date和end_date,这两个参数明确指定导出数据的时间范围。只设置Custom不填日期的话,Terraform部署会直接报错,Azure API也不接受这种无效配置。
2. 能否直接用Custom实现每日动态导出?
不行。如果在Terraform里写死start_date和end_date,就算 recurrence 设为Daily,每次导出都会用同一个固定时间范围,根本达不到每日取当日/前一日数据的效果。
3. 可行的解决办法
方案一:Terraform + 动态变量(推荐)
利用Terraform内置函数动态计算每日的时间范围,比如导出前一天的数据:
resource "azurerm_billing_account_cost_management_export" "daily_export" { name = "daily-cost-export" billing_account_id = "你的账单账户ID" recurrence_type = "Daily" recurrence_period_start_date = formatdate("YYYY-MM-DD'T'00:00:00'Z'", timestamp()) recurrence_period_end_date = formatdate("YYYY-MM-DD'T'00:00:00'Z'", timeadd(timestamp(), "24h")) export_data_storage_location { container_id = azurerm_storage_container.example.resource_manager_id root_folder_path = "/daily-exports/${formatdate("YYYY-MM-DD", timestamp())}" } export_data_options { type = "Usage" time_frame = "Custom" start_date = formatdate("YYYY-MM-DD'T'00:00:00'Z'", timeadd(timestamp(), "-24h")) end_date = formatdate("YYYY-MM-DD'T'00:00:00'Z'", timestamp()) } }
每次执行terraform apply时,会自动生成前一日的时间范围。要让任务每日自动更新时间,得配合定时执行Terraform的脚本——比如用Azure DevOps Pipeline、GitHub Actions或者本地cron任务,每天跑一次terraform apply。
方案二:脚本调用Azure API更新导出任务
如果不想频繁跑Terraform,可以先创建一个基础的导出任务,然后每天用脚本调用Azure Cost Management API更新时间范围。示例PowerShell脚本:
$today = Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ" $yesterday = (Get-Date).AddDays(-1) | Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ" # 替换成你的实际资源ID $exportId = "/providers/Microsoft.Billing/billingAccounts/{你的账单ID}/providers/Microsoft.CostManagement/exports/daily-cost-export" $body = @{ properties = @{ recurrenceType = "Daily" recurrencePeriod = @{ startDate = $today endDate = (Get-Date).AddMonths(1) | Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ" } exportDataOptions = @{ type = "Usage" timeFrame = "Custom" startDate = $yesterday endDate = $today } exportDataStorageLocation = @{ containerId = "/subscriptions/{订阅ID}/resourceGroups/{资源组名}/providers/Microsoft.Storage/storageAccounts/{存储账户名}/containers/{容器名}" rootFolderPath = "/daily-exports/$((Get-Date).AddDays(-1).ToString('yyyy-MM-dd'))" } } } | ConvertTo-Json Invoke-AzRestMethod -Path $exportId -Method Put -Payload $body
把这个脚本配置成每日定时运行(比如用Azure Automation Runbook),就能自动更新每日的导出时间范围。
4. 注意点
Custom模式下,start_date不能早于当前日期前90天,且end_date必须晚于start_date,否则Azure会拒绝请求。- 导出文件的路径建议按日期划分(比如示例里的
/daily-exports/YYYY-MM-DD),避免不同日期的文件互相覆盖。
内容的提问来源于stack exchange,提问作者N1ckson
相关产品推荐
相关产品推荐

