列出从 Terraform 0.11 升级到 0.12 期间的问题

List issue during upgrade from Terraform 0.11 to 0.12

我在尝试重写列表以在 Terraform 0.12 中工作时遇到问题 适用于 Terraform 0.11。

这是我的清单:

variable "master_authorized_networks_config" {
  type        = list(string)
  description = "The list of CIDR blocks of master authorized networks."

  default = [
    {
      cidr_blocks = [
        { 
          cidr_block   = "XXXXXX/32"
          display_name = "XXXXX"
        },
        { 
          cidr_block   = "XXXXXX/32"
          display_name = "XXXXX"
        },
        { 
          cidr_block   = "XXXXXX/32"
          display_name = "XXXXX"
        },
        { 
          cidr_block   = "XXXXXX/32"
          display_name = "XXXXX"
        },
      ]
    },
  ]

我将它添加到模块中: master_authorized_networks_config = var.master_authorized_networks_config

在 运行 terraform apply 之后我得到以下错误:

Error: Invalid default value for variable

  on ../../modules/xxx/xxx/variables.tf line 71, in variable "master_authorized_networks_config":
  71:   default = [
  72:     {
  73:       cidr_blocks = [
  74:         {
  75:           cidr_block   = "XXXXXX/32"
  76:           display_name = "XXXXX"
  77:         },
  78:         {
  79:           cidr_block   = "XXXXXX/32"
  80:           display_name = "XXXXX"
  81:         },
  82:         {
  83:           cidr_block   = "XXXXXX/32"
  84:           display_name = "XXXXX"
  85:         },
  86:         {
  87:           cidr_block   = "XXXXXX/32"
  88:           display_name = "XXXXX"
  89:         },
 102:       ]
 103:     },
 104:   ]

This default value is not compatible with the variable's type constraint:
element 0: string required.

我无法解决这个问题。你能帮帮我吗?

错误告诉您您的默认值与您通过 type = list(string) 告诉 Terraform 的类型约束不匹配。该类型约束表示它必须是一个字符串列表,并且是通过 0.12upgrade 工具来自 0.11 的默认值,如果您之前有 type = list,您可能 运行 获得该输出。

您可以将类型限制更改为 list(object)。如果你简化了你的数据结构,这样你就只有一个带有 cidr_blockdisplay_name 键的对象列表,而不是一个带有键 cidr_blocks 的对象列表,它包含上述对象的列表,然后您甚至可以更准确地验证这一点:

variable "master_authorized_networks_config" {
  type = list(object{
    cidr_block   = string
    display_name = string
  })

  description = "The list of CIDR blocks of master authorized networks."

  default = [
    { 
      cidr_block   = "XXXXXX/32"
      display_name = "XXXXX"
    },
# ...
  ]
}

或者,更简单的是,在提供默认值时,您可以选择让 Terraform 通过从变量中删除 type 参数来自动推断预期的对象类型。然后,如果有人试图传入与默认 Terraform 类型不匹配的变量,则会在计划或验证时告诉您。