要使用函数指定的Terraform变量

要使用函数指定的Terraform变量,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我收到一个错误消息“错误:不允许函数调用” 如Hashicorp人员在中所述,其旨在通过设计保持恒定 输入变量是传递到根模块的常量值,因此它们不能包含不产生常量值的插值或其他表达式 我们也不能像在中一样在后端使用变量 我想,这些就是我们Terraform用户在某个时候遇到的问题。Terraform类似于通用编程语言中的函数参数:它的值来自调用模块中的表达式,而不是来自当前模块 default机制允许我们在调用方未指定值时替换一个值,但因为变量用于从外部将数据导入模块,将默认值设置为该模块内部的某

我收到一个错误消息“错误:不允许函数调用”

如Hashicorp人员在中所述,其旨在通过设计保持恒定

输入变量是传递到根模块的常量值,因此它们不能包含不产生常量值的插值或其他表达式

我们也不能像在中一样在后端使用变量

我想,这些就是我们Terraform用户在某个时候遇到的问题。

Terraform类似于通用编程语言中的函数参数:它的值来自调用模块中的表达式,而不是来自当前模块

default
机制允许我们在调用方未指定值时替换一个值,但因为变量用于从外部将数据导入模块,将默认值设置为该模块内部的某个内容是没有意义的:这将导致结果可能是模块调用方无法实际指定的内容,因为他们无法访问必要的数据

Terraform还有另一个概念,大致类似于通用编程语言中函数中的局部变量。这些可以从函数结果和当前模块中的其他对象中提取,以生成它们的值,因此我们可以将输入变量和局部值一起使用,以提供回退行为,如您在问题中所示:

variable "subnet_address_space": cidr_subnet2_address_space = cidrsubnet(var.network_address_space,8,1)
在模块的其他地方,您可以使用
local.subnet\u cidr\u block
引用最终的cidr块选择,而不管它是由调用方显式设置的还是通过查找默认值表来设置的

当模块使用计算来做出这样的决策时,有时模块将其结果导出为一个结果,以便调用模块也可以使用它,这与Terraform资源导出其他属性记录提供者或远程API做出的决策的方式类似:

var "environment_name" {
  type = string
}

var "environment_default_cidr_blocks" {
  type = map(string)
  default = {
      development = "10.1.0.0/16"
      qa          = "10.2.0.0/16"
  }
}

var "override_network_range" {
  type    = string
  default = null   # If not set by caller, will be null
}

locals {
  subnet_cidr_block = (
    var.override_network_range != null ?
    var.override_network_range :
    var.environment_default_cidr_blocks[var.environment_name]
  )
}

不能在变量中使用插值或函数调用。用a代替。哦,听到这个消息很难过。这是因为动态吗?请注意,“局部”块中的项被称为“局部”。这在本例中正确显示。谢谢你,马丁。
variable "subnet_address_space": cidr_subnet2_address_space = cidrsubnet(var.network_address_space,8,1)
var "environment_name" {
  type = string
}

var "environment_default_cidr_blocks" {
  type = map(string)
  default = {
      development = "10.1.0.0/16"
      qa          = "10.2.0.0/16"
  }
}

var "override_network_range" {
  type    = string
  default = null   # If not set by caller, will be null
}

locals {
  subnet_cidr_block = (
    var.override_network_range != null ?
    var.override_network_range :
    var.environment_default_cidr_blocks[var.environment_name]
  )
}
output "subnet_cidr_block" {
  value = local.subnet_cidr_block
}