hashicorp/terraform

Cannot pass a list of maps to a resource/data

wr0ngway opened this issue ยท 11 comments

Terraform Version

Terraform v0.7.0-rc3 (3f4857a)

Affected Resource(s)

  • core

Terraform Configuration Files

// Works for a single map, does not work for a list of maps

variable "vars" {
  type = "map"
  default = {
    foo = "bar"
  }
}

data "template_file" "file" {
  template = "foo=${foo}"
  vars = "${var.vars}"
}

output "output" {
  value = "${data.template_file.file.rendered}"
}

variable "parts" {
  type = "list"
  default = [
    {
      content_type = "text/x-shellscript"
      content      = "ls"
    },
    {
      content_type = "text/x-shellscript"
      content      = "echo hi"
    }
  ]
}

data "template_cloudinit_config" "config" {
  gzip = false
  base64_encode = false

  part = "${var.parts}"
}

output "output" {
  value = "${data.template_cloudinit_config.config.rendered}"
}

Debug Output

https://gist.github.com/dd910b4bdb9b2cbe03850080ff218ca9

Panic Output

N/A

Expected Behavior

Literal list of maps should work as a parameter to a resource or data source that takes a list of maps. The example uses a data source for ease in duplication, but the same error is seen when passing to a resource, e.g. aws_db_parameter_group.parameter

Actual Behavior

The resource doesn't see each map as a valid object:

Errors:

  * data.template_cloudinit_config.config: part.0: expected object, got invalid
  * data.template_cloudinit_config.config: part.1: expected object, got invalid

Steps to Reproduce

Please list the steps required to reproduce the issue, for example:

  1. terraform apply

Important Factoids

N/A

References

Any updates on this? I ask only because of the release-0.7 tag with 0.7.3 being out and no traffic on this issue ๐Ÿ‘ผ

For example I could this to solve the variable number of listeners for an aws_elb ...

This looks good

output "output" {
value = "${var.listOfListenerObjects}"
}

but

resource "aws_elb" "elb" {
provider = "aws"
.
.
listener = ["${var.listOfListenerObjects}"]
}

gives listener.0: expected object, but got string

Hitting the same issue with 0.9.1. This would be super useful!

+1

kwach commented

+1

savar commented

+1

๐Ÿ‘

Hi all!

Thanks for reporting this, @wr0ngway. This is one of a number of quirks with more complex data structures in Terraform right now, resulting from the fact that Terraform originally didn't support such structures at all and so the current state is a pragmatic intermediate step to allow simple use-cases to be addressed. We are planning to further improve the situation around complex structures, including looking at whether we can find a way to support dynamic generation of nested configuration blocks from variables, but we're not currently actively working on implementing this since things are still in the early design phase.

Since this discussion seems to just be attracting upvotes at this point, I'm going to lock it to remove the noise for the many people who are following this issue. We'll unlock it again later when things are further along and we have more to discuss here.

Thanks again!

Hi all! Sorry for the long silence here; some outdated labeling on this issue caused me to miss it on a previous pass.

This issue is actually covering the same problem as #7034, which has now been resolved in master with the introduction of the special dynamic block type, which I showed an example of in a comment over there. This will be included in the forthcoming v0.12.0 release, so I'm going to close this out.

I'm going to lock this issue because it has been closed for 30 days โณ. This helps our maintainers find and focus on the active issues.

If you have found a problem that seems similar to this, please open a new issue and complete the issue template so we can capture all the details necessary to investigate further.