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

带条件迭代嵌套Map中的列表:Terraform多循环实现问题

Terraform嵌套循环获取Azure密钥库证书问题解决

变量定义

gateways:
  gateway1:
    routingConfig:
      sslCertificates: [
        "a",
        "b"
      ]
    ## 为简洁起见做了修改
  gateway2:
    routingConfig: {}
    ## 为简洁起见做了修改

尝试的代码及问题

最初尝试用单层for_each遍历网关,但无法处理嵌套的证书列表:

data "azurerm_key_vault_secret" "ssl_certificates" {
  for_each = {
    for k, v in local.gateways : v.routing_config.ssl_certificates
    if v.routing_config != {}
  }

  name         = each.value
  key_vault_id = data.azurerm_key_vault.ssl_certificates.id
}

运行时报错:

each.value 是包含2个元素的元组

问题在于这段代码仅对每个网关迭代一次,把整个证书元组传给了name字段,不符合azurerm_key_vault_secret资源对name参数的要求,且无法实现嵌套遍历证书的需求,同时此处无法使用dynamic块处理。

最终解决方案

通过先扁平化嵌套的证书列表,生成一个键值唯一的映射,再用for_each遍历该映射:

certificates_flat = merge([
  for gtw, gtw_details in local.gateways : {
    for ssl_cert in gtw_details.routing_config.ssl_certificates :
    ssl_cert => ssl_cert
  } if gtw_details.routing_config != {}
]...)

data "azurerm_key_vault_secret" "ssl_certificates" {
  for_each     = local.certificates_flat
  name         = each.value
  key_vault_id = data.azurerm_key_vault.ssl_certificates.id
}

这里通过嵌套的for表达式生成每个网关对应的证书键值对映射,再用merge和展开运算符(...)将所有映射合并为一个扁平化的集合,确保for_each能遍历每个独立的证书,正确生成对应的密钥库秘密资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:55:20