在AWS CDK中使用CfnMapping列表值配置HttpJwtAuthorizer失败
CDK中CloudFormation映射列表值的坑及解决办法
遇到的两个问题
- CfnOutput输出列表映射值失败:CloudFormation官方文档明确Mapping支持String或List类型,但在CDK里用CfnOutput输出列表类型的映射值时,部署直接报错,提示输出必须是字符串,不能是列表。
- HttpJwtAuthorizer无法解析映射列表值:直接写死字符串数组给
jwt_audience字段时,CDK堆栈合成正常;但用mapping.find_in_map取映射里的列表值传进去,就会触发反序列化错误,提示无法将值转换为字符串数组。
问题根源
纯CloudFormation里直接用Mapping的列表值是可行的,但CDK对find_in_map的返回值做了封装,默认返回Token类型,而部分CDK构造(比如HttpJwtAuthorizer的jwt_audience)只识别明确的字符串数组,无法自动解析Token形式的列表。CfnOutput的问题则源于CloudFormation本身要求输出值必须为字符串类型,CDK未做自动转换处理。
解决办法
1. 处理CfnOutput的列表输出需求
将列表映射值拼接成字符串输出,使用Fn.join实现转换:
from aws_cdk import Fn, CfnOutput CfnOutput(self, "MyListOutput", value=Fn.join(",", my_mapping.find_in_map("MyRegionKey", "MyListKey")))
2. 解决HttpJwtAuthorizer的jwt_audience参数问题
用cdk.Token.asList把映射返回的Token转换成CDK能识别的字符串数组类型:
from aws_cdk import Token from aws_cdk.aws_apigatewayv2_authorizers import HttpJwtAuthorizer jwt_authorizer = HttpJwtAuthorizer( self, "MyJwtAuthorizer", jwt_audience=Token.asList(my_mapping.find_in_map("MyRegionKey", "JwtAudiencesKey")), jwt_issuer="https://your-issuer.example.com", # 其他必要参数 )
如果映射的列表值是静态固定的,也可以直接手动写死列表值,但这种方法不适合动态区域映射的场景。
内容的提问来源于stack exchange,提问作者erik258
相关产品推荐
相关产品推荐

