terraform.11到.12的变化导致了空列表的问题

terraform.11到.12的变化导致了空列表的问题,terraform,Terraform,在0.11中,我们有一个创建google主机的模块。模块将创建 根据传入的参数,可以通过以下两种方式之一执行此操作: 两种不同的资源声明,即 resource "google_compute_instance" "this_public" { count = var.instance_count * var.flag } resource "google_compute_instance" "this_private" { count = var.instance_count * (1

在0.11中,我们有一个创建google主机的模块。模块将创建 根据传入的参数,可以通过以下两种方式之一执行此操作: 两种不同的资源声明,即

resource "google_compute_instance" "this_public" {
  count = var.instance_count * var.flag
}
resource "google_compute_instance" "this_private" {
  count = var.instance_count * (1 - var.flag)
}
(大致简化,但等效)

对于输出,我们将收集两个可能的资源,将它们猛击在一起,并获取其中一个不是空白的。(给定代码,一个或另一个将生成,而不是两个,因此可以保证其中一个结构为空。)

现在这个失败得很惨,因为tf 0.12关心这两个中的一个是空的, 而且它不能收集它

如果不完全重新设计,我看不出如何使它再次工作
在不同的元素上有很多for循环。

鉴于这两个资源本质上是互斥的,我认为下面这样的表达式会产生一个等价的结果:

concat(
  google_compute_instance.this_public.*.id,
  google_compute_instance.this_private.*.id,
)
由于这两个列表中的一个保证为空,因此这将始终是一个由
var.instance\u count
项组成的列表,并与一个空列表连接,我想这将得到您在这里寻找的结果

另一种方法是使用条件运算符,该运算符现在对于Terraform 0.12中的所有类型的值都是通用的,这可能对该配置的未来读者更为明确:

var.flag != 0 ?
  google_compute_instance.this_public.*.id :
  google_compute_instance.this_private.*.id

我在下面的回答中提出了一些不同的方法,但我也有点困惑,为什么
coalesclist
会首先拒绝空列表,因为选择第一个非空列表是该函数的全部要点。您是否可以更新您的问题,以包含使用此配置生成的完整错误消息Terraform?也许这里发生了一些更微妙的事情…我通过使用新的动态特性解决了我的问题,因此我不需要多个版本,它会根据需要将缺少的部分放入。我将查看是否可以回滚一个文件并在新的分支中尝试它。基本上,它是在抱怨this_私人分支机构不存在,所以对从中获取*.id很挑剔。
var.flag != 0 ?
  google_compute_instance.this_public.*.id :
  google_compute_instance.this_private.*.id