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

Terraform 1.3.5中如何动态创建资源属性(未知属性名)

问题

使用Terraform 1.3.5版本,现有如下kong_service资源定义:

resource "kong_service" "se_service" {
  for_each = var.services

  name     = each.value.name
  protocol = each.value.protocol
  host     = each.value.host
  port     = each.value.port
  retries  = each.value.retries
}

变量定义:

variable "services" {
  type = map(any)
}

示例变量值:

services = {
  aaa = {
    name     = "aaa"
    host     = "aaa.com"
    port     = 8080
    protocol = "http"
    retries  = 5
  },
  bbb = {
    read_timeout    = 3000
    connect_timeout = 1000
    write_timeout   = 2000
    name            = "bbb"
    host            = "bbb.com"
    port            = 8080
    protocol        = "http"
    retries         = 5
  }
}

由于kong_service资源字段较多,不想在main.tf中硬编码所有字段,希望遍历variables.tf中的每个service,将其属性直接动态填入资源块,新增属性时无需修改main.tf。期望实现类似如下的动态填充效果:

resource "kong_service" "se_service" {
  for_each = var.services

  for key,value in each.value
  "${key} = ${value}"
}
解决方案

Terraform支持使用**展开运算符(...)**直接将map类型的属性集合传递给资源块,刚好满足你的需求。修改后的资源定义如下:

resource "kong_service" "se_service" {
  for_each = var.services

  # 直接展开each.value中的所有键值对作为资源属性
  ... = each.value
}

关键说明

  • 展开运算符...会自动把each.value这个map里的每一组键值对,映射为kong_service资源的对应属性,只要键名和资源的合法属性名完全匹配就能生效。
  • 后续在services变量中新增属性(比如示例里的read_timeout、connect_timeout)时,不需要修改main.tf的资源块,Terraform会自动识别并应用这些属性。
  • 注意:要确保services变量中的所有键名都是kong_service支持的合法属性,避免传递无效属性导致执行报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:32:14