当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda, API Gateway返回畸形Lambda代理响应,502错误

云炜
2023-03-14

经过大量的谷歌搜索和几个小时的尝试和错误,我找不到为什么我得到这个错误消息:

由于配置错误,执行失败:错误的Lambda代理响应

当我使用testlambda功能运行lambda时,它工作得很好。对类似问题的回答表明,lambda的响应需要满足此格式:

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

下面是我使用的lambda(遵循此格式):

'use strict';

var aws = require('aws-sdk');
var ses = new aws.SES();

var RECEIVER = "XXXX@XXXX.com";
var SENDER = "XXXX@XXXX.com";

const response_success = {
      'isBase64Encoded': false,
      'statusCode': 200,
      'headers': {
          'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        message: 'ok'
      }),
};

const response_error = {
    'isBase64Encoded': false,
    'statusCode': 400,
    'headers': {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        message: 'error'
    }),
};

exports.handler = (event, context, callback) => {
    sendEmail(event, function(error, data) {
        if (error) {
           callback(response_error);
        } else {
           callback(null, response_success);
        }
    });
};

function sendEmail(event, done) {
    var params = {
        Destination: {
            ToAddresses: [
                RECEIVER
            ]
        },
        Message: {
            Body: {
                Text: {
                    Data: event.message,
                    Charset: 'UTF-8'
                }
            },
            Subject: {
                Data: 'Lamda Test Email',
                Charset: 'UTF-8'
            }
        },
        Source: SENDER
    }
    ses.sendEmail(params, done);
}

我不认为这是一个配置问题,我正在使用Terraform来构建基础设施,如果这有什么帮助的话。提前谢谢!

编辑:(在下面添加了错误日志)

Execution log for request test-request
Fri May 05 16:36:22 UTC 2017 : Starting execution for request: test-invoke-request
Fri May 05 16:36:22 UTC 2017 : HTTP Method: POST, Resource Path: /messages
Fri May 05 16:36:22 UTC 2017 : Method request path: {}
Fri May 05 16:36:22 UTC 2017 : Method request query string: {}
Fri May 05 16:36:22 UTC 2017 : Method request headers: {}
Fri May 05 16:36:22 UTC 2017 : Method request body before transformations: { "message" : "test" }
Fri May 05 16:36:22 UTC 2017 : Endpoint request URI: https://lambda.eu-west-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-west-1:670603659598:function:mailer_lambda/invocations
Fri May 05 16:36:22 UTC 2017 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=****************************************************************************************************************************************************************************************************************************************************************************************************************************************cd4bef, X-Amz-Date=20170505T163622Z, x-amzn-apigateway-api-id=jnnd4wh3f8, X-Amz-Source-Arn=arn:aws:execute-api:eu-west-1:670603659598:jnnd4wh3f8/null/POST/messages, Accept=application/json, User-Agent=AmazonAPIGateway_jnnd4wh3f8, X-Amz-Security-Token=FQoDYXdzEPH//////////wEaDB1y8s+RanRAP61EAyK3A1f/o2BrYfqUOQwsrn7bRF6OMmeD3Se+WVWA1reC3tZZ6+IfnFa0LVNnaaNM27o/Vqc/m4tnQR5xUACK3I6ssbkwHj9E4sM3sQ4L+zNQSnkZhMAIRxbyxHJRp1E9/8XnVxRJAWF5ynWCmDxe2tQQ8SXCnQKIKzJypIgp0E0BD3hZ92soW6wID64uaufk+qYXiV7AJxd+Z9Gg1TyiwacUA2i0g4xsjDqeAA5wFbI9KoiYK6/+uwpQ5mxdxg6JIxS7H9jULRRn7V9E4YVXsXCWXh8RXqGmigGzWXChYAD3S7b9rBLUpTga3t3SlnnK [TRUNCATED]
Fri May 05 16:36:22 UTC 2017 : Endpoint request body after transformations: {"resource":"/messages","path":"/messages","httpMethod":"POST","headers":null,"queryStringParameters":null,"pathParameters":null,"stageVariables":null,"requestContext":{"accountId":"670603659598","resourceId":"90rzx3","stage":"test-invoke-stage","requestId":"test-invoke-request","identity":{"cognitoIdentityPoolId":null,"accountId":"670603659598","cognitoIdentityId":null,"caller":"670603659598","apiKey":"test-invoke-api-key","sourceIp":"test-invoke-source-ip","accessKey":"ASIAJA3SYDRPGE36PMXQ","cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":"arn:aws:iam::670603659598:root","userAgent":"Apache-HttpClient/4.5.x (Java/1.8.0_112)","user":"670603659598"},"resourcePath":"/messages","httpMethod":"POST","apiId":"jnnd4wh3f8"},"body":"{ \"message\" : \"test\" }","isBase64Encoded":false}
Fri May 05 16:36:22 UTC 2017 : Endpoint response body before transformations: {"errorMessage":"[object Object]"}
Fri May 05 16:36:22 UTC 2017 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=f91382de-31b0-11e7-bfaa-c7e2e3193355, Connection=keep-alive, Content-Length=34, X-Amz-Function-Error=Handled, Date=Fri, 05 May 2017 16:36:22 GMT, X-Amzn-Trace-Id=root=1-590caa06-47c0526e9aba46d52e47aee5;sampled=0, Content-Type=application/json}
Fri May 05 16:36:22 UTC 2017 : Execution failed due to configuration error: Malformed Lambda proxy response
Fri May 05 16:36:22 UTC 2017 : Method completed with status: 502

共有2个答案

卞嘉许
2023-03-14

不完全确定,但您应该返回一个结果,即使是一个错误,因为您使用的是statuscode

因此,更改回调(response_error);回调(空,响应错误);

艾星河
2023-03-14

谢谢你的帮助@johni和@UXDart。问题是api网关和lambda之间的集成请求正在转换请求主体(您可以在此处了解更多信息)

因此,我将处理程序更改为parse event.body,以便现在可以从事件中访问正确的数据。(注意:在lambda中测试此项会导致函数超时,因此需要从api网关进行测试)

以下是我所改变的:

exports.handler = (event, context, callback) => {
    const body = JSON.parse(event.body);

    sendEmail(body, function(error, data) {
        if (error) {
           callback(null, response_error);
        } else {
           callback(null, response_success);
        }
    });
};
 类似资料:
  • 我正在使用API网关和AWS Lambda与另一个AWS Lambda函数进行交换。 我应该在初次请求插入数据后发送响应,无论是成功还是失败。我正在使用API网关的特定路由。 结构是这样的: 现在我不断得到502畸形Lambda代理响应,这在我的API测试日志中: 问题是我返回了一个真实的回应。如前所述,我将API网关与lambda API一起使用,这是一个处理API网关路由(如Express)的

  • 在我的项目中,我创建了一个py函数,用于检查和修改我的谷歌日历,如下所示: 当我在lambda上测试它时,一切都完成了,但是当我从lambda创建API时: 并对其进行测试,结果是: 2017年12月20日星期三13:35:58 UTC:由于配置错误,执行失败:Lambda代理响应格式错误2017年12月20日星期三13:35:58 UTC:方法已完成,状态为:502 提前谢谢

  • 我试图在aws.lamda-service上的node.js中创建函数,并在函数控制台进行测试,效果良好,但当调用api时,它不能导出到外部,api网关错误“malformed Lambda proxy response”状态错误502 有什么想法吗

  • 同步调用:如果函数被同步调用并被限制,Lambda将返回429错误,调用服务将负责重试。ThrottledReason错误代码解释了您是遇到了功能级节流(如果指定)还是帐户级节流(请参见下面的注释)。每个服务都可能有自己的重试策略。例如,CloudWatch日志会重试失败的批处理多达五次,每次重试之间会有延迟。有关事件源及其调用类型的列表,请参阅支持的事件源。 参考文献 我不确定我对以上句子的理解

  • 我正在尝试使用AWS lambda设置一个hello world示例并通过api网关提供它。我单击了“创建Lambda函数”,它设置了api网关并选择了空白函数选项。我添加了在AWS网关上找到的lambda函数入门指南: 问题是,当我向它发出GET请求时,它会返回502响应{“message”:“Internal server error”}。日志显示“由于配置错误,执行失败:Lambda代理响应

  • 问题内容: 我正在尝试使用AWS Lambda建立一个hello world示例,并通过api网关为其提供服务。我单击了“创建Lambda函数”,这将设置api通道并选择了Blank Function选项。我添加了在AWS网关入门指南中找到的lambda函数: 问题是,当我向它发出GET请求时,它返回了502响应。并且日志显示“由于配置错误,执行失败:Lambda代理响应格式错误”。 问题答案: