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

Azure KeyVault读取JSON在Terraform dynamic块中报错排查

解决Terraform从KeyVault读取JSON字符串用于dynamic块for_each报错的问题

问题描述

使用jsondecode()解析Azure KeyVault中的JSON字符串时,在Terraform的dynamic块for_each中触发报错:

Error: Invalid dynamic for_each value
Cannot use a tuple value in for_each. An iterable collection is required.

直接使用相同内容的原始JSON字符串时代码可正常运行,但从KeyVault读取后却失败,且两种方式的输出显示类型和值完全一致。

解决方案

修改dynamic块的for_each表达式,依次进行空白字符清理、移除敏感标记、转为Set类型操作:

resource "azurerm_monitor_action_group" "SIDevelopment" {
  name                = "Test"
  resource_group_name = "kv-test"
  short_name          = "Test"

  dynamic "email_receiver" {
    for_each = toset(nonsensitive(jsondecode(trimspace(data.azurerm_key_vault_secret.secret.value))))
    content {
      name                    = email_receiver.value
      email_address           = email_receiver.value
      use_common_alert_schema = false
    }
  }
}

原因分析

  1. 隐藏空白字符:Azure KeyVault返回的Secret值可能包含首尾空白字符(如换行、制表符),虽然jsondecode能正常解析,但会导致Terraform内部对集合的识别出现异常。
  2. 敏感值限制:KeyVault Secret的value默认是敏感值,即使输出显示类型为tuple,Terraform在dynamic块的for_each逻辑中,对敏感集合的迭代存在特殊限制,需用nonsensitive移除敏感标记。
  3. 集合类型适配:for_each更推荐使用set类型(避免顺序变更导致资源重建),通过toset转换可确保集合符合迭代要求。

验证步骤

可添加输出块确认处理后的值是否正常:

output "processed_secret" {
  value = toset(nonsensitive(jsondecode(trimspace(data.azurerm_key_vault_secret.secret.value))))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:51:08