首页 > 解决方案 > 无法在 Terraform 中输入列表变量值

问题描述

我正在尝试使用 Terraform 创建 CosmosDB,并为子网使用列表变量类型,因为我们在 VNET 中有多个子网。但我得到以下错误 -

var.subnet 是包含 2 个元素的字符串列表

│ 不能在字符串模板中包含给定值:需要字符串。

我的 variable.tf 和 main.tf 在这里-

# ================
# Variable.tf
# ==============
variable "vnet" {
  description = "Provide VNET Name"
  default     = "cosmosdb-icn-vnet"
}

variable "subnet" {
  description = "Specifies subnet name"
  type        = list(string)
}

# ====================
# main.tf
# ===================
resource "azurerm_cosmosdb_account" "db" {
  name                              = "cosmosdb-${var.environment}"
  location                          = var.location
  resource_group_name               = var.rgname
  offer_type                        = "Standard"
  enable_automatic_failover         = true
  is_virtual_network_filter_enabled = true
 
  consistency_policy {
    consistency_level = "Session"
  }

  tags = {
    ENVIRONMENT = var.environment
  }

  backup {
    type                = var.backuptype
    interval_in_minutes = "60"
    retention_in_hours  = "8"
  }

  virtual_network_rule {
    id                                   = "/subscriptions/${var.subscription}/resourceGroups/${var.rgname}/providers/Microsoft.Network/virtualNetworks/${var.vnet}/subnets/${var.subnet}"
    ignore_missing_vnet_service_endpoint = true

  }

  geo_location {
    location          = var.failover_location
    failover_priority = 0
  }

}

我正在使用以下命令申请

terraform apply -var='subnet=["deafult", "cosmosdb2.0"]'

标签: terraformterraform-provider-azureterraform0.12+

解决方案


您应该尝试分离两个子网,从而virtual_network_rule在资源中创建两个块:

# ================
# Variable.tf
# ==============
variable "vnet" {
  description = "Provide VNET Name"
  default     = "cosmosdb-icn-vnet"
}

variable "subnets" {
  description = "Specifies subnet names"
  type        = list(string)
}

# ====================
# main.tf
# ===================
resource "azurerm_cosmosdb_account" "db" {
  name                              = "cosmosdb-${var.environment}"
  location                          = var.location
  resource_group_name               = var.rgname
  offer_type                        = "Standard"
  enable_automatic_failover         = true
  is_virtual_network_filter_enabled = true
 
  consistency_policy {
    consistency_level = "Session"
  }

  tags = {
    ENVIRONMENT = var.environment
  }

  backup {
    type                = var.backuptype
    interval_in_minutes = "60"
    retention_in_hours  = "8"
  }

  dynamic "virtual_network_rule" {
  for_each = var.subnets
    id                                   = "/subscriptions/${var.subscription}/resourceGroups/${var.rgname}/providers/Microsoft.Network/virtualNetworks/${var.vnet}/subnets/${virtual_network_rule.value}"
    ignore_missing_vnet_service_endpoint = true
  }

  geo_location {
    location          = var.failover_location
    failover_priority = 0
  }

}

推荐阅读