我使用Terraform编写AWS构建脚本。我在多个可用区域中调整了多个实例,在本例中为2:
resource "aws_instance" "myinstance" {
count = 2
ami = "${var.myamiid}"
instance_type = "${var.instancetype}"
availability_zone = "${data.aws_availability_zones.all.names[count.index]}"
# other details omitted for brevity
}
我现在需要为这些实例分配弹性IP,以便将来可以在不更改IP地址的情况下重建实例。下面显示了我喜欢的内容:
resource "aws_eip" "elastic_ips" {
count = 2
instance = "${aws_instance.myinstance[count.index].id}"
vpc = true
}
但是这个错误与:
预期"}"但发现"。"
我也尝试过使用lookup
:
instance = "${lookup(aws_instance.sbc, count.index).id}"
但失败并出现同样的错误。
如何将弹性IP附加到这些实例?
答案 0 :(得分:7)
请浏览terraform interpolation - element list index
element(list,index) - 返回给定索引处的列表中的单个元素。如果索引大于元素数,则此函数将使用标准mod算法进行换行。此功能仅适用于平面列表。例子:
element(aws_subnet.foo.*.id, count.index)
所以在你的情况下,代码将是:
instance = "${element(aws_instance.myinstance.*.id, count.index}"
答案 1 :(得分:1)
多一点玩耍,我找到了答案 - 你可以索引到" splat"语法:
instance = "${aws_instance.myinstance.*.id[count.index]}"
答案 2 :(得分:1)
这对我有用,
instance = aws_instance.myinstance.*.id
答案 3 :(得分:0)
其他答案已经指出,必须通过索引访问计数的元素。我想补充一点,就是我遇到了错误
Because aws_instance.some-resource has "count" set, its attributes must be accessed on specific instances.
尽管我已经修复了该特定行。该错误不断出现,并提到一行代码段,该段代码甚至不再出现在我的代码中。
我能够解决所有未访问特定实例的地方(在其他错误中也提到过),从而解决了这一问题。在我的情况下,输出节以前没有被改编。只有这样,所有错误才突然消失。
答案 4 :(得分:0)
尝试使用DataFrame(x=1:2, y=11:12)
例如ec2实例的数量和卷附件为
aws_instance.jserver[count.index].id
答案 5 :(得分:0)
我知道您使用的是terraform的旧版本,但是我仍然想添加,以防万一有人在terraform 0.12中遇到同样的问题。对于terraform版本11,语法与版本v12完全不同。如您所见,仅应删除插值。根据您的语法和提供的各种响应。
version 11:
instance = "${aws_instance.myinstance.*.id[count.index]}"
version 12
instance = aws_instance.myinstance.*.id[count.index]