Terraform 从重用模块获取资源输出

Terraform 从重用模块获取资源输出,terraform,Terraform,下面的代码将调用一个模块,并根据我在局部变量中传递的信息为我创建目标组。这很好,我的问题是如何在输出中获取它创建的每个目标组的arn locals { targetgroups_beta = { targetgroup1 = { name = "example", path = "/", environment = "Beta" } targetgroup2 = {

下面的代码将调用一个模块,并根据我在局部变量中传递的信息为我创建目标组。这很好,我的问题是如何在输出中获取它创建的每个目标组的arn

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}"
}
它正在调用的模块中的资源名称是目标组,因此根据我所读的内容,我应该能够通过如下方式引用它:

output{
     value = "${aws_lb_target_group.target-group[0].arn}"
}
当我尝试此操作时,我在运行地形平面图时收到以下信息:

由于aws_lb_target_group.target-group没有“count”或“for_each”集合,对它的引用不能包含索引键。请删除括号内的索引以引用此资源的单个实例

我的理解是for_each调用的模块没有运行for_each,因此我无法以这种方式引用资源。如果我使用“${aws_lb_target_group.target group.arn}”,该引用在技术上是有效的,但包括每个目标组的arn,我计划添加更多。是否有方法将这些arn作为其自己的输出从列表中删除

正在调用以供参考的模块中的代码:

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
  }
}

如果我理解正确,您正在为
目标组
模块中的每个使用
。如果是这样,您必须在main.tf文件中使用以下内容:

module.target-groups[*].arn
每个模块的
将创建多个模块,而不是单个模块中的多个资源

对于terraform 0.13中的模块,每个
计数都有很好的使用
的信息

一个模块的更新 如果只想使用一个模块,可以执行以下操作:

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}"
}
然后在模块中:

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
  }
}

因此,它调用的模块没有在其中使用for_each,这似乎是我的问题。该模块中的代码如下:
resource“aws_lb_target_group”“target group”{name=“example-${var.name-beta}”port=80 protocol=“HTTP”vpc_id=var.vpc-id撤销注册\u delay=5个标记={Environment=”${var.environment-beta}{health\u check{health\u threshold=2 unhealth\u threshold=2 timeout=10 interval=15 path=var.path-beta}
这正是我要寻找的想法。是的。我认为问题会变成将局部变量传递给另一个模块。它似乎无法引用每个值。如果可能的话,我希望将这些定义保留在原始文件中,以便以结构化的方式进行查看。也许这是我可以做到的用地图代替吗?我对Terraform很陌生,所以我很感谢您的帮助。@Xzavier很难想象您将拥有或正在考虑的新结构。您可以做的是尝试修改您的代码,提供新信息、新错误消息,并用相关数据创建一个新问题。这将使您更容易看到问题所在新问题,以及其他人可能会发现新问题并尝试提供帮助。顺便说一句,如果您认为我当前的答案有帮助,我们将不胜感激。