Terraform Cosmosdb 多子网

Terraform Cosmosdb multiple subnet

Terraform Cosmosdb 多子网 为 cosmosdb 添加额外的子网时出错

地形错误:

Error: Invalid value for module argument

  on manifests/backend.tf line 289, in module "cosmosdb_1":
 289:   vnet_subnet_id               = ["azurerm_subnet.backend.id", "azurerm_subnet.application.id", "azurerm_subnet.frontend.id"]

The given value is not suitable for child module variable "vnet_subnet_id"
defined at modules/cosmosdb/variable.tf:26,1-26: element 0: object required.

main.tf 子网定义变量的配置

  dynamic "virtual_network_rule" {
    for_each = var.virtual_network_rule != null ? toset(var.virtual_network_rule) : []
    content {
      id                                   = [var.vnet_subnet_id]
      ignore_missing_vnet_service_endpoint = virtual_network_rule.value.ignore_missing_vnet_service_endpoint
    }
  }

variable.tf 文件定义变量类型

variable "vnet_subnet_id" {
  type = list(object({
    id                                   = string,
    ignore_missing_vnet_service_endpoint = bool
  }))
}

backend.tf

中定义的 vnet 子网的主要配置
module "cosmosdb_1" {
  depends_on                   = [module.vnet]
  source                       = "./../modules/cosmosdb"
  cosmodb_account_name         = "${var.env}${var.cosmodb_account_name_1}"
  resource_group_name          = "${var.env}-bsai"
  ip_range_filter              = var.ip_range_filter
  location                     = "${var.region}"
  cosmosdb_name                = var.cosmosdb_name_1
  enable_automatic_failover    = var.enable_automatic_failover
  failover_location_secondary  = var.failover_location_secondary
  failover_priority_secondary  = var.failover_priority_secondary
  vnet_subnet_id               = ["azurerm_subnet.backend.id", "azurerm_subnet.application.id", "azurerm_subnet.frontend.id"]
}

解决方案:

模块:main.tf

  dynamic "virtual_network_rule" {
    for_each = var.vnet_subnet_id
    content {
      id   = virtual_network_rule.value.id
      ignore_missing_vnet_service_endpoint = true
    }
  }

variable.tf

variable "vnet_subnet_id" {
  description = "List of subnets to be used in Cosmosdb."
  type = list(object({
    id   = string
  }))
}

Backend.tf

vnet_subnet_id               = [{id   = azurerm_subnet.backend.id}, {id = azurerm_subnet.application.id}, {id = azurerm_subnet.frontend.id}]