因此,从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升级脚本进行了更新,但正如文档中提到的那样,它在该领域有点偶然之处。
有什么想法可以在这里使用正确的格式/功能?
答案 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
值构造为列表而不是嵌套列表,然后就不需要代码更新。