Terraform配置Datadog管道动态块无法同时生成debug与verbose分类
问题原因
配置仅生成verbose分类,存在两处核心错误:
- 变量定义中在同一个map下重复声明
category键,Terraform的map类型不支持重复键,后写入的verbose配置会直接覆盖前面的debug配置,最终变量中仅保留最后一个verbose分类。 - dynamic块迭代逻辑错误:现有写法将单个category对象包装为单元素列表迭代,没有遍历多实例的逻辑;同时变量结构不符合规范,可重复声明的嵌套块必须用列表(list)类型承载,不能用对象(map/object),否则无法传入多个同类型配置。
修正后的配置
1. 资源端dynamic块配置
调整嵌套dynamic块的迭代逻辑,直接遍历对应列表,移除无效的单元素包装逻辑:
dynamic "processor" { for_each = var.processor content { dynamic "category_processor" { for_each = processor.value.category_processor != null ? [processor.value.category_processor] : [] content { target = category_processor.value.target name = lookup(category_processor.value, "name", null) is_enabled = lookup(category_processor.value, "is_enabled", null) # 遍历分类列表,支持生成多个category块 dynamic "category" { for_each = category_processor.value.category != null ? category_processor.value.category : [] content { name = category.value.name # 兼容单/多过滤器场景 dynamic "filter" { for_each = category.value.filter != null ? [category.value.filter] : [] content { query = filter.value.query } } } } } } } }
2. 变量配置修正
将重复的category键调整为列表结构,修复原有变量默认值的语法错误,增加类型约束(Terraform 0.14以下版本可将type改回any,只需保证传入结构和默认值一致即可):
variable "processor" { description = "One or more processors (multiples allowed)." type = list(object({ category_processor = object({ target = string name = optional(string) is_enabled = optional(bool) category = list(object({ name = string filter = object({ query = string }) })) }) })) default = [ { category_processor = { target = "foo.severity" name = "sample category processor" is_enabled = true # 多个分类放入列表,不存在键覆盖问题 category = [ { name = "debug" filter = { query = "@severity: \".\"" } }, { name = "verbose" filter = { query = "@severity: \"-\"" } } ] } } ] }
验证说明
配置调整完成后执行terraform plan,即可在计划结果中看到debug、verbose两个分类块同时生成,对应各自的过滤规则。
内容的提问来源于stack exchange,提问作者Srikanth Ganapavarapu
相关产品推荐
相关产品推荐

