版本 0.12+ 中的 Terraform 列表

Terraform lists in version 0.12+

我正在从 Terraform 0.11.4 升级到 0.12.2。我已经按照 this guide 理顺了大部分内容,但我似乎找不到以下列表表达式的解决方案。

variable "subnetIds" {
  type = "list"
}

resource "aws_lb" "main" {
  name            = "myload-balancer"
  subnets         = ["${var.subnetIds}"] # <-- problem row
  security_groups = ["${var.securityGroupIds}"]
}

错误信息是:

  on main.tf line 10, in resource "aws_lb" "main":
  10:   subnets         = ["${var.subnetIds}"]

Inappropriate value for attribute "subnets": element 0: string required.

如果我删除括号 [] 我会收到以下错误:

  on main.tf line 10, in resource "aws_lb" "main":
  10:   subnets         = "${var.subnetIds}"

Inappropriate value for attribute "subnets": incorrect set element type:
string required.

使用 terraform 0.12+ 表达资源 aws_lb subnets 的正确方法是什么?

虽然您没有显示 var.securityGroupIdsvar.subnetIds 的典型值,但我会假设它们都是列表。在 Terraform < 0.12 中,您有时需要为参数参数添加冗余数组符号,并且没有首先 class 支持变量。在 Terraform >= 0.12 中,您不应再放置冗余数组符号,并且您确实首先 class 支持变量。您可以通过以下方式更新您的代码以处理这两个问题:

resource "aws_lb" "main" {
  name            = "myload-balancer"
  subnets         = var.subnetIds
  security_groups = var.securityGroupIds
}

这样多余的[]就去掉了,不需要的字符串插值也去掉了

找到问题了。 subnetIds 是从前一层(远程状态)的输出传递过来的。

subnetIds = ["${data.terraform_remote_state.eventsource.outputs.subnetIds}"]

基本上这意味着 subnetIds 变量变成了列表的列表。

改成这个之后一切正常:

subnetIds = data.terraform_remote_state.eventsource.outputs.subnetIds