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
相关产品推荐
相关产品推荐

