我一直在努力解决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}'}
我真的很想知道结果为何被包裹在体内-任何人都有任何想法吗?
答案 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-Type 是 text/html 而不是 application/json。并且您的正文格式为 string/html 而不是 json。 :)
一些有用的链接:
https://docs.aws.amazon.com/lambda/latest/dg/services-alb.html