You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中通过变量批量创建并关联多组Target Group?

批量创建Target Group并关联实例的Terraform实现方案

基于你已定义的local.target_groups映射,只需通过Terraform的for_each特性遍历该映射,即可批量生成Target Group,再通过组合遍历Target Group和实例的方式批量创建关联附件。

完整实现代码如下:

locals {
  app_servers = {
    "server1" = aws_instance.server1.id,
    "server2" = aws_instance.server2.id
  }

  target_groups = {
    "internal" = {
      port    = 9550
      matcher = "200"
    },
    "dev1" = {
      port    = 9152
      matcher = "302"
    },
    "sso" = {
      port    = 9154
      matcher = "302"
    },
    "terra-test" = {
      port    = 9360
      matcher = "200"
    }
  }   
}

# 批量创建Target Group
resource "aws_lb_target_group" "multi" {
  for_each         = local.target_groups
  name             = "${each.key}-tg"
  port             = each.value.port
  protocol         = "HTTPS"
  vpc_id           = aws_vpc.main.id
  protocol_version = "HTTP1"

  health_check {
    healthy_threshold   = 5
    interval            = 15
    protocol            = "HTTPS"
    unhealthy_threshold = 2
    timeout             = 5
    matcher             = each.value.matcher
    path                = "/login"
  }
}

# 批量为每个Target Group关联两台实例
resource "aws_lb_target_group_attachment" "multi" {
  for_each = {
    # 嵌套遍历Target Group和实例,生成唯一的资源键
    for tg_key, tg in local.target_groups :
    for server_key, server_id in local.app_servers :
    "${tg_key}-${server_key}" => {
      tg_arn     = aws_lb_target_group.multi[tg_key].arn
      target_port = tg.port
      server_id  = server_id
    }
  }

  target_group_arn = each.value.tg_arn
  port             = each.value.target_port
  target_id        = each.value.server_id
}

关键说明:

  1. 批量创建Target Group:通过for_each = local.target_groups遍历你定义的TG配置,每个TG的name用each.key(即你定义的TG标识,如internal)拼接-tg生成,port和matcher直接从each.value中读取对应配置。
  2. 批量关联实例:通过嵌套的for循环,将每个Target Group与两台实例进行组合,生成形如internal-server1的唯一资源键,确保每个关联附件都是独立的Terraform资源,避免重复或冲突。
  3. 所有Target Group共享健康检查的其他参数(如检查路径、间隔等),如果需要为不同TG配置不同的健康检查参数,只需在local.target_groups的每个子项中添加对应字段(比如path),然后在aws_lb_target_group的health_check块中引用each.value.path即可。

内容的提问来源于stack exchange,提问作者user19649255

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:15:41