1

语境

我正在尝试使用 AWS HTTP 网关访问 AWS lambda。我目前正在使用 AWS Lamda 代理。

我了解以下请求有效负载限制已到位。

  • HTTP 网关负载限制 = 10 MB
  • Lambda 有效负载限制 = 6 MB

问题

如果请求有效负载大小 > 10 MB,HTTP 网关会返回 HTTP 413 状态代码,我可以捕获它以在客户端显示有效的错误消息。到目前为止一切都很好。

但是,如果负载大小 > 6MB 但 < 10MB,则 lambda 会失败,因为请求超出了 6MB 限制。在这种情况下,HTTP 客户端会收到 500 HTTP 错误代码,而不是预期的 413。

问题

当 lambda 的 6MB 请求有效负载限制达到时,有什么方法可以自定义 HTTP 响应?

4

3 回答 3

0

您可以在 API Gateway 中处理 Lambda 错误,将标准 Lambda 错误映射到方法响应,您可以在其中为给定的 Lambda 错误配置 HTTP 状态代码。

于 2020-08-08T07:55:19.127 回答
0

我希望我也可以控制该配额,但看起来不允许这样做。

调用负载(请求和响应)

  1. 6 MB(同步)
  2. 256 KB(异步)

https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html

否则,您可以将 Lambda 正文作为 gzipped 返回

const zlib = require('zlib')

zlib.gzip(JSON.stringify({
  ...
}), function (error, gzippedJSON) {
  if (error) context.fail(error)
  const response = {
    statusCode: 200,
    isBase64Encoded: true,
    headers: {
      'Content-Type': 'application/json',
      'Content-Encoding': 'gzip',
      'Access-Control-Allow-Headers': 'Content-Type',
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
    },
    body: gzippedJSON.toString('base64')
  }
  context.succeed(response)
})

但在这种情况下,您应该稍微更改 API 网关的设置。

请参考这里。https://medium.com/@janrubio/api-gateway-lambda-compression-86f61deed6a5

于 2020-08-30T02:46:26.190 回答
0

您是否考虑过使用预签名的网址?这样可以避免负载限制,但客户端和服务器端都需要更改代码,尽管应该是小的更改。这个想法是客户端向API发送一个http GET请求触发lambda,一个预签名的url由lambda生成并返回给客户端,最后客户端直接上传到s3,绕过lambda有效负载限制

但我想我可能没有理解你的要求..

于 2020-08-08T10:23:12.790 回答