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 } } }
原因分析
- 隐藏空白字符:Azure KeyVault返回的Secret值可能包含首尾空白字符(如换行、制表符),虽然
jsondecode能正常解析,但会导致Terraform内部对集合的识别出现异常。 - 敏感值限制:KeyVault Secret的
value默认是敏感值,即使输出显示类型为tuple,Terraform在dynamic块的for_each逻辑中,对敏感集合的迭代存在特殊限制,需用nonsensitive移除敏感标记。 - 集合类型适配:
for_each更推荐使用set类型(避免顺序变更导致资源重建),通过toset转换可确保集合符合迭代要求。
验证步骤
可添加输出块确认处理后的值是否正常:
output "processed_secret" { value = toset(nonsensitive(jsondecode(trimspace(data.azurerm_key_vault_secret.secret.value)))) }
内容的提问来源于stack exchange,提问作者Uriu
相关产品推荐
相关产品推荐

