Terraform 0.11列表属性与Terraform 0.12兼容

Terraform 0.11列表属性与Terraform 0.12兼容,terraform,Terraform,我有一些共享的terraform模块,目前被许多基于terraform 0.11的项目使用。我希望逐步将项目迁移到0.12,并尝试保持模块与0.11和0.12的兼容性。 我在列表属性方面遇到了问题,列表属性已从括号语法更改 在terraform 0.11中,单个表达式周围需要括号,以便向语言解释器提示需要列表解释: # Example for older versions of Terraform; not valid for v0.12 example = ["${var.any_list}"

我有一些共享的terraform模块,目前被许多基于terraform 0.11的项目使用。我希望逐步将项目迁移到0.12,并尝试保持模块与0.11和0.12的兼容性。 我在列表属性方面遇到了问题,列表属性已从括号语法更改

在terraform 0.11中,单个表达式周围需要括号,以便向语言解释器提示需要列表解释:

# Example for older versions of Terraform; not valid for v0.12
example = ["${var.any_list}"]
在terraform 0.12中,像上面这样的表达式现在将生成列表列表,从而为任何需要其他类型列表的参数生成类型检查错误

# Example for Terraform v0.12
example = var.any_list

是否可以以与0.11和0.12兼容的方式设置列表属性?

这种棘手的方式将适用于0.11和0.12

example=“${flatten(var.any_list)}”

我使用aws_security_组中的cidr_块对地形v0.11.14和v0.12.4进行了测试

变量“test”{
默认值=[“10.10.0.0/16”,“10.20.0.0/16”]
}
资源“aws\U安全组”“测试”{
入口{
从_端口=443
至_端口=443
协议=“TCP”
cidr_blocks=“${flatten(var.test)}”
}
}

原则上,在没有多余括号的情况下编写它应该在Terraform 0.11和0.12中都能工作,如下所示:

example = "${var.any_list}"
遗憾的是,由于TrRAFRATE 0.11的限制,如果<代码> Val.AythList包含在计划时间内不知道的任何值,这将失败,因为TrRAFRATE 0.11不认为未知的值是有效的列表。冗余的额外括号是该限制的常见解决方法,但不是故意的特性:撇开这个bug不谈,自Terraform 0.7以来就不需要冗余的列表括号,仅在向后兼容Terraform 0.6和更早版本时才支持它


尽管如此,如果您的列表中确实包含未知值,那么很遗憾,无法编写与这两个版本兼容的列表。最接近的方法是使用上面这样的形式,带有插值语法但不带括号,然后在第一个应用上使用
-target
,以强制Terraform创建
var.any_list
首先依赖的任何资源,然后在随后的应用程序中,该列表中应该没有未知值,因此它应该能够成功完成。这与未知值出现在
count
中时的原理相同,即使在Terraform 0.12中也不允许出现未知值。

很抱歉,这几乎是不可能的。不仅列表,而且几乎hcl语法都已更改。如果您将git用于模块,我认为最好将模块修改为0.12并创建新的版本标记。就像v1.x支持terraform 0.11和v2.x支持terraform 0.12一样。@RyanKim我正在使用S3托管模块,因此必须在bucket中分别创建与terraform 0.12兼容的版本。这是到目前为止我发现的唯一一个与hcl1不兼容的东西。它适用于terrafom 0.12,但不适用于terraform 0.11,它将产生一个字符串值列表,但仍然需要括号来告诉解释器它是一个列表。@Glen,我测试了terrafom 0.11.14和0.12.4,并在aws_security_组中测试了cidr_块,`locals{test=[“10.10.0.0/16”,“10.20.0.0/16”]}资源“aws_security_group”“test”{ingress{from_port=443 to_port=443 protocol=“TCP”cidr_blocks=“${flatte(local.test)}}`您在哪里使用它?我用0.11.13尝试了它,但没有用。我得到了一个意外的属性类型错误。