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

Terraform配置API Gateway JWT授权多客户端报错求助

解决方案

问题核心是原extprovider为单个字符串,无法直接用for表达式遍历。我们需要先构造包含目标后缀的可迭代列表,再通过字符串拼接生成所需的扩展名称,具体实现如下:

方法1:通过本地变量生成完整客户端名称列表

适合需要重复使用客户端名称的场景,先定义后缀列表,再拼接基础标识生成完整名称:

# 原字符串变量
variable "extprovider" {
  type        = string
  description = "基础环境标识,例如production"
}

# 本地变量:定义需要的后缀,生成完整客户端名称
locals {
  client_suffixes = ["odd", "even"]
  client_names    = [for suffix in local.client_suffixes : "${var.extprovider}_${suffix}"]
}

# 从SSM批量获取对应ClientID
data "aws_ssm_parameter" "cognito_client_ids" {
  for_each = toset(local.client_names)
  name     = "/cognito/client_ids/${each.value}"
}

# 为每个客户端配置JWT授权器
resource "aws_apigatewayv2_authorizer" "cognito_jwt" {
  for_each = toset(local.client_names)
  
  name                   = "${each.value}_jwt_authorizer"
  api_id                 = aws_apigatewayv2_api.main.id
  authorizer_type        = "JWT"
  identity_source        = ["$request.header.Authorization"]
  
  jwt_configuration {
    audience = [data.aws_ssm_parameter.cognito_client_ids[each.value].value]
    issuer   = "https://cognito-idp.${var.region}.amazonaws.com/${aws_cognito_user_pool.main.id}"
  }
}

方法2:直接在for_each中拼接名称

如果不需要单独保存客户端名称列表,可直接遍历后缀并拼接基础标识,更简洁:

variable "extprovider" {
  type        = string
  description = "基础环境标识,例如production"
}

# 直接遍历后缀,拼接生成SSM参数路径
data "aws_ssm_parameter" "cognito_client_ids" {
  for_each = toset(["odd", "even"])
  name     = "/cognito/client_ids/${var.extprovider}_${each.key}"
}

# 配置JWT授权器时同样直接拼接名称
resource "aws_apigatewayv2_authorizer" "cognito_jwt" {
  for_each = toset(["odd", "even"])
  
  client_name            = "${var.extprovider}_${each.key}"
  name                   = "${client_name}_jwt_authorizer"
  api_id                 = aws_apigatewayv2_api.main.id
  authorizer_type        = "JWT"
  identity_source        = ["$request.header.Authorization"]
  
  jwt_configuration {
    audience = [data.aws_ssm_parameter.cognito_client_ids[each.key].value]
    issuer   = "https://cognito-idp.${var.region}.amazonaws.com/${aws_cognito_user_pool.main.id}"
  }
}

关键说明

  • Terraform的for表达式和for_each需要作用于可迭代类型(列表、集合、映射),单个字符串不满足要求,因此需要通过后缀列表构造可迭代对象。
  • 使用toset()将列表转换为集合,避免因重复后缀引发的错误,同时符合for_each对元素唯一性的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:50:37