2017-06-21 91 views
0

我正在使用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}" 

但失败同样的错误。

我该如何去将Elastic IP附加到这些实例?

回答

1

多一点玩弄,我已经找到了答案 - 你可以索引到“图示”语法:

instance = "${aws_instance.myinstance.*.id[count.index]}" 
1

请通过terraform interpolation - element list index

元素(列表,索引) - 从给定索引处的列表中返回单个元素。如果索引大于元素的数量,则此函数将使用标准的mod算法进行换行。此功能仅适用于平面列表。例子:

element(aws_subnet.foo.*.id, count.index) 

所以你的情况,该代码将是:

instance = "${element(aws_instance.myinstance.*.id, count.index}" 
+0

所以这已经缠绕的额外的好处 - 还有没有其他原因使用它,我不是看见了什么?将来肯定会记住它,但我认为在我的情况下,我宁愿得到一个错误而不是环绕,因为它应该是两个资源之间的1-1映射。 –

+0

我以前用过你的方式,但看起来hashicorp用新的方式更新了他们的文档。两种方式都应该有效。 – BMW