【问题标题】:terraform use specific value from for_each in another resourceterraform 在另一个资源中使用来自 for_each 的特定值
【发布时间】:2023-03-24 10:50:01
【问题描述】:

有没有办法从另一个资源部分的 for_each 中选择特定值?

通过以下内容,我可以毫无问题地创建多个目标组。

resource "aws_lb_target_group" "target_group" {
  for_each = var.target_group
  name              = format("%s%s-%s","TG-",var.name, each.value.incoming_port)
  port              = each.value.incoming_port
  protocol          = each.value.incoming_protocol
  proxy_protocol_v2 = false
  vpc_id            = data.aws_vpc.vpc.id
  target_type       = "instance"
}

这里我的要求是只创建一个带有转发的监听器。所以我想选择 1 个目标组 arn(可以是第一个或任何其他)来创建下面的侦听器资源。使用 for_each 我可以使用所有 target_group 开始一个循环,但这不是必需的。用不同的方法尝试了很多次,但还没有成功。

resource "aws_lb_listener" "forward_443" {
  #for_each = aws_lb_target_group.target_group

  default_action {
    target_group_arn = aws_lb_target_group.target_group[each.value].id == "TG-EX-DEV-7776" ? aws_lb_target_group.target_group[each.value].arn : ""
    #target_group_arn = each.value.port == 7776 ? each.value.arn : ""
    #target_group_arn = element(aws_lb_target_group.target_group[each.key].arn, count.index)
    #target_group_arn = local.value
    type             = "forward"
  }

  load_balancer_arn = aws_lb.lb.arn
  port              = 443
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-FS-1-2-Res-2020-10"
  certificate_arn   = aws_acm_certificate.cert.arn
}

简单来说,我想创建 3 个 target_group 并将一个转发规则附加到其中一个。 terraform 不应该寻找其他 target_group 的

【问题讨论】:

  • "用不同的方法尝试了很多次,但还没有成功" - 这是什么意思?你到底尝试了什么?你得到什么错误?
  • 虽然在没有 [each.key] 的情况下尝试过,但它要求使用它,但在使用时,它说,我不能在 default_action 子部分中使用它
  • 您能否在更新后的问题中提供准确的错误消息。
  • 简单来说,我只想从使用“aws_lb_target_group”创建的资源列表中获取一个值
  • target_group_arn = element(concat(aws_lb_target_group.target_group.arn.*, list("")), 0) 你能试试吗?同时删除aws_lb_listenerfor_each

标签: amazon-web-services terraform terraform-provider-aws


【解决方案1】:

如果您只想从aws_lb_target_group.target_group 中获取单个值,可以使用values

resource "aws_lb_listener" "forward_443" {

  default_action {
    target_group_arn = values(aws_lb_target_group.target_group)[0].id
    type             = "forward"
  }

  load_balancer_arn = aws_lb.lb.arn
  port              = 443
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-FS-1-2-Res-2020-10"
  certificate_arn   = aws_acm_certificate.cert.arn
}

【讨论】:

  • 在尝试此验证时通过但在创建资源时它尝试为每个值创建并失败,因为资源已经存在。 Error: error creating ELBv2 Listener (arn:aws:elasticloadbalancing:us-west-1:xxxxxxxx:loadbalancer/app/LB-EXP-DEV/ec5a54546465d6): DuplicateListener: A listener already exists on this port for this load balancer 'arn:aws:elasticloadbalancing:us-west-1:xxxxxxxx:loadbalancer/app/LB-EXP-DEV/ec5a54546465d6' │ status code: 400
  • @Rio 你不能有预先存在的听众。大部分都由你的 TF 创建和管理。
  • 这确实有效。我不得不从“aws_lb_listener”中删除 for_each 条目。我忽略了你的例子。非常感谢@Marcin
猜你喜欢
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2020-09-16
  • 2021-10-04
相关资源
最近更新 更多