如何基于布尔值在Terraform中为GCP告警策略选择条件块类型
解决方案:基于布尔值动态选择告警条件类型
在Terraform中,你可以通过dynamic块结合布尔值判断实现二选一创建condition_threshold或condition_absent块。核心思路是给每个条件定义布尔标识(比如is_absent),再分别为两种条件类型创建dynamic块,通过布尔值控制块是否生成。
修改后的完整代码示例
resource "google_monitoring_alert_policy" "logging_alert_policy" { for_each = local.metrics_map project = var.project display_name = lower(format("%s%s%s%s", join("_", [element(split("-", each.value.appcode), length(split("-", each.value.appcode)) - 1), element(split("-", each.value.appcode), 0)]), " ", "log_match ", each.value.display_name)) combiner = each.value.how_to_trigger dynamic "conditions" { for_each = each.value.conditions content { display_name = lower(format("%s%s%s%s", join("_", [element(split("-", conditions.value.appcode), length(split("-", conditions.value.appcode)) - 1), element(split("-", conditions.value.appcode), 0)]), " ", "log_match ", conditions.value.display_name)) # 根据is_absent布尔值生成condition_threshold块 dynamic "condition_threshold" { for_each = conditions.value.is_absent ? [] : [1] content { filter = lower("metric.type=\"logging.googleapis.com/user/${format("%s%s%s%s", conditions.value.appcode, "-", lower(replace(lookup(conditions.value, "metric_name"), "/\\W|_|\\s/", "-")), "")}\" resource.type=\"${conditions.value.resource_type}\"") comparison = conditions.value.comparison threshold_value = conditions.value.threshold_value duration = conditions.value.duration trigger { count = lookup(conditions.value, "trigger_count", var.default_metric_alert["trigger_count"]) } aggregations { alignment_period = conditions.value.alignment_period per_series_aligner = conditions.value.per_series_aligner cross_series_reducer = conditions.value.cross_series_reducer group_by_fields = conditions.value.group_by_fields } } } # 根据is_absent布尔值生成condition_absent块 dynamic "condition_absent" { for_each = conditions.value.is_absent ? [1] : [] content { aggregations { alignment_period = "300s" per_series_aligner = "ALIGN_MAX" cross_series_reducer = "REDUCE_MAX" group_by_fields = ["resource.label.container_name"] } trigger { count = 1 } duration = "180s" filter = lower("metric.type=\"logging.googleapis.com/user/${format("%s%s%s%s", conditions.value.appcode, "-", lower(replace(lookup(conditions.value, "metric_name"), "/\\W|_|\\s/", "-")), "")}\" resource.type=\"${conditions.value.resource_type}\"") } } } } }
关键逻辑说明
- 布尔标识配置:确保
local.metrics_map中的每个conditions对象都包含is_absent布尔字段(true对应condition_absent,false对应condition_threshold)。 - Dynamic块控制:
- 当
is_absent为false时,condition_threshold的for_each = [1]会生成该块;为true时,for_each = []跳过生成。 - 当
is_absent为true时,condition_absent的for_each = [1]生成该块;为false时,for_each = []跳过生成。
- 当
- 字段复用:两种条件共用的
filter等字段保持原逻辑,无需重复修改。
注意事项
- 需保证
local.metrics_map中每个条件的is_absent值设置正确,避免出现两种条件都生成或都不生成的情况。 - 如果需要动态配置
condition_absent中的aggregations、duration等字段,可以将这些值加入conditions对象,替换硬编码字符串。
内容的提问来源于stack exchange,提问作者Shreshth.K
相关产品推荐
相关产品推荐

