5

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

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

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

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

但它在 cloudwatch 中是这样的:

返回响应:

{'statusCode': '200', 'body': '{\n "message": "Success",\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}'}

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

4

1 回答 1

0

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

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

您非常接近,但这些行是错误的:

"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。你的身体被格式化为字符串/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

于 2021-05-03T20:03:37.357 回答