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

