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

Terraform中基于动态CosmosDB数据库嵌套创建Mongo集合的方法

Terraform批量创建CosmosDB MongoDB数据库及对应集合的解决方案

核心思路

要实现每个数据库对应多个集合的批量创建,可通过Terraform的setproduct函数生成数据库索引与集合索引的笛卡尔积,以此作为集合资源的count依据,从而避免同时使用count与for_each的冲突问题。

完整代码示例

variable "database_count" {
  description = "要创建的数据库数量"
  type        = number
  default     = 2
}

variable "collection_count" {
  description = "每个数据库下要创建的集合数量"
  type        = number
  default     = 5
}

# 批量创建MongoDB数据库
resource "azurerm_cosmosdb_mongo_database" "databases" {
  account_name        = azurerm_cosmosdb_account.some-account.name
  resource_group_name = azurerm_cosmosdb_account.some-account.resource_group_name
  count               = var.database_count
  name                = format("database%d", count.index)
}

# 批量创建每个数据库对应的MongoDB集合
resource "azurerm_cosmosdb_mongo_collection" "collections" {
  # 用笛卡尔积生成所有数据库-集合的组合,总实例数为 database_count * collection_count
  count               = length(setproduct(range(var.database_count), range(var.collection_count)))
  account_name        = azurerm_cosmosdb_account.some-account.name
  resource_group_name = azurerm_cosmosdb_account.some-account.resource_group_name
  database_name       = azurerm_cosmosdb_mongo_database.databases[element(setproduct(range(var.database_count), range(var.collection_count)), count.index)[0]].name
  name                = format("collection%d", element(setproduct(range(var.database_count), range(var.collection_count)), count.index)[1])
  throughput          = 10000

  index {
    keys   = ["_id"]
    unique = true
  }
}

代码细节解释

  1. 变量定义:保留原有的database_count和collection_count变量,分别控制数据库总数和每个数据库下的集合数。
  2. 数据库资源:通过count批量生成指定数量的数据库,命名规则为database0、database1...
  3. 集合资源:
    • 使用setproduct(range(var.database_count), range(var.collection_count))生成所有可能的索引组合,比如当数据库数为2、集合数为5时,会生成[0,0]、[0,1]...[1,4]共10组索引。
    • count设为该笛卡尔积的长度,即总集合数等于数据库数×每个数据库的集合数。
    • 通过element(..., count.index)[0]获取当前集合对应的数据库索引,从而关联到对应的数据库资源;element(..., count.index)[1]获取当前集合的索引,用于命名。

优化代码结构(可选)

若需要更清晰的代码逻辑,可将笛卡尔积结果提前定义为本地值:

locals {
  db_collection_pairs = setproduct(range(var.database_count), range(var.collection_count))
}

resource "azurerm_cosmosdb_mongo_collection" "collections" {
  count               = length(local.db_collection_pairs)
  account_name        = azurerm_cosmosdb_account.some-account.name
  resource_group_name = azurerm_cosmosdb_account.some-account.resource_group_name
  database_name       = azurerm_cosmosdb_mongo_database.databases[local.db_collection_pairs[count.index][0]].name
  name                = format("collection%d", local.db_collection_pairs[count.index][1])
  throughput          = 10000

  index {
    keys   = ["_id"]
    unique = true
  }
}

关键说明

你提到的dynamic块不适用于此场景:dynamic仅用于生成单个资源内部的嵌套块(比如多个index配置),无法生成独立的资源实例,因此不能用来创建多个集合资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:02:27