首页 文章

AWS lambda api网关错误“格式错误的Lambda代理响应”

提问于
浏览
43

我正在尝试使用AWS lambda Build 一个hello world示例并通过api网关提供它 . 我点击了"Create a Lambda Function",它设置了api gatway并选择了Blank Function选项 . 我添加了在AWS gateway getting started guide上找到的lambda函数:

exports.handler = function(event, context, callback) {
  callback(null, {"Hello":"World"});  // SUCCESS with message
};

问题是当我向它发出GET请求时,它返回502响应 { "message": "Internal server error" } . 日志说"Execution failed due to configuration error: Malformed Lambda proxy response" .

9 回答

  • 2

    如果lambda用作代理,那么响应格式应该是

    {
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
    }
    

    注意:正文应该是字符串化的

  • 17

    我有这个错误,因为我不小心从CloudFormation AWS :: Serverless :: Api资源中删除了变量ServerlessExpressLambdaFunctionName . 这里的上下文是https://github.com/awslabs/aws-serverless-express "Run serverless applications and REST APIs using your existing Node.js application framework, on top of AWS Lambda and Amazon API Gateway"

  • 1

    如果您使用Go with https://github.com/aws/aws-lambda-go,则必须使用 events.APIGatewayProxyResponse .

    func hello(ctx context.Context, event ImageEditorEvent) (events.APIGatewayProxyResponse, error) {
        return events.APIGatewayProxyResponse{
            IsBase64Encoded: false,
            StatusCode:      200,
            Headers:         headers,
            Body:            body,
        }, nil
    }
    
  • 1

    对于在响应有效时挣扎的其他人 . 这不起作用:

    callback(null,JSON.stringify( {
      isBase64Encoded: false,
      statusCode: 200,
      headers: { 'headerName': 'headerValue' },
      body: 'hello world'
    })
    

    但这样做:

    callback(null,JSON.stringify( {
      'isBase64Encoded': false,
      'statusCode': 200,
      'headers': { 'headerName': 'headerValue' },
      'body': 'hello world'
    })
    

    此外,似乎不允许在响应对象上存在额外的键 .

  • 5

    一个非常特殊的情况,如果你直接传递 Headers ,你有可能有这个 Headers :

    "set-cookie": [ "........" ]

    但亚马逊需要这个:

    "set-cookie": "[ \\"........\\" ]"

  • 1

    来自AWS docs

    在Node.js中的Lambda函数中,要返回成功的响应,请调用callback(null,{“statusCode”:200,“body”:“results”}) . 要抛出异常,请调用callback(新错误('内部服务器错误')) . 对于客户端错误,例如,缺少必需参数,您可以调用callback(null,{“statusCode”:400,“body”:“Missing parameters of ...”})来返回错误而不抛出例外 .

  • 27

    是的所以我认为这是因为你实际上并没有在那里返回正确的http响应,这就是你得到错误的原因 .

    我个人使用一组这样的函数:

    module.exports = {
            success: (result) => {
                return {
                    statusCode: 200,
                    headers: {
                        "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
                        "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS
                    },
                    body: JSON.stringify(result),
                }
            },
            internalServerError: (msg) => {
                return {
                    statusCode: 500,
                    headers: {
                        "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
                        "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS
                    },
                    body: JSON.stringify({
                        statusCode: 500,
                        error: 'Internal Server Error',
                        internalError: JSON.stringify(msg),
                    }),
                }
            }
    } // add more responses here.
    

    然后你只需:

    var responder = require('responder')
    
    // some code
    
    callback(null, responder.success({ message: 'hello world'}))
    
  • 56

    如果以上内容对任何人都不起作用,尽管正确设置了响应变量,但我遇到了此错误 .

    我在我的函数中调用了一个RDS数据库 . 事实证明,导致问题的原因是该数据库上的安全组规则(入站) .

    您可能希望限制可以访问API的IP地址,但是如果您想让它快速/脏地工作以测试该更改是否修复它,您可以将其设置为接受所有这样的(您也可以设置端口上的范围也接受所有端口,但在本例中我没有这样做):

  • 0

    通常,当您看到 Malformed Lambda proxy response 时,表示您的Lambda函数的响应与API Gateway期望的格式不匹配,如下所示

    {
        "isBase64Encoded": true|false,
        "statusCode": httpStatusCode,
        "headers": { "headerName": "headerValue", ... },
        "body": "..."
    }
    

    如果您未使用Lambda代理集成,则可以登录API Gateway控制台并取消选中Lambda代理集成复选框 .

    此外,如果您看到间歇性的 Malformed Lambda proxy response ,则可能意味着您的Lambda函数的请求已被Lambda限制,并且您需要请求Lambda函数的并发执行限制增加 .

相关问题