从Terraform文档:
element(list,index)-从列表中的给定索引处返回单个元素。如果索引大于元素数,则此函数将使用标准的mod算法进行包装。
使用mod打包的好理由是什么?在我看来,这种行为可能是造成很多头痛的原因。
在我的头顶上,我只记得另外两种方法来处理超出范围的元素:
我对他们已经习惯了,他们似乎很有意义,您什么也没有得到或者没有错误,但是为什么您会期望将k mod n
元素添加到列表中呢?如果您是实施者,您将如何证明这种行为选择的合理性。
答案 0 :(得分:2)
这是您必须自己进行修改的快捷方式,但是在循环访问简短列表(例如要放入多个实例的子网数量或可用区)时很有用。
这是一种非常常见的模式,出现在aws_subnet_ids
data source docs中:
data "aws_subnet_ids" "private" {
vpc_id = "${var.vpc_id}"
tags {
Tier = "Private"
}
}
resource "aws_instance" "app" {
count = 6
ami = "${var.ami}"
instance_type = "t2.micro"
subnet_id = "${element(data.aws_subnet_ids.private.ids, count.index)}"
}
如果要使用slice operator,则当实例数超过数据源返回的子网数时,将立即获得索引越界异常。