20
votes

Code

Consider a terraform module:

module "blah-asg" {
  source = "asg"

  asg_max_size       = 1
  asg_min_size       = "${var.min_blah}"
  ...
}

My problem

How do I output variables from it?

What have I tried

output "blah-es-asg" {
    value = "${asg.blah-asg.arn}"
}

Which failed with

Error getting plugins: module root: 1 error(s) occurred: * output 'blah-asg': unknown resource 'asg.blah' referenced in variable asg.blah-asg.arn

My question

How can I output module fields in Terraform?

2
Please consider accepting the post that addresses/ed your issue (just a friendly reminder). - mok

2 Answers

50
votes

So first, you need to set the output in the module asg:

$ cat asg/output.tf

output "blah-es-asg" {
    value = "${aws_autoscaling_group.blah-asg.arn}"
}

Then you call the module with source = "asg":

module "blah-asg" {
  source = "asg"

  asg_max_size       = 1
  asg_min_size       = "${var.min_blah}"
  ...
}

You can output it in current code with this format now:

output "blah-es-asg" {
    value = "${module.blah-asg.blah-es-asg}"
}
4
votes

The module itself knows nothing of the name blah-asg - that's just in the script that's calling it - indeed it could be called multiple times with different names and parameters.

The output should just reference things within the module the same way you would elsewhere in that same module. For instance, if you wanted to output the arn of the following resource:

resource "aws_lb" "test" {
  # ...
}

You would use:

output "blah-es-asg" {
    value = "${aws_lb.test.arn}"
}

Note that the output is defined along side the rest of the module code, not in the script that's calling it.

This output can then by used by the script calling the module as ${module.blah-asg.blah-es-asg}