Terraform中处理可选null嵌套for_each的扁平化结构构建问题
解决Terraform中容器映射为null时的扁平化问题
问题分析
你的变量定义允许containers为null,但原有的扁平化代码直接遍历st.containers,当某个存储账户的containers为null时,会触发遍历空值的错误,导致代码无法正常执行。
解决方案
通过coalesce函数将null的containers转换为空映射({}),这样遍历操作就能正常处理所有存储账户,无论其是否定义了容器:
locals { containers = flatten([ for storage_key, st in var.Storage : [ # 用coalesce把null转为空map,避免遍历空值报错 for cont_key, cont in coalesce(st.containers, {}) : { storage_key = storage_key, storage_name = st.name, cont_name = cont_key, access_type = cont.container_access_type } ] ]) }
说明
coalesce(st.containers, {})会判断st.containers的值:如果是null,就返回空映射{};如果已有容器定义,就使用原有的容器映射。- 这样修改后,即使某个存储账户没有配置
containers(即值为null),代码也不会报错,只会跳过该账户的容器遍历,最终生成的local.containers列表仅包含有容器定义的条目。 - 后续你可以基于这个扁平化后的列表,使用Terraform资源块为对应的存储账户创建容器,示例如下:
resource "azurerm_storage_container" "example" { for_each = { for c in local.containers : "${c.storage_name}-${c.cont_name}" => c } name = each.value.cont_name storage_account_name = each.value.storage_name container_access_type = each.value.access_type }
这个资源块通过for_each遍历扁平化后的容器列表,为每个条目创建对应的存储容器,确保只在指定的存储账户下创建配置好的容器。
内容的提问来源于stack exchange,提问作者Wolfgang
相关产品推荐
相关产品推荐

