amazon-web-services - 502 "Internal Server Error"部署时使用 API Gateway + Lambda

标签 amazon-web-services aws-lambda aws-api-gateway serverless-framework

我正在使用 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/

相关文章:

amazon-ec2 - 如何设置和提供类似失败鲸鱼的服务器过载页面?

amazon-web-services - 具有自定义授权方的无服务器 lambda 单元测试处理程序

node.js - 直接从 Lambda/tmp 文件夹播放音频

javascript - npm 安装与 AWS Lambda

amazon-web-services - IPV6 Web 服务器无法访问

python - 使用多个 list 文件从 S3 加载到 Redshift?

aws-cloudformation - 部署我的 AWS API Gateway 时失败并显示 "The domain name you provided already exists",但我在任何地方都找不到它

amazon-web-services - 使用 Lambda 授权者的 AWS Cognito 和 API 网关

amazon-web-services - 如何使用 AWS ApiGateway HttpApi 调用 lambda 异步

python - 我们可以在调用时设置 AWS python lambda 的环境变量吗