0
votes

I have the following code that will call a module and make target groups for me based off of the information I pass it in the locals variables. This works just fine, my issue being trying to get the arn of each target group it creates in an output.

locals {
  targetgroups_beta = {
    targetgroup1 = {
      name = "example",
      path = "/",
      environment = "Beta"
    }
    targetgroup2 = {
      name = "example2",
      path = "/",
      environment = "Beta"
    }
    }
  }

module "target-groups"{
  for_each = local.targetgroups_beta
  source = ".//modules/targetgroups"
  name-beta = each.value.name
  path-beta = each.value.path
  environment-beta = each.value.environment
  vpc-id = "${module.vpc.vpc_id}"
}

The resource name in the module it is calling is target-group, so based off of what I read I should be able to refer to it by something like this:

output{
     value = "${aws_lb_target_group.target-group[0].arn}"
}

When I try this I receive the following when running a terraform plan:

"Because aws_lb_target_group.target-group does not have "count" or "for_each" set, references to it must not include an index key. Remove the bracketed index to refer to the single instance of this resource."

My understanding of this is the module that the for_each is calling isn't running a for_each, so I cannot reference the resources in this way. If I do ""${aws_lb_target_group.target-group.arn}" that reference works technically, but includes the arn for every target group and I plan on adding a lot more. Is there a way to take each of these arns out of this list as its own output?

Code in the module that it is calling for reference:

resource "aws_lb_target_group" "target-group" {
  name     = "example-${var.name-beta}"
  port     = 80
  protocol = "HTTP"
  vpc_id   = var.vpc-id
  deregistration_delay = 5

  tags = {
    Environment = "${var.environment-beta}"
  }

  health_check{
  healthy_threshold = 2
  unhealthy_threshold = 2
  timeout = 10
  interval = 15
  path = var.path-beta
  }
}
1

1 Answers

0
votes

If I correctly understand, you are using for_each in your target-groups module. If so to get the outputs, you would have to use something like the following in your main.tf file:

module.target-groups[*].arn

The for_each will create multiple modules, not multiple resources in a single module.

Here is good info on using for_each and count with modules in terraform 0.13.

Update for one module

If you want to use only one module, you can do the following:

module "target-groups"{

  target_groups_to_create = local.targetgroups_beta

  source = ".//modules/targetgroups"
  name-beta = each.value.name
  path-beta = each.value.path
  environment-beta = each.value.environment
  vpc-id = "${module.vpc.vpc_id}"
}

Then in the module:

variable "target_groups_to_create" {}


resource "aws_lb_target_group" "target-group" {

  for_each = var.target_groups_to_create

  name     = "example-${each.value.name}"
  port     = 80
  protocol = "HTTP"
  vpc_id   = var.vpc-id
  deregistration_delay = 5

  tags = {
    Environment = "${each.value.environment}"
  }

  health_check{
  healthy_threshold = 2
  unhealthy_threshold = 2
  timeout = 10
  interval = 15
  path = each.value.path
  }
}