AWS CDK:使用LambdaIntegration的requestParameters传递字面量报错排查
API Gateway通过requestParameters传递字面量到Lambda失败问题排查
问题详情
尝试通过API Gateway集成的requestParameters将字面量值传递给Lambda函数,但部署失败。
当前使用的CDK代码:
myApigatewayResource.addMethod( 'GET', new apiGateway.LambdaIntegration( myLambdaFunctionHandler, { requestParameters: { 'integration.request.querystring.customvalue': '123456789' } } ), { methodResponses: [ { statusCode: '200' }, ] } );
执行cdk synth && cdk deploy时触发错误:
Invalid mapping expression specified: Validation Result: warnings : [], errors : [Invalid mapping expression specified: 123456789
根据LambdaIntegrationOptions官方文档:
将请求参数指定为键值对(字符串到字符串的映射),目标作为键,源作为值。
使用以下格式指定目标:integration.request.location.name,其中location可以是querystring、path或header,name是有效的唯一参数名称。
源必须是现有的方法请求参数或静态值。静态值必须用单引号括起来,并根据其在请求中的目标进行预编码。
代码看似符合文档要求,但仍报错,问题出在哪里?
问题原因及解决办法
问题核心是静态值的单引号未正确传递。在JS/TS代码中,直接写'123456789'会被解析为不带单引号的纯字符串,而API Gateway要求静态值本身必须包含单引号作为映射表达式的标识。
修正后的代码
myApigatewayResource.addMethod( 'GET', new apiGateway.LambdaIntegration( myLambdaFunctionHandler, { requestParameters: { // 用双引号包裹单引号,确保最终传递的值包含单引号 'integration.request.querystring.customvalue': "'123456789'" // 也可以用转义写法:\'123456789\' } } ), { methodResponses: [ { statusCode: '200' }, ] } );
解释
- JS/TS中,
"'123456789'"会被解析为字符串'123456789'(包含两端的单引号),这才符合API Gateway对静态值的格式要求。 - 原代码传递的是
123456789(无单引号),API Gateway会将其视为待解析的映射表达式而非静态值,因此抛出“Invalid mapping expression”错误。
内容的提问来源于stack exchange,提问作者fudo
相关产品推荐
相关产品推荐

