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
]
}
}
输出:
我请求为位于不同订阅的资源组设置预算警报。我正在尝试确定通过 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
]
}
}
输出: