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

如何为Terraform资源google_logging_metric创建map(object)模板批量传参

为Terraform的google_logging_metric资源实现map(object)模板,从tfvars传递多对象属性

要实现通过map(object)类型变量从.tfvars传递多个日志指标的属性,你需要在main.tf中使用for_each遍历变量,并通过dynamic块处理嵌套的labels结构。以下是完整的示例代码:

variables.tf

定义map(object)类型的变量,包含日志指标的所有属性,包括嵌套的labels结构:

variable "custom_logging_metrics" {
  description = "自定义日志指标的映射,包含标签和提取规则"
  type = map(object({
    name        = string
    filter      = string
    labels      = map(object({
      value_type  = string
      description = string
    }))
    label_extractors = map(string)
  }))
}

main.tf

使用for_each遍历变量创建多个google_logging_metric资源,并用dynamic "labels"动态生成每个指标的标签描述:

resource "google_logging_metric" "logging_metric" {
  # 遍历自定义日志变量,每个键对应一个独立的指标资源
  for_each = var.custom_logging_metrics

  name   = each.value.name
  filter = each.value.filter

  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"

    # 动态生成每个标签的描述块
    dynamic "labels" {
      for_each = each.value.labels
      content {
        key         = labels.key
        value_type  = labels.value.value_type
        description = labels.value.description
      }
    }
  }

  # 直接传递标签提取规则
  label_extractors = each.value.label_extractors
}

custom_logging_metrics.tfvars

在tfvars文件中定义多个日志指标对象,每个对象包含独立的名称、过滤规则、标签和提取器:

custom_logging_metrics = {
  metric1 = {
    name   = "my-custom-metric-1"
    filter = "resource.type=\"gce_instance\" AND severity>=ERROR AND log_name=\"projects/crafty-acumen-422607-j2/logs/OSConfigAgent\""
    labels = {
      message = {
        value_type  = "STRING"
        description = "错误信息"
      }
      timestamp = {
        value_type  = "STRING"
        description = "错误发生时间"
      }
    }
    label_extractors = {
      message   = "EXTRACT(jsonPayload.message)"
      timestamp = "EXTRACT(jsonPayload.localTimestamp)"
    }
  }
  metric2 = {
    name   = "my-custom-metric-2"
    filter = "resource.type=\"gcs_bucket\" AND severity>=ERROR"
    labels = {
      bucket_name = {
        value_type  = "STRING"
        description = "存储桶名称"
      }
    }
    label_extractors = {
      bucket_name = "EXTRACT(resource.labels.bucket_name)"
    }
  }
}

关键说明

  • for_each = var.custom_logging_metrics:会为tfvars中的每个指标对象创建独立的google_logging_metric资源,资源的唯一标识是map中的键(如metric1、metric2)。
  • dynamic "labels":遍历每个指标的labels映射,动态生成metric_descriptor下的labels块,避免手动编写重复代码。
  • 所有属性均通过each.value直接从变量中获取,实现完全的参数化配置。

内容的提问来源于stack exchange,提问作者Ayub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:01:07