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

