Terraform 可以使用字符串和地图元素绘制地形图吗?

Terraform 可以使用字符串和地图元素绘制地形图吗?,terraform,Terraform,我想创建一个如下所示的地图: variable "test" { type = map(any) default = { param1 = "sdfsdf", param2 = "sdfsfd", param3 = { mylist = [ "aaaaa", "bbbbb", "ccccc&quo

我想创建一个如下所示的地图:

variable "test" {
  type = map(any)
  default = {
    param1 = "sdfsdf",
    param2 = "sdfsfd",
    param3 = {
      mylist = [
        "aaaaa",
        "bbbbb",
        "ccccc"
      ]
    }
我得到这个错误:

This default value is not compatible with the variable's type constraint: all
map elements must have the same type.

这是否意味着我已经定义了var权限,或者terraform不允许这样做?

它不起作用,因为地图、字符串和字符串列表中存在混合类型,如文档中所述

在您的情况下,您可以使用
type=any

variable "test" {

  type = any
  
  default = {
    param1 = "sdfsdf",
    param2 = "sdfsfd",
    param3 = {
    mylist = [
       "aaaaa",
       "bbbbb",
       "ccccc"
     ]
   }
  }
}

它不起作用,因为您在映射、字符串和字符串列表中混合了类型,如文档中所述

在您的情况下,您可以使用
type=any

variable "test" {

  type = any
  
  default = {
    param1 = "sdfsdf",
    param2 = "sdfsfd",
    param3 = {
    mylist = [
       "aaaaa",
       "bbbbb",
       "ccccc"
     ]
   }
  }
}

您在这里遇到的是和之间的地形语言的差异

“Map”是一种集合类型,Map值是任意数量的元素,每个元素由任意字符串标识,但所有值都是相同类型的

在您的例子中,听起来您想要声明您需要一组特定的属性,每个属性都有自己的类型约束。每个元素具有单独类型的固定结构由结构类型表示,“对象”是最类似于贴图的结构类型类型

以下是一个对象类型约束,它将接受您在问题中包含的示例值:

variable "test" {
  type = object({
    param1 = string
    param2 = string
    param3 = object({
      mylist = list(string)
    })
  })
}
如果您希望允许调用方在
param3
中设置任意数量的键,并且这些键都是字符串列表,则可以将其设置为字符串列表的映射:

variable "test" {
  type = object({
    param1 = string
    param2 = string
    param3 = map(list(string))
  })
}
在大多数情况下,模块会预期特定的数据类型,如果给定的值不是该类型,则会失败,在这种情况下,完整写出该类型有助于向调用模块的人员提供指导,并允许Terraform验证该值。但是,在某些情况下,您确实希望只接受任意值——例如,如果您打算只对值进行JSON编码并将其逐字发送到资源的参数——因此在这种情况下,您可以将类型约束设置为
any
,这将接受任何类型的值:

variable "test" {
  type = any
}

在这种情况下,Terraform根本不会检查传入值,因此您的模块不应该对其类型进行任何假设。

您在这里遇到的是和之间Terraform语言的差异

“Map”是一种集合类型,Map值是任意数量的元素,每个元素由任意字符串标识,但所有值都是相同类型的

在您的例子中,听起来您想要声明您需要一组特定的属性,每个属性都有自己的类型约束。每个元素具有单独类型的固定结构由结构类型表示,“对象”是最类似于贴图的结构类型类型

以下是一个对象类型约束,它将接受您在问题中包含的示例值:

variable "test" {
  type = object({
    param1 = string
    param2 = string
    param3 = object({
      mylist = list(string)
    })
  })
}
如果您希望允许调用方在
param3
中设置任意数量的键,并且这些键都是字符串列表,则可以将其设置为字符串列表的映射:

variable "test" {
  type = object({
    param1 = string
    param2 = string
    param3 = map(list(string))
  })
}
在大多数情况下,模块会预期特定的数据类型,如果给定的值不是该类型,则会失败,在这种情况下,完整写出该类型有助于向调用模块的人员提供指导,并允许Terraform验证该值。但是,在某些情况下,您确实希望只接受任意值——例如,如果您打算只对值进行JSON编码并将其逐字发送到资源的参数——因此在这种情况下,您可以将类型约束设置为
any
,这将接受任何类型的值:

variable "test" {
  type = any
}

在这种情况下,Terraform根本不会检查输入值,因此您的模块不应该对其类型进行任何假设。

将此标记为答案。我没有在我的问题中包含这些信息,但我最初试图得到一个完整的对象定义,并假设不可能将其标记为答案。我没有在我的问题中包含这些信息,但我最初试图得到一个完整的对象定义,并假设这是不可能的