aws_alb_listener 的 Terraform 如何在 type="forward" 的默认操作中添加多个 target_group_arn

Posted

技术标签:

【中文标题】aws_alb_listener 的 Terraform 如何在 type="forward" 的默认操作中添加多个 target_group_arn【英文标题】:Terraform for aws_alb_listener how to add multiple target_group_arn in default action for type="forward" 【发布时间】:2021-01-03 04:40:19 【问题描述】:

我的方法:我必须创建一个 "aws_lb_listener" 资源,在默认操作中我有 type = "forward" 但我没有一个 target_group_arn 。我有多个 target_group_arn 值。

sn-p 下面显示了前端侦听器,但 target_group_arn 应该包含多个 arn 值。

resource "aws_alb_listener" "frontend-listener" 
    load_balancer_arn = aws_alb.ss_alb.arn
    port = "443" #"80" 
    protocol = "HTTPS"
    depends_on        = [aws_alb_target_group.aws_alb_target_group]
    
    default_action 
    #target_group_arn = aws_alb_target_group.aws_alb_target_group.arn
    type = "forward"
    
    
  

aws_alb_target_group 资源显示正在创建多个目标组。

resource "aws_alb_target_group" "aws_alb_target_group" 
    for_each = local.ebapp_name

    name = "$each.value.name-tg"
    port = 80
    protocol = "HTTP"
    vpc_id = var.vpc_id

我查看了 terraform 文档,但找不到解决方案。 (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb_listener)

resource "aws_alb_listener_rule" "aws_alb_listener_rule"
    for_each = local.ebapp_name

    listener_arn = aws_alb_listener.frontend-listener.arn
    action     
          type = "forward"    
          target_group_arn = aws_alb_target_group.aws_alb_target_group[each.value.name].arn
       
    condition     
         
         path_pattern 
            values = ["/$each.value.name/*"]
        
    
 

我也提到了监听器规则。

使用 terraform apply 命令显示错误,如下所示:

对于“forward”类型的操作,您必须指定“forward”块或“target_group_arn”

为了解决这个错误需要做哪些改变?

【问题讨论】:

【参考方案1】:

我认为您可以使用dynamic blocks 实现这一目标。例如:

resource "aws_alb_listener" "frontend-listener" 
    load_balancer_arn = aws_alb.ss_alb.arn
    port = "443" #"80" 
    protocol = "HTTPS"
    depends_on        = [aws_alb_target_group.aws_alb_target_group]
    
    default_action         
        type = "forward"
        forward 
            dynamic "target_group" 
                for_each = aws_alb_target_group.aws_alb_target_group
                content 
                    arn = target_group.value["arn"]
                
            
        
    

以上仅为示例,可能仍需要进行一些调整才能使其按预期工作。

【讨论】:

我尝试使用 forward dynamic "target_group" for_each = local.ebapp_name content arn = aws_alb_target_group.aws_alb_target_group[each.value.name].arn 它似乎不起作用,你能提出任何可行的方法吗?卡在上面很久了。 错误:在模块\alb\main.tf 第 37 行,资源“aws_alb_listener”“frontend-listener”中,不能在此上下文中使用 each.value:37:arn = aws_alb_target_group.aws_alb_target_group[each .value.name].arn 对“each.value”的引用已在其不可用的上下文中使用,例如当配置不再包含其“for_each”表达式中的值时。删除配置中对 each.value 的此引用以解决此错误。 @aditmodi 在我的回答中我使用了each.value。也错了? @aditmodi 也许应该是target_group.value["arn"]。我修改了答案。 你的答案不起作用,因为 for_each 应该有 local.ebapp_name 而不是 resource.aws_alb_target_group.aws_alb_target_group 。【参考方案2】:

这对我有用。它现在将所有三个目标组添加到侦听器的默认操作中。

locals 
  target_groups = ["1", "2", "3"]



resource "aws_lb_listener" "https_to_target_group" 
  count = length(local.target_groups)

  certificate_arn   = aws_acm_certificate.cd.arn
  load_balancer_arn = aws_lb.cd.arn

  port              = var.alb.port
  protocol          = var.alb.protocol
  ssl_policy        = var.alb.ssl_policy

  default_action 

    type             = "forward"
    forward 
      dynamic "target_group" 
        for_each = local.target_groups
        content 
          arn = aws_lb_target_group.cd[target_group.key].arn
        
      
    
  

【讨论】:

以上是关于aws_alb_listener 的 Terraform 如何在 type="forward" 的默认操作中添加多个 target_group_arn的主要内容,如果未能解决你的问题,请参考以下文章

需要说明如何使用 Terraform 管理 Google Cloud 项目

如何在Ansible set_fact中使用fact?

如何将 AWS 区域传递给 lambda 函数?

将现有 GKE 集群添加到 terraform stat 文件

使用 Terraform 删除以前的快照并创建 EBS 卷的新快照

使用 github-script@v5 操作提取 terraform 资源更改