Reputation: 67997
I need to define a resource in Terraform (v0.10.8) that has a list property that may or may not be empty depending on a variable, see volume_ids
in the following definition:
resource "digitalocean_droplet" "worker_node" {
count = "${var.droplet_count}"
[...]
volume_ids = [
"${var.volume_size != 0 ? element(digitalocean_volume.worker.*.id, count.index) : ""}"
]
}
resource "digitalocean_volume" "worker" {
count = "${var.volume_size != 0 ? var.droplet_count : 0}"
[...]
}
}
The solution I've come up with fails however in the case where the list should be empty (i.e., var.volume_size
is 0):
volume_ids = [
"${var.volume_size != 0 ? element(digitalocean_volume.worker.*.id, count.index) : ""}"
]
The following Terraform error message is produced:
* module.workers.digitalocean_droplet.worker_node[1]: element: element() may not be used with an empty list in:
${var.volume_size != 0 ? element(digitalocean_volume.worker.*.id, count.index) : ""}
How should I correctly write my definition of volume_ids
?
Upvotes: 14
Views: 30442
Reputation: 14018
Since this answer was written, several new constructs make this problem just a little less gross. As of terraform 1.x syntax can be changed from:
element(concat(digitalocean_volume.worker.*.id , list(""))
coalescelist(digitalocean_volume.worker[*].id, [""])
Upvotes: 3
Reputation: 23677
Unfortunately this is one of many language shortcomings in terraform. The hacky workaround is to tack an empty list onto your empty list.
${var.volume_size != 0 ? element(concat(digitalocean_volume.worker.*.id , list("")), count.index) : ""}
Upvotes: 13