Aws lambda 到达my code/lambda之前的API网关400

Aws lambda 到达my code/lambda之前的API网关400,aws-lambda,aws-api-gateway,serverless-framework,serverless,aws-serverless,Aws Lambda,Aws Api Gateway,Serverless Framework,Serverless,Aws Serverless,如何确保对URL的请求中包含任何(坏)查询字符串数据,并将其发送到api网关后面的lambda,而不被api网关阻止? 我在API网关上有一个端点,它响应如下请求,其中查询字符串参数url应该存在 查询字符串参数url接收一个url,该url通常是url编码的,因此不是问题。其他情况下,URL到达时未编码,因此可能存在非URL安全字符 不幸的是,我是其他偶尔向我发送坏数据的服务的下游,这个特定跃点的责任之一是检测并尝试纠正/清理它。我无法阻止对包含非url安全字符的API网关终结点的请求 问题

如何确保对URL的请求中包含任何(坏)查询字符串数据,并将其发送到api网关后面的lambda,而不被api网关阻止?

我在API网关上有一个端点,它响应如下请求,其中查询字符串参数url应该存在

查询字符串参数
url
接收一个url,该url通常是url编码的,因此不是问题。其他情况下,URL到达时未编码,因此可能存在非URL安全字符

不幸的是,我是其他偶尔向我发送坏数据的服务的下游,这个特定跃点的责任之一是检测并尝试纠正/清理它。我无法阻止对包含非url安全字符的API网关终结点的请求

问题是,如果URL中存在坏数据,API网关似乎会拒绝请求,并且不会将其转发给我的lambda,即使它使用lambda代理,而且我还没有在API网关级别设置任何我知道的阻止请求通过的设置

如果以问题底部的无服务器框架为例,可以很容易地复制它

只需部署然后访问

您将看到预期的text/html响应

但是,如果您要访问以下未编码的{和}(正如我的端点通常接收到的那样),您将看到API网关返回400状态响应,并且似乎没有将请求转发给lambda函数

我在api网关控制台中勾选了“启用CloudWatch日志”,创建了一个日志组,但它似乎没有获得任何记录,因此这似乎是一条死胡同

我尝试过区域和边缘优化的端点,api网关和cloudfront的响应都是一样的

我如何确保对URL的请求中包含任何(错误的)查询字符串数据,并将其发送到api网关后面的lambda,而不被api网关阻止


下面是一个样板,如果您愿意的话,可以使用无服务器框架来演示一个工作示例


serverless.yml

---
service: example-400
frameworkVersion: '2'

provider:
  name: aws
  runtime: nodejs12.x

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: /
          method: get

handler.js

'use strict';

module.exports.hello = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Go Serverless v1.0! Your function executed successfully!',
        input: event,
      },
      null,
      2
    ),
  };
};
然后跑

serverless deploy

您可以在
serverless.yml
文件中为同一lambda函数设置多个http事件

每个http事件都可以有自己的定义和/或路径,让您有机会根据用户点击的端点捕获事件,即使有或没有查询参数:

# 'functions' in serverless.yml
functions:
  createUser: # Function name
    handler: handler.users # Reference to file handler.js & exported function 'users'
    events: # All events associated with this function
      - http:
          path: users/create
          method: post
      - http:
          path: users/update
          method: put
      - http:
          path: users/delete
          method: delete
为您需要的函数定义一个http事件,并为您需要的每个路径声明一个http事件(带或不带查询参数)


诀窍在于lambda本身,您必须设置一些条件或
try/catch
语句来处理这样一个事实:在某些情况下,您不会有
queryparam
,而在其他情况下,您会有,但这并不难处理。

您是否创建了一个映射模板来发送该参数?