Terraform 地形平面图错误“特征”:未设置必填字段

Terraform 地形平面图错误“特征”:未设置必填字段,terraform,infrastructure-as-code,Terraform,Infrastructure As Code,terraform初始化成功,下面是我的main.tf ############################################################################ # VARIABLES ############################################################################# variable "resource_group_name" { type = string } v

terraform初始化成功,下面是我的main.tf

############################################################################
# VARIABLES
#############################################################################

variable "resource_group_name" {
  type  = string
}

variable "location" {
  type    = string
  default = "eastus"
}


variable "vnet_cidr_range" {
  type    = string
  default = "10.0.0.0/16"
}

variable "subnet_prefixes" {
  type    = list(string)
  default = ["10.0.0.0/24", "10.0.1.0/24"]
}

variable "subnet_names" {
  type    = list(string)
  default = ["web", "database"]
}

#############################################################################
# PROVIDERS
#############################################################################

provider "azurerm" {

}

#############################################################################
# RESOURCES
#############################################################################

module "vnet-main" {
  source              = "Azure/vnet/azurerm"
  resource_group_name = var.resource_group_name
  location            = var.location
  vnet_name           = var.resource_group_name
  address_space       = var.vnet_cidr_range
  subnet_prefixes     = var.subnet_prefixes
  subnet_names        = var.subnet_names
  nsg_ids             = {}

  tags = {
    environment = "dev"
    costcenter  = "it"

  }
}

#############################################################################
# OUTPUTS
#############################################################################

output "vnet_id" {
  value = module.vnet-main.vnet_id
}
当我运行terraform plan-var resource\u group\u name=vnet main-out vnet.tfplan时 获取以下警告:

警告:不推荐使用仅插值表达式

在 .terraform/modules/vnet main/Azure-terraform-azurerm-vnet-e0b9155/main.tf 第3行,在资源azurerm_资源组vnet:3:name中 =${var.resource\u group\u name}

警告:引用的类型约束已弃用

在 .terraform/modules/vnet main/Azure-terraform-azurerm-vnet-e0b9155/variables.tf 第39行,变量nsg_id:39:type=map中

最后得到以下错误:

错误:功能:未设置必填字段

根据下面stackoverflow文章中提到的建议,如果我运行升级命令terraform 0.12upgrade升级到0.12,得到以下错误:

错误:配置文件中存在语法错误

在main.tf第6行的变量资源_组_name:6:type中 =字符串

分析时出错:在6:11:未知标记:6:11标识字符串


这里似乎有一些问题,但不一定是直接的问题,所以我将逐一尝试。注意:您不需要修复警告,只需修复错误,但建议同时修复这两个错误

警告:不推荐使用仅插值表达式

在较新版本的terraform中,资源属性应该直接传递,而不是在插值中包装它们

我也是

而不是

resource "my_resource" "name" {
  some_attr = "${var.some_value}"
}
除非从其他值构建字符串实际上需要字符串插值

警告:引用的类型约束已弃用

在.terraform/modules/vnet main/Azure-terraform-azurerm-vnet-e0b9155/variables.tf第39行的变量nsg_id:39:type=map中

至少从警告的角度来看,您所依赖的模块与您正在使用的terraform版本不兼容

这一具体投诉是因为它在地图类型周围使用引号,例如地图,而不仅仅是地图。这一点可以从中看出

你唯一真正的选择是打开模块,修复警告/升级,或者打开PR,希望维护者合并,尽管看起来回购已经两年没有活动了

错误:功能:未设置必填字段

这是真正的错误,我想你可能正在寻找修复。答案很简单,就是您的提供商缺少该选项,该选项甚至可以为空

因此,使用以下命令应该可以修复此错误

provider "azurerm" {
  features {}
}
错误:配置文件中存在语法错误

在main.tf第6行的变量resource_group_name:6:type=string中

分析时出错:在6:11:未知标记:6:11标识字符串

我认为这里的问题在于升级命令期望正在升级的terraform是有效的0.11代码。在0.11中,类型字段应具有字符串值,例如map、string等…

嘿,您必须指定如下功能块以解决问题

provider "azurerm" {
  version = "=2.4.0"
  features {}
}
provider "azurerm" {
  version = "=2.4.0"
  features {}
}