当人们尝试使用 AWS API Gateway 和 AWS Lambda 构建无服务器应用程序时,经常出现的一个问题是_由于配置错误而执行失败:Lambda 代理响应格式错误。_
没有什么比通用错误消息更糟糕的了,它们不会告诉您解决问题所需的任何内容,对吧?AWS 并不是以其错误消息设计而闻名,如果甚至可以这样称呼它的话,更不用说为您提供解决问题的方法了。那么如何修复这个 Lambda 错误以及是什么原因造成的呢?
修复格式错误的 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 终端节点作为环回工作,而不涉及任何其他服务。
总结
错误消息是开发人员的常见痛点,但解决方法通常非常简单。但是,如果您了解一些错误来源的背景信息,则有助于将来更快地修复它。