从 Terraform 中的另一组动态生成的资源动态生成资源

问题描述 投票:0回答:1

使用 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新手。

azure terraform azure-cosmosdb-mongoapi
1个回答
0
投票

从 Terraform 中的另一组动态生成的资源动态生成资源

问题主要是由于为每个数据库及其集合创建嵌套资源的方式造成的。使用 terraform 时,我们可以单独使用 countfor_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
  }
}

部署:

enter image description here

enter image description here

参考:

azurerm_cosmosdb_mongo_collection |资源 | Hashicorp/azurerm |地形 | Terraform 注册表

Azure CosmosDB (DocumentDB) Mongo Collection - 示例和最佳实践 |志翔道场

© www.soinside.com 2019 - 2024. All rights reserved.