You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:45:42