gpt4 book ai didi

python - 无法使用 API 网关运行 AWS Lambda 函数

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:13 25 4
gpt4 key购买 nike

我创建了一个简单的 python 3.7 lambda 函数:

import json
import boto3

s3 = boto3.client("s3")


def lambda_handler(event, context):
bucket = "nubi-data"
key = "core/user.json"

try:
data = s3.get_object(Bucket=bucket, Key=key)
json_data = data['Body'].read()

#return json_data

return {
'statusCode': 200,
"headers": {"Content-Type": "application/json"},
'body': json.loads(json_data)
}


except Exception as e:
print(e)
raise e

此函数从 s3 存储桶中读取一个 json 文件。 json 文件如下所示:

{ "id": 1, "name": "John", "pwd": "password" }

当我在 AWS 控制台的函数编辑器屏幕中进行测试时,该函数运行成功,输出如下: enter image description here

Response: { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": { "id": 1, "name": "John", "pwd": "password" } }

Request ID: "f57de02f-44dd-4854-9df9-9f3a8c90031d"

Function Logs: START RequestId: f57de02f-44dd-4854-9df9-9f3a8c90031d Version: $LATEST END RequestId: f57de02f-44dd-4854-9df9-9f3a8c90031d REPORT RequestId: f57de02f-44dd-4854-9df9-9f3a8c90031d Duration: 260.70 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 84 MB

但是当我从 API 网关测试函数时,我得到了错误
enter image description here

Thu Mar 21 21:04:08 UTC 2019 : Endpoint response body before transformations: {"statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": {"id": 1, "name": "John", "pwd": "password"}} Thu Mar 21 21:04:08 UTC 2019 : Execution failed due to configuration error: Malformed Lambda proxy response Thu Mar 21 21:04:08 UTC 2019 : Method completed with status: 502

最佳答案

改变

'body': json.loads(json_data)

'body': json.dumps(json_data)

API Gateway 需要一个字符串作为输出,而 json.dumps 正是这样做的。另一方面,json.loads 从字符串创建 JSON。如果您了解 NodeJS,它们分别相当于 JSON.stringify 和 JSON.parse。

示例

json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])

产生

'["foo", {"bar": ["baz", null, 1.0, 2]}]'

同时

json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')

产生

[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]

此信息可在 official docs 中找到

编辑

OP 和我都错过的另一件事是 data['Body'].read() 不返回 JSON 本身,而是返回一个缓冲区。它需要先解码。

json_data = data['Body'].read().decode('utf-8') 将返回字符串化的 JSON(当然只是因为您的文件是 JSON),所以在你的返回声明中你应该能够简单地这样做:

return {
'statusCode': 200,
"headers": {"Content-Type": "application/json"},
'body': json_data
}

关于python - 无法使用 API 网关运行 AWS Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55289382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com