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

Terraform中如何在for_each循环内访问映射中的序列

在Terraform中实现存储账户与容器的嵌套循环创建

要基于嵌套的存储账户-容器结构批量创建资源,核心是将嵌套结构扁平化为一维唯一集合,让for_each能遍历每个独立容器,并关联到所属的存储账户。

完整实现代码

1. 映射变量定义(已格式化)

variable "storage_accounts" {
  type = map(object({
    resource_group_name      = string
    location                 = string
    account_tier             = string
    account_replication_type = string
    containers_list          = list(object({
      name        = string
      access_type = string
    }))
  }))
  default = {
    stacctest1 = {
      resource_group_name      = "testrg"
      location                 = "uksouth"
      account_tier             = "Standard"
      account_replication_type = "GRS"
      containers_list = [
        { name = "test_private_x", access_type = "private" },
        { name = "test_blob_x", access_type = "blob" },
        { name = "test_container_x", access_type = "container" }
      ]
    }

    stacctest2 = {
      resource_group_name      = "testrg"
      location                 = "uksouth"
      account_tier             = "Standard"
      account_replication_type = "GRS"
      containers_list = [
        { name = "test_private_a", access_type = "private" },
        { name = "test_blob_a", access_type = "blob" },
        { name = "test_container_a", access_type = "container" }
      ]
    }
  }
}

2. 存储账户创建(保持原有逻辑)

resource "azurerm_storage_account" "storage" {
  for_each = var.storage_accounts

  name                     = each.key
  resource_group_name      = each.value.resource_group_name
  location                 = each.value.location
  account_tier             = each.value.account_tier
  account_replication_type = each.value.account_replication_type
}

3. 存储容器嵌套循环实现

resource "azurerm_storage_container" "container" {
  # 扁平化嵌套结构,生成唯一键值对集合
  for_each = {
    for container in flatten([
      for sa_key, sa in var.storage_accounts : [
        for c in sa.containers_list : {
          storage_account_key = sa_key
          name                = c.name
          access_type         = c.access_type
        }
      ]
    ]) : "${container.storage_account_key}-${container.name}" => container
  }

  name                  = each.value.name
  # 通过存储账户key关联对应资源
  storage_account_name  = azurerm_storage_account.storage[each.value.storage_account_key].name
  container_access_type = each.value.access_type
}

关键逻辑说明

  1. 扁平化处理:通过嵌套for表达式遍历每个存储账户及其容器,将容器信息与所属存储账户的key绑定为独立对象,再用flatten将嵌套列表转为一维列表。
  2. 唯一键生成:用存储账户key-容器名作为for_each的键,确保每个容器资源的标识唯一,避免Terraform抛出重复资源错误。
  3. 资源关联:通过azurerm_storage_account.storage[each.value.storage_account_key]引用对应存储账户的属性,保证容器与存储账户的关联关系正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:24:47