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

Terraform集成Cognito配置LB时lookup函数参数错误问题求助

问题原因

你使用的自定义aws-lb模块原有逻辑仅支持单个监听器默认动作(类型为map),你添加Cognito认证后将default动作修改为包含2个元素的数组(tuple),和模块预期输入类型不匹配。模块内部lookup()函数要求第一个参数为map,实际传入的是数组,因此触发报错。
另外你当前配置的动作顺序存在逻辑错误:ALB监听器默认动作按数组顺序执行,你将转发动作放在认证动作前,会导致认证逻辑完全不生效。

解决方案

1. 调整调用端动作顺序

将Cognito认证动作移到转发动作之前,保证请求先完成认证再转发到后端服务:

"HTTPS:443" = {
  certificates_arns = [module.certificate_lb.arn]
  actions = {
    default = [
      {
        type = "authenticate-cognito"
        authenticate_cognito = {
          user_pool_arn       = module.aws_cognito_user_pool.arn
          user_pool_client_id = module.aws_cognito_user_pool.id["alertmanager"]
          user_pool_domain    = module.aws_cognito_user_pool.domain
        }
      },
      {
        type  = "forward"
        group = "alertmanager"
      }
    ]
  }
}

2. 修改自定义LB模块逻辑

修改../../modules/aws-lb/lb.tf中aws_lb_listener资源的default_action逻辑,兼容单动作、多动作两种输入格式:

resource "aws_lb_listener" "listener" {
  for_each          = var.listeners
  load_balancer_arn = aws_lb.main.arn
  port              = split(":", each.key)[1]
  protocol          = split(":", each.key)[0]
  certificate_arn   = length(lookup(each.value, "certificates_arns", [])) > 0 ? each.value.certificates_arns[0] : null

  dynamic "default_action" {
    # 兼容单map/多元素数组两种输入格式
    for_each = try(length(each.value.actions.default), 0) > 0 ? each.value.actions.default : [each.value.actions.default]
    content {
      type = default_action.value.type

      # 转发动作配置
      dynamic "forward" {
        for_each = default_action.value.type == "forward" ? [1] : []
        content {
          target_group {
            arn = aws_lb_target_group.tg[default_action.value.group].arn
          }
        }
      }

      # 重定向动作配置(兼容原有HTTP跳转HTTPS逻辑)
      dynamic "redirect" {
        for_each = default_action.value.type == "redirect" ? [1] : []
        content {
          status_code = lookup(default_action.value, "status_code", "HTTP_301")
          protocol    = "HTTPS"
          port        = "443"
          path        = "#{path}"
          query       = "#{query}"
        }
      }

      # Cognito认证动作配置
      dynamic "authenticate_cognito" {
        for_each = default_action.value.type == "authenticate-cognito" ? [default_action.value.authenticate_cognito] : []
        content {
          user_pool_arn       = authenticate_cognito.value.user_pool_arn
          user_pool_client_id = authenticate_cognito.value.user_pool_client_id
          user_pool_domain    = authenticate_cognito.value.user_pool_domain
        }
      }
    }
  }

  tags = var.tags
}

修改后重新执行terraform plan即可验证配置有效性,原有未集成Cognito的配置也可以正常兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:15:04