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 }
关键逻辑说明
- 扁平化处理:通过嵌套
for表达式遍历每个存储账户及其容器,将容器信息与所属存储账户的key绑定为独立对象,再用flatten将嵌套列表转为一维列表。 - 唯一键生成:用
存储账户key-容器名作为for_each的键,确保每个容器资源的标识唯一,避免Terraform抛出重复资源错误。 - 资源关联:通过
azurerm_storage_account.storage[each.value.storage_account_key]引用对应存储账户的属性,保证容器与存储账户的关联关系正确。
内容的提问来源于stack exchange,提问作者Richard Brown
相关产品推荐
相关产品推荐

