首页 > 解决方案 > 从 Terraform 0.11 升级到 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.

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

标签: terraformterraform0.12+

解决方案


该错误告诉您,您的默认值与您告诉 Terraform 的类型约束不匹配 with type = list(string)。该类型约束表示它必须是一个字符串列表,并且是来自 0.11 的默认值0.12upgrade,您可能已经运行过该工具来获取该输出(如果您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 的类型不匹配的变量,则会在计划或验证时告诉您。


推荐阅读