如何创建通用 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}"
}
}
}
输出:
我正在尝试使用 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}"
}
}
}
输出: