使用 Terraform(无法访问 CDK),我从计数变量创建一组资源(在本例中为 azurerm_cosmosdb_mongo_database)。对于每个资源,我想基于另一个计数变量(在本例中为 azurerm_cosmosdb_mongo_collection)创建一组“内部”资源。我不知道如何创建这个嵌套的资源组。 GPT 和 Gemini 都没用,谷歌搜索也没有找到答案。
variable "database_count" {
description = "Number of databases to build"
type = number
default = 2
}
variable "collection_count" {
description = "Number of collections to build per database"
type = number
default = 5
}
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)
}
resource "azurerm_cosmosdb_mongo_collection" "collections" {
account_name = azurerm_cosmosdb_account.some-account.name
resource_group_name = azurerm_cosmosdb_account.some-account.resource_group_name
throughput = 10000
index {
keys = ["_id"]
unique = true
}
(psuedo code) foreach database in databases
create var.collection_count collections with the above common settings
name = format("collection%d", collection_count index)
database_name = (the database we are iterating on)
}
结果应该是两个数据库,每个数据库有五个集合。
我尝试同时使用 count 和 for_each,但 TF 不允许在一个资源中同时使用这两种方法。我还尝试使用除法来生成索引并仅迭代一个集合,但我找不到一种方法来进行数学运算,然后将结果用作索引值/集合名称片段等。也许有一种动态方法块?我是TF新手。
从 Terraform 中的另一组动态生成的资源动态生成资源
问题主要是由于为每个数据库及其集合创建嵌套资源的方式造成的。使用 terraform 时,我们可以单独使用 count 和 for_each,但不能同时使用。
为此,请尝试使用 for 循环 和
flatten
的组合来构建数据。
这个组合绝对可以帮助您达到要求。
配置:
resource "azurerm_cosmosdb_mongo_database" "databases" {
count = var.database_count
name = format("database%d", count.index)
account_name = azurerm_cosmosdb_account.main.name
resource_group_name = azurerm_resource_group.main.name
}
locals {
collections = flatten([
for db_index in range(var.database_count) : [
for coll_index in range(var.collection_count) : {
db_name = format("database%d", db_index)
coll_name = format("collection%d", coll_index)
}
]
])
}
resource "azurerm_cosmosdb_mongo_collection" "collections" {
for_each = { for i, v in local.collections : i => v }
name = each.value.coll_name
database_name = each.value.db_name
account_name = azurerm_cosmosdb_account.main.name
resource_group_name = azurerm_resource_group.main.name
throughput = 400
index {
keys = ["_id"]
unique = true
}
}
部署:
参考:
azurerm_cosmosdb_mongo_collection |资源 | Hashicorp/azurerm |地形 | Terraform 注册表
Azure CosmosDB (DocumentDB) Mongo Collection - 示例和最佳实践 |志翔道场