地形插值/表达式v0.12

时间:2019-08-07 12:47:03

标签: terraform

因此,从Terraform v0.11.4升级到v0.12.5后,我遇到了一个已知的“错误”,如Hashicorps票证#21411中所述,该错误涉及引用列表变量和使用flatten函数管理此错误。

我已经按照Hashicorp升级说明中的说明使用flatten函数转换了一些属性值,但到目前为止,这已经击败了我:

resource "aws_nat_gateway" "nat_gw" {
  count = local.nat_gw_count

  allocation_id = element(aws_eip.nat_gw.*.id, count.index)
  subnet_id = element(data.terraform_remote_state.remote_state.outputs.subnet_ids_frontend, count.index)
  tags = merge(
    local.default_tags,
    {
     "Name" = "${var.project}_${var.env}_natgw_${count.index}"
    },
  )
}

返回的错误消息是:

   Error: Incorrect attribute value type

   on nat_gw.tf line 56, in resource "aws_route_table_association" "public":
   56:   subnet_id = element(data.terraform_remote_state.remote_state.outputs.subnet_ids_proxy, count.index)

Inappropriate value for attribute "subnet_id": string required.

存储在远程状态中的值如下:

subnet_ids_frontend = [
  [
    "subnet-03b44ca6123456789",
    "subnet-02e6bf55123456789",
  ],
]

subnet_id格式已通过terraform升级脚本进行了更新,但正如文档中提到的那样,它在该领域有点偶然之处。

有什么想法可以在这里使用正确的格式/功能?

1 个答案:

答案 0 :(得分:1)

存储在远程状态中的subnet_ids_frontend变量是二维的嵌套列表。因此,您需要使用第一个元素访问嵌套列表,然后使用第二个元素访问字符串。这可以通过data.terraform_remote_state.remote_state.outputs.subnet_ids_frontend[0][<subnet_id_element>]完成(请注意,它使用Terraform 0.12第一类表达式表示变量)。您资源的代码更新为:

resource "aws_nat_gateway" "nat_gw" {
  count = local.nat_gw_count

  allocation_id = element(aws_eip.nat_gw.*.id, count.index)
  subnet_id     = data.terraform_remote_state.remote_state.outputs.subnet_ids_frontend[0][count.index]
  ...
}

或者,可以将存储在远程状态中的subnet_ids_frontend值构造为列表而不是嵌套列表,然后就不需要代码更新。