您的配置中似乎存在一些类型混淆,但 Terraform 无法检测和报告它,因为您没有为变量提供特定的类型约束。
具体来说,尚不清楚您是打算var.identity
成为对象列表还是单个对象。您将默认值声明为[]
,表明您的意思是一个列表,但该dynamic "identity"
块的内容将其视为var.identity
只是一个对象。
我将两种方式都写出来,所以你可以选择哪一种满足你的实际要求。
对于每个包含一个identity
块的“身份”列表:
variable "identities" {
type = list(object({
type = string
identity_ids = set(string)
}))
default = []
}
resource "example" "example" {
dynamic "identity" {
for_each = var.identities
content {
type = each.value.type
identity_ids = each.value.identity_ids
}
}
}
对于可选的单个“身份”对象:
variable "identities" {
type = object({
type = string
identity_ids = set(string)
})
default = null
}
resource "example" "example" {
dynamic "identity" {
for_each = var.identities[*]
content {
type = each.value.type
identity_ids = each.value.identity_ids
}
}
}
在第二个示例中,请注意:
- 的类型约束
variable "identities"
现在仅直接用于对象类型,没有list(...)
第一个示例中的。
- 该变量的默认值为 now
null
,这是表示缺少单个值的典型方式。
- 该
dynamic "identity"
块的for_each
表达式使用运算符,[*]
称为“splat 运算符”,它具有特殊的行为,它将空值转换为空列表,将非空值转换为单元素列表,从而生成合适的集合值为for_each
论点。
我建议始终为您的输入变量编写类型约束,因为这样在您使用的类型不一致的情况下,Terraform 可以为您提供更好的反馈。如果您any
在类型约束中使用,那么 Terraform 将不太了解您的意图,因此如果它对您的目标做出不正确的假设,它的错误消息通常会不太具体,甚至可能具有误导性。