在 Terraform 中作为具有动态键和值的块的属性

Attributes as Blocks with dynamic key and value in Terraform

我想为 Cloudflare 创建 Terraform 模块,但我坚持使用 cloudflare_zone_settings_override 设置块。我无法根据包含地图的输入变量动态创建它。

目标是让输入变量 settings_override 里面有可变数量的设置。示例:

  settings_override = {
    always_use_https = "on"
    ssl              = "flexible"
  }

我想要实现的是这样的,我可以在输入上有可变数量的设置(它是模块,所以它可以根据环境变化)。

resource "cloudflare_zone_settings_override" "this" {
  zone_id   = cloudflare_zone.this.id
  for_each  = var.settings_override

  settings {
    always_use_https = "on"
    ssl              = "flexible"
  }
}

但是我总是收到同样的错误:

Error: Argument or block definition required

  on main.tf line 72, in resource "cloudflare_zone_settings_override" "this":
  72:     each.key = each.value

An argument or block definition is required here. To set an argument, use
the equals sign "=" to introduce the argument value.

代码无效。我也尝试过使用 dynamic 的方法,但是 settings 块只能是一个,所以我认为这不是正确的方法...

variable "settings_override" {
  description = "Override Cloudflare configuration"
  type        = map(string)
  default     = {}
}

resource "cloudflare_zone_settings_override" "this" {
  zone_id   = cloudflare_zone.this.id
  for_each  = var.settings_override

  settings {
    each.key = each.value
  }
}

这甚至可以使用 Terraform 吗?或者我必须指定所有可能的选项并使用 for_each?

替换它们

Terraform version v1.0.6
Cloudflare provider version: 2.10.1

您必须明确提供所有选项。例如:

resource "cloudflare_zone_settings_override" "this" {
  zone_id   = cloudflare_zone.this.id

  settings {
    always_use_https = lookup(var.settings_override, "always_use_https", null)
    ssl = lookup(var.settings_override, "ssl", null)
    mirage = lookup(var.settings_override, "mirage", null)
    # ... and so on
  }
}