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

