如何基于map变量动态生成cloudflare_zone_settings_override的settings块
问题原因
你遇到的报错和配置不生效,本质是三个典型的Terraform语法使用错误:
- 你把
for_each写在了resource块的根层级,这会让Terraform为settings_override变量的每一个键值对都创建独立的cloudflare_zone_settings_override资源,完全不符合你要单个资源、动态填充单个settings块的需求。 - Terraform的资源参数名是静态校验的,不能在块内部用
each.key = each.value这种动态生成参数名的写法,Terraform会把each.key当成一个实际存在的参数名去校验,自然会报参数不存在的错误。 - dynamic块的作用是动态生成多个同类型的嵌套块,而
settings块明确要求只能存在一个,所以这个方案确实不适用。
解决方案
你的需求完全可以实现,不需要枚举所有可选配置项。cloudflare_zone_settings_override资源的settings字段本身支持直接接收Map类型的值,不需要写嵌套的settings {}块,直接把变量赋值给settings参数即可,正确写法如下:
variable "settings_override" { description = "Override Cloudflare configuration" type = map(string) default = {} } resource "cloudflare_zone_settings_override" "this" { zone_id = cloudflare_zone.this.id # 直接把配置map赋值给settings参数即可 settings = var.settings_override }
如果你的配置中存在非字符串类型的参数(比如数值、布尔值、嵌套对象),只需要把变量的类型改成map(any)即可适配。
如果需要保留通用默认配置,只覆盖用户传入的项,也可以结合merge函数实现:
locals { # 定义通用默认配置 default_zone_settings = { min_tls_version = "1.2" tls_1_3 = "on" } } resource "cloudflare_zone_settings_override" "this" { zone_id = cloudflare_zone.this.id # 合并默认配置和用户传入的覆盖配置,用户配置优先级更高 settings = merge(local.default_zone_settings, var.settings_override) }
注意:Cloudflare Provider会自动校验你传入的配置键是否为合法的Zone设置项,如果传入了不存在的配置项会直接抛出错误,符合预期的校验逻辑。
内容的提问来源于stack exchange,提问作者FN_
相关产品推荐
相关产品推荐

