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 } }
代码细节解释
- 变量定义:保留原有的
database_count和collection_count变量,分别控制数据库总数和每个数据库下的集合数。 - 数据库资源:通过
count批量生成指定数量的数据库,命名规则为database0、database1... - 集合资源:
- 使用
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
相关产品推荐
相关产品推荐

