带条件迭代嵌套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
相关产品推荐
相关产品推荐

