Aws lambda 到达my code/lambda之前的API网关400
如何确保对URL的请求中包含任何(坏)查询字符串数据,并将其发送到api网关后面的lambda,而不被api网关阻止? 我在API网关上有一个端点,它响应如下请求,其中查询字符串参数url应该存在 查询字符串参数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
接收一个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
,而在其他情况下,您会有,但这并不难处理。您是否创建了一个映射模板来发送该参数?