我收到ALB Lambda错误-502错误网关

时间:2019-02-20 12:32:40

标签: python-3.x aws-lambda aws-application-load-balancer

我一直在努力解决alb 2 lambda 502错误的网关错误。 在我的ALB访问日志中,它显示一个“ LambdaInvalidResponse”,我猜这是因为我的lambda返回了无效的响应。这应该很容易解决,但是我无法一辈子弄清楚。有人可以帮忙:)。

在我的python代码中,我返回以下内容:

  

new_response = {“ statusCode”:200,“ statusDescription”:“ 200 OK”,   “ isBase64Encoded”:否,“ headers”:{“ Content-Type”:“ text / json;   charset = utf-8“}

new_response['body'] = '{"name":"function1"}'
return new_response

但是在cloudwatch中却是这样的:

回覆:

  

{'statusCode':'200','body':'{\ n“ message”:“成功”,\ n“ response”:   {\ n“ body”:“ {\” name \“:\” function1 \“}”,\ n“ headers”:{\ n   “ Content-Type”:“ text / json; charset = utf-8” \ n},\ n“ isBase64Encoded”:   false,\ n“ statusCode”:200,\ n“ statusDescription”:“ 200 OK” \ n} \ n}'}

我真的很想知道结果为何被包裹在体内-任何人都有任何想法吗?

1 个答案:

答案 0 :(得分:0)

我真的很想知道为什么结果会被包裹在身体里——有人有什么想法吗?

您正在查看的正文来自 cloudwatch 收到的请求(其中包含有关触发它的事件的信息。您的 lambda 的请求正文只是这些信息之一),而不是来自您的 lambda 本身的正文(请注意,您的 lambda 的正文位于 cloudwatch 请求的 response 字段内,该字段位于收到的 cloudwatch 请求的 body 键内。

你已经很接近了,但这些行是错误的:

"headers": { "Content-Type": "text/json; charset=utf-8" } }
new_response['body'] = '{"name":"function1"}'

如果您希望在 ALB lambda 上返回 JSON,正确的做法应该是:

    "headers": { "Content-Type": "application/json; charset=utf-8" } }
    new_response['body'] = json.dumps({"name":"function1"})

例如:

          import json

          def handler(event, context):
            msg = "Hello world from lambda!"
       
            response = {
                "statusCode": 200,
                "statusDescription": "200 OK",
                "isBase64Encoded": False,
                "headers": {
                    "Content-Type": "application/json"
                },
                "body": json.dumps({"myMsg": msg}) 
            }
            
            return response

如果您检查 cloudwatch 日志,您可能会收到 LambdaUserError

如果你想返回一个文本而不是 JSON,它应该是这样的:

 def handler(event, context):
        response = {
          "statusCode": 200,
          "statusDescription": "200 OK",
          "isBase64Encoded": False,
          "headers": {
            "Content-Type": "text/html"
           },
          "body": "<h1>Hello world from Lambda!</h1>"
        }
        return response

在这种情况下,Content-Typetext/html 而不是 application/json。并且您的正文格式为 string/html 而不是 json。 :)

一些有用的链接:

https://docs.aws.amazon.com/lambda/latest/dg/services-alb.html

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html