AWS API 网关:状态代码 413,请求实体太大



我有一个带有AWS API Gateway和Lambda函数的服务器较少的API。我正在使用自定义授权功能进行授权。标题太大,因此我收到此错误。通常,对于nginx服务器,我会更改nging配置并修复此问题。我不知道如何在 AWS API 网关中解决这个问题。

10MB 有效负载限制适用于消息正文。如果您遇到标头大小的限制,很遗憾,无法配置这些限制。它们在 CloudFront 页面上说明:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html

特别:

自定义标头:标头名称的最大长度为 256 个字符

自定义标头:标头值的最大长度为 2,048 个字符

自定义标头:所有标头值和名称的最大长度为 10,240 个字符

有效负载大小的限制目前无法更改。从 https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html:

10MB 有效负载大小,目前无法更改。

如果您需要更多自定义,您应该在实际服务器上运行您的 API(例如使用 Amazon EC2)。

我发现压缩内容可以解决这个问题(代码灵感来自这篇博客文章 https://techblog.commercetools.com/gzip-on-aws-lambda-and-api-gateway-5170bb02b543)

请参阅使用Typescript的示例:

export async function getResponse(savedItems) {
  return new Promise<APIGatewayProxyResult>((resolve, reject) => zlib.gzip(JSON.stringify(savedItems), (error, gzippedResponse) => {
    if (error) {
      reject(error);
      console.error(error);
    } else {
      const response: APIGatewayProxyResult = {
        statusCode: 200,
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Credentials': true,
          'Content-Encoding': 'gzip',
        },
        isBase64Encoded: true,
        body: gzippedResponse.toString('base64'),
      };
      console.info(`response statusCode: ${response.statusCode} body length: ${response.body.length}`);
      resolve(response);
    }
  }));
}

如果有人在尝试上传文件时遇到此问题,请确保在 API 的"设置"部分中定义文件类型(在 API 网关中 API 名称下的树中)。在解决此问题时,我们遇到了此错误以及500和502。第一件事是 RDS 设置(我们在尝试编辑时调用读取器实例,而不是编写器)。接下来是我们的 API 设置中缺少的文件类型。这两个变化使我们达到了 200 - 所以请记住,413 错误有点欺骗性。对于上下文,我们将 API 网关与 Web 应用程序中的 lambda 函数一起使用。我希望这对某人有所帮助!

老问题,但是如果你在后端使用带有bodyParser中间件的Express JS,这可能是阻止你的原因。您可以通过在传递给 bodyParser的配置对象中定义 limit 属性来更新大小限制:

app.use(express.json({ limit: '200kb' }));

您可以将值更改为适合您需求的任何值,文档在这里。

相关内容

  • 没有找到相关文章

最新更新