Управление затратами Azure — сценарий оповещения о бюджете

У меня есть запрос на настройку оповещения о бюджете для наших групп ресурсов, расположенных в разных подписках. Я пытаюсь решить, имеет ли смысл делать это через PowerShell или Terraform для автоматизации этого процесса. Я думаю, что руководство будет ежеквартально обновлять файл .csv с суммой бюджета и порогом оповещения для каждой из RG, для которой они хотят настроить форму оповещений. .csv будет иметь следующие поля/столбцы:

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

Любые предложения? Спасибо

1 ответ

Использование 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
    ]
  }
}

Выход:

Другие вопросы по тегам