aknuds1
aknuds1

Reputation: 67997

How to define a list in Terraform that may be empty depending on a variable?

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

Answers (2)

Tom Harrison
Tom Harrison

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

RaGe
RaGe

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

Related Questions