Azure 成本管理 - 预算警报脚本

Azure Cost Management - Budget Alert Script

我请求为位于不同订阅的资源组设置预算警报。我正在尝试确定通过 PowerShell 或 Terraform 来自动执行此过程是否有意义。我的想法是,管理层将每季度更新一个 .csv 文件,其中包含他们想要设置警报表单的每个 RG 的预算金额和警报阈值。 .csv 将具有以下 fields/columns:

SubscriptionName, SubscriptionId, ResourcegGropu, StartDate, EndDate,TimeGrain,ContactEmails,Contact,BudgetAmount,budgetName, alertLevels

有什么建议吗?谢谢

使用 Terraform 在不同的订阅上执行相同的操作将很困难,因为 for_each 在提供程序块中不受支持,如下图所示,因此您将拥有为所有订阅手动设置提供商块。

locals{
    budget=csvdecode(file("C:/Users/xxxxx/terraform/budgetalert/Budget.csv"))
}
provider "azurerm"{
    for_each ={ for i , user in local.budget : i => budget }
    features{}
    subscription_id = each.value.SubscriptionId
    alias = each.value.SubscriptionName
}

作为从 terraform 执行此操作的解决方案,您可以为不同的订阅创建不同的 .csv 文件,并在不同的资源提供程序块中调用它们,如下所示:

provider "azurerm"{
    features {}
    subscription_id = "b83-----xxxxxxxxxxx-xxxx-xxxxx----23f"
}
provider "azurerm" {
    features {}
  subscription_id = "948--------x--xxxxxxxxxxxxx-xxxxxxx-59b"
  alias = "Subscription2"
}

locals{
    budgetsub1=csvdecode(file("C:/Users/xxxx/terraform/budgetalert/Budget.csv"))
    budgetsub2=csvdecode(file("C:/Users/xxxx/terraform/budgetalert/budgetsub2.csv"))
}
output "local" {
  value=local.budgetsub1
}
output "local1" {
  value = local.budgetsub2
}

data "azurerm_resource_group" "rg_subscription1"{
    for_each = { for i , budget in local.budgetsub1 : i => budget }
    name= each.value.ResourceGroup
}
data "azurerm_resource_group" "rg_subscription2"{
    provider = azurerm.Subscription2
    for_each = { for i , budget in local.budgetsub2 : i => budget }
    name= each.value.ResourceGroup
}

resource "azurerm_consumption_budget_resource_group" "rg_budget_subscription1" {
    for_each = { for i , budget in local.budgetsub1 : i => budget }
  name       = each.value.budgetName
  amount     = each.value.BudgetAmount
  time_grain = each.value.TimeGrain
  time_period {
    start_date = each.value.StartDate
    end_date  = each.value.EndDate
  }
  resource_group_id = data.azurerm_resource_group.rg_subscription1[each.key].id
  notification {
      enabled = true
    threshold      = 80
    operator       = "GreaterThanOrEqualTo"
    contact_emails = ["${each.value.ContactEmails}"]
  }
  lifecycle {
    ignore_changes = [
      time_period
    ]
  }
}
resource "azurerm_consumption_budget_resource_group" "rg_budget_subscription2" {
    provider = azurerm.Subscription2
    for_each = { for i , budget in local.budgetsub2 : i => budget }
  name       = each.value.budgetName
  amount     = each.value.BudgetAmount
  time_grain = each.value.TimeGrain
  time_period {
    start_date = each.value.StartDate
    end_date  = each.value.EndDate
  }
  resource_group_id = data.azurerm_resource_group.rg_subscription2[each.key].id
  notification {
      enabled = true
    threshold      = 80
    operator       = "GreaterThanOrEqualTo"
    contact_emails = ["${each.value.ContactEmails}"]
  }
  lifecycle {
    ignore_changes = [
      time_period
    ]
  }
}

输出: