如何为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
相关产品推荐
相关产品推荐

