API Gateway请求体验证未触发,无效请求致Lambda返回502
问题排查与修复方案:API Gateway请求体验证未拦截无效请求
以下是常见问题原因及对应的CloudFormation配置修正方法:
核心排查点
- 验证器未绑定到目标方法:仅创建RequestValidator但未关联到POST端点方法,导致验证逻辑根本未触发
- 请求模型与Content-Type不匹配:Model配置的ContentType和实际请求头的Content-Type不一致,API Gateway会直接跳过验证
- 验证器参数配置错误:RequestValidator的
ValidateRequestBody未设为true,仅开启了请求参数验证而非请求体验证
修正后的CloudFormation配置示例
1. 正确定义请求体验证器
确保明确开启请求体校验:
BodyRequestValidator: Type: AWS::ApiGateway::RequestValidator Properties: Name: PostBodyValidator RestApiId: !Ref YourRestApi ValidateRequestBody: true # 必须设为true才会触发请求体验证 ValidateRequestParameters: false # 不需要验证URL参数可设为false
2. 在POST方法中绑定验证器与请求模型
关键是在Method资源中添加RequestValidatorId和RequestModels关联配置:
PostEndpointMethod: Type: AWS::ApiGateway::Method Properties: RestApiId: !Ref YourRestApi ResourceId: !Ref YourApiResource HttpMethod: POST AuthorizationType: NONE # 根据实际授权方式调整 RequestValidatorId: !Ref BodyRequestValidator # 将验证器绑定到当前方法 RequestModels: application/json: !Ref YourRequestBodyModel # 关联对应Content-Type的校验模型 Integration: Type: AWS_PROXY IntegrationHttpMethod: POST Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${YourLambda.Arn}/invocations IntegrationResponses: - StatusCode: 200 PassthroughBehavior: WHEN_NO_MATCH
3. 确认Model的ContentType匹配
你的Model必须指定与请求一致的Content-Type:
YourRequestBodyModel: Type: AWS::ApiGateway::Model Properties: RestApiId: !Ref YourRestApi Name: PostBodyModel ContentType: application/json # 必须和请求头的Content-Type完全一致 Schema: type: object required: ["key1", "key2"] properties: key1: type: string key2: type: integer
验证步骤
- 部署更新后的CloudFormation栈
- 发送带有错误格式请求体的POST请求,确保请求头携带
Content-Type: application/json - 此时API Gateway应直接返回
400 Bad Request并包含验证错误信息,不会将请求转发至Lambda
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

