Terraform:删除身份块不会删除从资源天蓝色逻辑应用程序分配的身份

Posted

技术标签:

【中文标题】Terraform:删除身份块不会删除从资源天蓝色逻辑应用程序分配的身份【英文标题】:Terraform : removal of identity block does not remove identity assigned from resource azure logic app 【发布时间】:2022-01-13 21:30:37 【问题描述】:

我的 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

【问题讨论】:

您能提供代码的完整上下文吗? lookup 也用于地图,但您的变量是一个列表。 所以我创建了一个具有 SystemAssigned 标识的逻辑应用标准资源,现在我想删除它。我也尝试将默认值设为 null,但没有更改。 【参考方案1】:

您的配置中似乎存在一些类型混淆,但 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(...)。 该变量的默认值现在是 null,这是表示缺少单个值的典型方式。 dynamic "identity" 块的for_each 表达式使用the [*] operator,称为“splat 运算符”,它具有a special behavior,它将一个空值转换为一个空列表和一个非空 值转换为单元素列表,从而为 for_each 参数生成合适的集合值。

我建议您始终为您的输入变量编写type constraints,因为这样在您使用的类型不一致的情况下,Terraform 可以为您提供更好的反馈。如果您在类型约束中使用 any,那么 Terraform 将无法深入了解您的意图,因此如果它对您的目标做出错误假设,它的错误消息通常会不太具体,甚至可能具有误导性。

【讨论】:

以上是关于Terraform:删除身份块不会删除从资源天蓝色逻辑应用程序分配的身份的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gitlab 中删除 terraform 资源?

Terraform - 删除除一个以外的所有资源

Terraform 重命名资源而不删除

使用 terraform 覆盖已删除的 aws_secretsmanager_secret 资源

使用 terraform 删除特定资源,即 vm、nic、nsg

Terraform不断强制重新创建资源(先删除再创建)]]