如何创建通用 cosmos db terraform 模块以添加多个 geo_locations

how to create generic cosmos db terraform module to add multiple geo_locations

我正在尝试使用 terraform 为 azure cosmos db 创建一个模块。在我的示例中,我希望 geo_location 应该更多 flexible/customized。这意味着我的故障转移位置并不是我所有应用程序的标准位置。在其中一个应用程序中,我的主要位置是 WEU,但故障转移是 EUS。在其他应用程序中,主要是 EUS,但故障转移位置是 WEU、WUS2。等等...所以我想使用 1 个 cosmosdb 模块,geo_location 属性 应该更加面向自助服务,基础设施开发人员可以在其中指定他们需要的任意数量的区域。

我看到在 terraform 中我们必须为每个区域指定“geo_location”块。这种方法将破坏拥有 1 个模块的目的。无论如何我可以像上面解释的那样让它更通用吗?

任何建议都有帮助。

谢谢, 桑托什

如果我正确理解了您的要求,您想为 Cosmos DB 构建一个模块,操作员将被要求提供任意数量的地理位置值 和资源块将 相应地创建 geo_location 个块.

在上面的例子中你可以创建一个列表类型的变量,它会询问用户提供相同的值然后使用动态geo_location块以便对其进行相应配置。我已经使用以下代码进行了测试:

provider "azurerm" {
  features {}
}
resource "azurerm_resource_group" "rg" {
  name     = "cosmos-dbtest"
  location = "East US"
}

variable "geo_location" {
    type = list
    description = "value for Geo Locations"
}

resource "random_integer" "ri" {
  min = 10000
  max = 99999
}

resource "azurerm_cosmosdb_account" "db" {
  name                = "tfex-cosmos-db-${random_integer.ri.result}"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  offer_type          = "Standard"
  kind                = "MongoDB"

  enable_automatic_failover = true

  capabilities {
    name = "EnableAggregationPipeline"
  }

  capabilities {
    name = "mongoEnableDocLevelTTL"
  }

  capabilities {
    name = "MongoDBv3.4"
  }

  capabilities {
    name = "EnableMongo"
  }

  consistency_policy {
    consistency_level       = "BoundedStaleness"
    max_interval_in_seconds = 300
    max_staleness_prefix    = 100000
  }

  dynamic "geo_location" {
      for_each = var.geo_location
    content{
    location          = geo_location.value
    failover_priority = geo_location.key
  }
}
}

输出:

如果你想保持 第一个 geo_location 与 cosmos DB 的位置相同,然后是其他故障转移位置,然后你可以使用一个静态和一个动态geo_location块如下:

resource "azurerm_cosmosdb_account" "db" {
  name                = "tfex-cosmos-db-${random_integer.ri.result}"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  offer_type          = "Standard"
  kind                = "MongoDB"

  enable_automatic_failover = true

  capabilities {
    name = "EnableAggregationPipeline"
  }

  capabilities {
    name = "mongoEnableDocLevelTTL"
  }

  capabilities {
    name = "MongoDBv3.4"
  }

  capabilities {
    name = "EnableMongo"
  }

  consistency_policy {
    consistency_level       = "BoundedStaleness"
    max_interval_in_seconds = 300
    max_staleness_prefix    = 100000
  }
  geo_location {
    location          = azurerm_resource_group.rg.location
    failover_priority = 0
  }
  dynamic "geo_location" {
      for_each = var.geo_location
    content{
    location          = geo_location.value
    failover_priority = "${geo_location.key + 1}"
  }
}
}

输出: