96 lines
2.6 KiB
HCL
96 lines
2.6 KiB
HCL
/**
|
|
* Copyright 2022 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
locals {
|
|
spend_basis = {
|
|
current = "CURRENT_SPEND"
|
|
forecasted = "FORECASTED_SPEND"
|
|
}
|
|
threshold_pairs = flatten([
|
|
for type, values in var.thresholds : [
|
|
for value in values : {
|
|
spend_basis = local.spend_basis[type]
|
|
threshold_percent = value
|
|
}
|
|
]
|
|
])
|
|
|
|
notification_channels = concat(
|
|
[for channel in google_monitoring_notification_channel.email_channels : channel.id],
|
|
coalesce(var.notification_channels, [])
|
|
)
|
|
}
|
|
|
|
resource "google_monitoring_notification_channel" "email_channels" {
|
|
for_each = toset(try(var.email_recipients.emails, []))
|
|
display_name = "${var.name} budget email notification (${each.value})"
|
|
type = "email"
|
|
project = var.email_recipients.project_id
|
|
labels = {
|
|
email_address = each.value
|
|
}
|
|
user_labels = {}
|
|
}
|
|
|
|
|
|
resource "google_billing_budget" "budget" {
|
|
billing_account = var.billing_account
|
|
display_name = var.name
|
|
|
|
budget_filter {
|
|
projects = var.projects
|
|
credit_types_treatment = var.credit_treatment
|
|
services = var.services
|
|
}
|
|
|
|
dynamic "amount" {
|
|
for_each = var.amount == 0 ? [1] : []
|
|
content {
|
|
last_period_amount = true
|
|
}
|
|
}
|
|
|
|
dynamic "amount" {
|
|
for_each = var.amount != 0 ? [1] : []
|
|
content {
|
|
dynamic "specified_amount" {
|
|
for_each = var.amount != 0 ? [1] : []
|
|
content {
|
|
units = var.amount
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
dynamic "threshold_rules" {
|
|
for_each = local.threshold_pairs
|
|
iterator = threshold
|
|
content {
|
|
threshold_percent = threshold.value.threshold_percent
|
|
spend_basis = threshold.value.spend_basis
|
|
}
|
|
}
|
|
|
|
all_updates_rule {
|
|
monitoring_notification_channels = local.notification_channels
|
|
pubsub_topic = var.pubsub_topic
|
|
# disable_default_iam_recipients can only be set if
|
|
# monitoring_notification_channels is nonempty
|
|
disable_default_iam_recipients = try(length(var.notification_channels), 0) > 0 && !var.notify_default_recipients
|
|
schema_version = "1.0"
|
|
}
|
|
}
|