导致格式错误的 Lambda 代理响应的原因以及如何修复它

当人们尝试使用 AWS API Gateway 和 AWS Lambda 构建无服务器应用程序时,经常出现的一个问题是_由于配置错误而执行失败:Lambda 代理响应格式错误。_

没有什么比通用错误消息更糟糕的了,它们不会告诉您解决问题所需的任何内容,对吧?AWS 并不是以其错误消息设计而闻名,如果甚至可以这样称呼它的话,更不用说为您提供解决问题的方法了。那么如何修复这个 Lambda 错误以及是什么原因造成的呢?

花椒壳-愿您平安健康 - 花椒壳资源网花椒壳资源网,资源下载,主要提供资源、设计素材、音乐、视频、图片等一切与互联网有关的资源icon-default.png?t=O83Ahttps://www.xinliu.vip

修复格式错误的 Lambda 代理响应

为了解决此问题,您需要更改 Lambda 函数返回的内容 。为此,您需要返回一个具有两个属性的对象:

statusCode

– 这是您要为客户端提供类型编号的 HTTP 状态代码。* ```
body

– 这是 string 类型的 HTTP 响应的内容。

如果您使用了异步函数,它应该如下所示:

exports.handler = async function(event, context) {
  return {statusCode: 200, body: "OK"};
};

如果你更喜欢 promise 类型的开发人员,它看起来像这样:

exports.handler = function(event, context) {
  return new Promise(function(resolove, reject) {
    resolve({statusCode: 200, body: "OK"});
  });
};

最后,如果你喜欢 callbacks,这将解决你的问题:

exports.handler = function(event, context, callback) {
  callback({statusCode: 200, body: "OK"});
};

了解格式错误的 Lambda 代理错误响应

---------------------

如果你有一些空闲时间,为什么不在此过程中了解一下错误的 “为什么”呢?

首先,_格式错误的 Lambda 代理响应_并不是真正的配置错误**,因为问题出在您的 Lambda 代码中**。但是,检查返回值的例程很可能还会检查可从外部配置的其他内容,例如从 AWS CloudFormation 配置的内容。

**但是该错误消息的代理部分呢?**

如果您在 AWS 控制台的 AWS API Gateway 中为 API 配置路由,则可以**为该路由选择集成**,在我们的例子中为 Lambda 集成。这种集成是 **AWS Lambda 和 AWS API Gateway 之间的粘合剂**。毕竟,Lambda 不仅可以用于处理 API Gateway 请求。

如果您通过 CloudFormation 配置路由,事情会变得更加清晰。

ExampleApi:
  ...
DefaultStage:
  ...
ExampleRoute:
  Type: AWS::ApiGatewayV2::Route
  Properties:
    ApiId:
      Ref: ExampleApi
    RouteKey: ANY /
    Target:
      Fn::Join:
        - integrations/
        - Ref: ProxyIntegration
ProxyIntegration:
  Type: AWS::ApiGatewayV2::Integration
  Properties:
    ApiId:
      Ref: ExampleApi
    IntegrationType: AWS_PROXY
    IntegrationUri:
      Fn::GetAtt:
        - ExampleFunction
        - Arn
    PayloadFormatVersion: "2.0"
ExampleRole:
  ...
ExampleFunction:
  Type: AWS::Lambda::Function
  Properties:
    Code:
      ZipFile:
        'exports.handler = async () => ({ statusCode: 200, body: "Example" });'
    Handler: index.handler
    Role:
      Fn::GetAtt:
        - ExampleRole
        - Arn
    Runtime: nodejs12.x
  DependsOn:
    - ExampleRole

我想你已经发现了这里的重要一点。我们在 AWS 控制台中创建的集成实际上是一种特定类型的集成,称为

AWS_PROXY

.它用于与许多 AWS 服务集成,并且 AWS 控制台具有一个很好的 UI,可以更轻松地与 Lambda 集成。

实际上有五种类型的 API Gateway 集成。3 个可用于 WebSockets 终端节点,2 个用于 HTTP 终端节点。

 HTTP 集成类型

----------

[](https://hackernoon.com/what-causes-malformed-lambda-proxy-response-and-how-to-fix-it-4t1d31ld)当您构建常规 HTTP API 时。

AWS_PROXY

与 Lambda 或其他 AWS 服务(如 Step Functions)集成。

HTTP_PROXY

将请求传递到另一个 HTTP 终端节点。WebSocket 集成类型

当您构建基于 WebSocket 的 HTTP API 时。

AWS

与 Lambda 集成。

HTTP

与其他(即第三方)HTTP API 集成。

MOCK

```

使 WebSocket 终端节点作为环回工作,而不涉及任何其他服务。

花椒壳-愿您平安健康 - 花椒壳资源网花椒壳资源网,资源下载,主要提供资源、设计素材、音乐、视频、图片等一切与互联网有关的资源icon-default.png?t=O83Ahttps://www.xinliu.vip

 总结

错误消息是开发人员的常见痛点,但解决方法通常非常简单。但是,如果您了解一些错误来源的背景信息,则有助于将来更快地修复它。

你可能感兴趣的:(汇编)