我正在使用 API-Gateway + Lambda 组合来处理 POST 请求。我正在使用 Node + 无服务器框架。
当我离线运行无服务器时,我能够发送 POST 请求并将数据存储在 S3 上。但是,当我部署它并运行相同的 POST 请求时,我收到“502 内部服务器错误”消息。因为它可以在本地工作,但不能在生产环境中工作,所以我很确定我有一些权限/配置问题。
saveToS3(newData)
.then(result => {
callback(null, {
statusCode: 200,
headers: { 'Content-Type': 'application/json' },
body: "Successfully added data!"
});
})
.catch(e => callback(null, { statusCode: 500, body: JSON.stringify(e) }));
我检查过的内容:
- 响应正文是一个字符串
- 在响应中包含状态代码、正文、响应 header
- 使用回调模式返回我的响应(见上文)
我尚未检查的内容:
- 一个可能的原因是我的 API 网关 api 无权调用 lambda 函数。如何在
serverless.yml
文件中进行该设置?
我的yml:
service: myService
provider:
name: aws
runtime: nodejs12.x
iamRoleStatements:
- Effect: "Allow"
Action:
- "s3:GetObject"
- "s3:PutObject"
Resource: "arn:aws:s3:::myS3Bucket/*"
functions:
saveToS3:
handler: handler.saveToS3
events:
- http:
path: users
method: post
cors: true
plugins:
- serverless-offline
resources:
Resources:
NewResource:
Type: AWS::S3::Bucket
Properties:
BucketName: myS3Bucket
最佳答案
发现问题,捂脸,因为我花了几个小时才找到它。
我有两个问题:
我的主 lambda 函数前面有一个“async”,但我是通过回调来实现它的。删除“异步”修复了它。
我的响应格式缺少“ header ”和“isBase64Encoded”字段。包括删除了 502 错误(见下文)。
有用的链接: -https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format -(如果您使用无服务器框架)https://github.com/dherault/serverless-offline/issues/405
如果使用 API Gateway,请确保您的 lambda 函数的响应如下面的代码片段所示。否则,它将抛出“502 - Malformed Lambda Function”错误。
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
"body": "..."
}
关于amazon-web-services - 502 "Internal Server Error"部署时使用 API Gateway + Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59250196/