You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于布尔值在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}\"")
        }
      }
    }
  }
}

关键逻辑说明

  1. 布尔标识配置:确保local.metrics_map中的每个conditions对象都包含is_absent布尔字段(true对应condition_absent,false对应condition_threshold)。
  2. Dynamic块控制:
    • 当is_absent为false时,condition_threshold的for_each = [1]会生成该块;为true时,for_each = []跳过生成。
    • 当is_absent为true时,condition_absent的for_each = [1]生成该块;为false时,for_each = []跳过生成。
  3. 字段复用:两种条件共用的filter等字段保持原逻辑,无需重复修改。

注意事项

  • 需保证local.metrics_map中每个条件的is_absent值设置正确,避免出现两种条件都生成或都不生成的情况。
  • 如果需要动态配置condition_absent中的aggregations、duration等字段,可以将这些值加入conditions对象,替换硬编码字符串。

内容的提问来源于stack exchange,提问作者Shreshth.K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:35:29