0

我的 main.tf 中有这个

dynamic "identity" {
    for_each = var.identity == [] ? [] : [1]
    content {
      type         = lookup(var.identity, "type", null)
      #identity_ids = lookup(var.identity, "identity_ids", null)
    }
}

我已经定义了如下变量。

variable "identity" {
  description = "creates the identity for Logic App."
  type    = any
  default = []
}

从输入中删除身份块不会删除分配的身份。Terraform 不会检测到更改。some1 可以帮忙吗?

此外,Logic App 标准仅支持 SystemAssigned,但 doc 说的是其他内容: https ://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/logic_app_standard

4

1 回答 1

0

您的配置中似乎存在一些类型混淆,但 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 将不太了解您的意图,因此如果它对您的目标做出不正确的假设,它的错误消息通常会不太具体,甚至可能具有误导性。

于 2021-12-11T01:26:25.673 回答