【问题标题】:Getting Outputs of Resources from Reused Modules从重用模块中获取资源的输出
【发布时间】:2020-12-16 23:05:25
【问题描述】:

我有以下代码将调用一个模块并根据我在本地变量中传递的信息为我创建目标组。这很好用,我的问题是尝试获取它在输出中创建的每个目标组的 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}"
}

当我尝试这个时,我在运行 terraform 计划时收到以下信息:

“由于 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
  }
}

【问题讨论】:

    标签: terraform


    【解决方案1】:

    如果我理解正确,您在 target-groups 模块中使用了 for_each。如果是这样,要获得输出,您必须在 main.tf 文件中使用类似以下内容:

    module.target-groups[*].arn
    

    for_each 将创建多个模块,而不是在单个模块中创建多个资源。

    Here 是有关使用 for_eachcount 与 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 deregistration_delay = 5 tags = { Environment = "${var.environment-beta}" } health_check{ healthy_threshold = 2 unhealthy_threshold = 2 timeout = 10 interval = 15 path = var.path-beta } }
    • 这就是我正在寻找的想法是的。我认为问题就变成了将局部变量传递给另一个模块。它似乎无法引用每个值。如果可能的话,我想将这些定义保留在这个原始文件中,以便以我的结构化方式进行查看。也许这是我可以用地图代替的东西?我对 Terraform 还很陌生,因此非常感谢您的帮助。
    • @Xzavier 很难想象您将拥有或正在考虑的新结构。您可以做的是尝试修改您的代码,提供新信息、新错误消息并使用相关数据创建一个新问题。这样可以更容易地查看新问题是什么,并且其他人可以找到新问题并尝试提供帮助。顺便说一句,如果您发现我当前的回答有帮助,我们将不胜感激。
    猜你喜欢
    • 2019-05-13
    • 2021-09-24
    • 2016-02-10
    • 1970-01-01
    • 2016-07-07
    • 2020-09-25
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多