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

Terraform 1.2.9:敏感list(object)变量用于dynamic for_each报错求助

问题解决:Terraform敏感list(object)变量用于dynamic块for_each报错

问题根源

Terraform对标记为sensitive = true的复合类型(如list(object({})))会做封装处理,限制直接访问其内部迭代结构。当直接将这类敏感变量传给dynamic块的for_each时,Terraform无法识别其为可迭代集合,因此触发"Cannot use a list of object value in for_each. An iterable collection is required."错误。

解决方案

将敏感列表转换为带唯一键的map(推荐,因为map的键更稳定,可避免元素顺序变化导致资源重建),或者转换为set,让Terraform能识别可迭代结构,同时保留敏感属性。

步骤1:定义本地变量转换敏感列表

在配置中添加local块,将原敏感列表转换为以对象name字段为键的map(假设name字段唯一):

locals {
  sample_variable_map = tomap({
    for item in var.sample_variable : item.name => item
  })
}

步骤2:修改dynamic块的for_each引用

将dynamic块的for_each指向转换后的本地map:

resource "ibm_cloud_sample_resource" "my_resource" {
  name                     = var.name
  description              = var.description
  template_env_settings    = local.env_values
  tags                     = var.tags
  dynamic "template_inputs" {
    for_each = local.sample_variable_map
    content {
      name        = template_inputs.value.name
      description = template_inputs.value.description
      type        = template_inputs.value.type
      value       = template_inputs.value.value
      secure      = template_inputs.value.secure
      use_default = template_inputs.value.use_default
    }
  }
}

补充说明

  • 若name字段不唯一,可组合其他字段生成唯一键,例如"${item.name}-${item.type}"作为map的键。
  • 也可使用toset(var.sample_variable)直接转换为set,但list转set要求对象可比较,且元素顺序变化会触发资源重建,不如map稳定。
  • 转换后的本地变量会继承原变量的敏感属性,不会泄露敏感值,符合安全要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:35:19