Terraform:如何从数据类型中获取元素



我对Terraform有一个不寻常的问题。

我创建了两个 VPC,并且我想在同一个 terraform 脚本中添加一个私有托管区域。

我执行以下操作:data "aws_vpcs" "foo" {}这让我了解了在该区域中创建的 VPC。

通常我可以输出 VPC 的 ID,例如:

output "test" {
value = data.aws_vpcs.foo.ids
}

这给了我一个列表,例如:

[ "VPC-0C8446A2164B7D0af", "VPC-0E7C63C3F383D115D", ]

现在,我想从此列表中获取第一个 VPC ID:"VPC-0C8446A2164B7D0af">

问题是它不起作用。 我尝试使用元素函数,例如:element(data.aws_vpcs.foo.ids, 0)element([data.aws_vpcs.foo.ids], 0)

我还尝试将其分配给如下值:data.aws_vpcs.foo.ids[0]

它不起作用,我在 Terraform 上找不到任何其他选项来帮助我解决这个问题。

我想使用第一个 VPC ID 创建资源:

resource "aws_route53_zone" "private" {
name = "example.com"
vpc {
vpc_id = data.aws_vpcs.foo.ids[0]
}
}

所以我可以从我在该区域获得的 VPC 列表中获取第一个 VPC(顺序无关紧要(。

当我运行地形计划时,出现错误:

Error: Invalid index
on main.tf line 25, in resource "aws_route53_zone" "private":
25:     vpc_id = data.aws_vpcs.foo.ids[0]
This value does not have any indices.

Terraform 区分列表值和集合值,其中集合类似于集合的数学思想,它是值的无序集合,您可以询问集合中是否存在特定元素,并且可以枚举集合中的所有元素,但没有索引或键可以查找单个项目。

aws_vpcs数据源返回一组字符串,因为 AWS 中的 VPC 没有固有的排序:如果不强加自己的排序标准,您就无法采用一对 VPC 并决定哪一个是"第一个"。

但是,如果您没有任何特定的排序标准,并且只想获取任何一个返回的 VPC,则可以使用sort函数指示 Terraform 应按词法对 VPC id 字符串进行排序,然后生成一个列表,您可以采用以下第一个元素:

resource "aws_route53_zone" "private" {
name = "example.com"
vpc {
vpc_id = sort(data.aws_vpcs.foo.ids)[0]
}
}

请注意,这本质上只是从集合中任意选择一个项目,因此只要列表永远不会更改,结果就会保持一致,但如果将新项目添加到列表中,如果它碰巧在之前排序,它最终可能会选择不同的元素之前选择它之前选择的元素。

因此,在使用数据源检索 VPC 时,我们通常希望使用aws_vpc数据源检索特定的单个 VPC,使用足够具体的查询,以便它只会返回我们需要的单个 VPC。在此模型下,如果只有一个结果,Terraform 将返回错误,这通常比隐式进行错误选择更可取。

元素不起作用,因为 vpc id 列表 不是列表,而是一组字符串。因此,以下操作不起作用。否则,此命令中没有问题。

"${element(data.aws_vpcs.foo.ids, 0)}"

但是,我找到了另一种使用排序来获取元素的方法。但同样,它被排序了。如果您对任何 vpc ID 都没问题,那么它应该没问题。

我仍然更喜欢 Falk 的建议,因为您正在尝试在同一脚本中提取 vpc id,因此您可以直接访问 vpc 然后获取 id。

作为练习,我将脚本放在下面以多种方式访问 id。快乐的脚本!

resource "aws_vpc" "vpc1" {
cidr_block = "10.20.0.0/16"
tags = {
name = "tf_vpc"
}
}
resource "aws_vpc" "vpc2" {
cidr_block = "10.30.0.0/16"
tags = {
name = "tf_vpc_2"
}
}

data "aws_vpcs" foo{}
output "test" {
value = "${data.aws_vpcs.foo.ids}"
}
output "test1" {
value = "${aws_vpc.vpc1.id}"
}
output "test2" {
value = "${aws_vpc.vpc2.id}"
}
output "counter" {
value = "${length(data.aws_vpcs.foo.ids)}"
}

output "myvpcID" {
value = sort(data.aws_vpcs.foo.ids)[0]
}

如果您在同一脚本中使用 terraform 创建了 VPC,则不需要数据提供程序。相反,您应该直接从资源访问 ID。有关类似情况以及有关如何解决此问题的更多详细信息,请参阅此答案。

相关内容

  • 没有找到相关文章

最新更新