【问题标题】:Terraform map with string and map elements possible?可以使用字符串和地图元素的 Terraform 地图吗?
【发布时间】:2023-03-15 04:29:01
【问题描述】:

我想创建一个这样的地图:

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 只是不允许这样做?

【问题讨论】:

    标签: terraform


    【解决方案1】:

    您在这里遇到的是 collection typesstructural types 在 Terraform 语言中的区别。

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

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

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

    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 根本不会检查传入的值,因此您的模块不应对其类型做出任何假设。

    【讨论】:

    • 将此标记为答案。我没有在我的问题中包含此信息,但我最初试图拥有一个完整的对象定义并认为这是不可能的
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2015-07-08
      • 1970-01-01
      • 2011-10-17
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多