无法通过API Gateway运行AWS Lambda函数

时间:2019-03-21 21:16:33

标签: python python-3.x amazon-s3 aws-lambda

我创建了一个简单的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”:“密码”}

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

  

响应:{“ statusCode”:200,“ headers”:{       “ Content-Type”:“ application / json”},“ body”:{       “ id”:1       “ name”:“ John”,       “ pwd”:“密码”}}

     

请求ID:“ f57de02f-44dd-4854-9df9-9f3a8c90031d”

     

功能日志:START RequestId:f57de02f-44dd-4854-9df9-9f3a8c90031d   版本:$ LATEST END RequestId:f57de02f-44dd-4854-9df9-9f3a8c90031d   报告RequestId:f57de02f-44dd-4854-9df9-9f3a8c90031d持续时间:   260.70 ms计费时间:300 ms内存大小:128 MB使用的最大内存:84 MB

但是当我从API网关测试功能时,出现错误
enter image description here

  

UTC 2019年3月21日21:04:08:端点响应正文之前   转换:{“ statusCode”:200,“ headers”:{“ Content-Type”:   “ application / json”},“ body”:{“ id”:1,1,“ name”:“ John”,“ pwd”:   “ password”}}周三3月21日21:04:08 UTC:由于执行失败   配置错误:Lambda代理响应格式错误,3月21日,星期四   21:04:08 UTC 2019:方法完成,状态:502

1 个答案:

答案 0 :(得分:1)

更改

'body': json.loads(json_data)

'body': json.dumps(json_data)

API网关期望将字符串作为输出,而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语句上,您应该能够像这样简单地做到这一点:

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