如何从另一个资源中的计数资源中访问属性?

时间:2017-06-21 14:49:55

标签: terraform

我使用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附加到这些实例?

6 个答案:

答案 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]