当前位置: 首页 > 知识库问答 >
问题:

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

聂建茗
2023-03-14

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

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

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

功能日志:开始请求ID:f57de02f-44dd-4854-9df9-9f3a8c90031d版本:$最新结束请求ID:f57de02f-44dd-4854-9df9-9f3a8c90031d报告请求ID:f57de02f-44dd-4854-9df9-9f3a8c90031d持续时间:260.70毫秒计费持续时间:300毫秒内存大小:128 MB最大使用内存:84 MB

2019年3月21日星期四21:04:08 UTC:转换前的endpoint响应正文:{“statusCode”:200,“Header”:{“Content Type”:“application/json”},“body”:{“id”:1,“name”:“John”,“pwd”:“password”}2019年3月21日星期四21:04:08 UTC:由于html" target="_blank">配置错误,执行失败:Lambda代理响应格式错误2019年3月21日星期四21:04:08 UTC:方法已完成,状态为:502

共有1个答案

柳豪
2023-03-14

改变

'body': json.loads(json_data)

'body': json.dumps(json_data)

API网关期望一个String作为输出,而json.dumps正是这样做的。另一方面,json.loads从String中创建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',无,1.0,2]}]

这些信息可以在官方文档中找到

编辑

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
     }
 类似资料:
  • 我正在研究一个示例poc,我正在尝试集成Spring云api网关 在我的pom.xml中,我有 在我的应用程序中。yml我有 在我的主课上 我能够直接从它们各自的端口访问服务,但是当我试图从端口网关端口ie 9191访问api时,我得到 ***2022-09-08 16:23:34.644错误4128-[ctor-http-nio-3]a . w . r . e . abstracterrorwe

  • 我有一个aws lambda函数,它返回以下响应: 但是我在前端角度应用程序中得到以下误差。 CORS策略阻止从来源“HTTP://127.0.0.1:8080”访问位于“https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/price”的XMLHttpRequest:对飞行前请求的响应没有通过访问控制检查:它没有HTTP ok状态。

  • 我正在研究一个烧瓶API,它工作得很好。我现在试图用uWSGI替换Flask开发服务器,但一切都崩溃了。我试图解决这个问题,因为2天,通过教程和搜索这里,但找不到一个解决问题的方法。这是代码:app.py 当我用运行这个函数时,它工作得很好。 现在我只是尝试使用UWSGI获得相同的结果: 命令行消息看起来很好: 命令行消息 我试过所有想到的事情,但都没能解决这个问题。我做的一些事情是: > 包括以

  • 我正在GKE上运行Kong API网关,并试图添加自己的服务。 我有3个豆荚 和2个服务(节点端口) (80/443/8080端口打开) 8000/8001/8443)代理 我试图添加api到API网关使用 curl-i-X柱http://kong-proxy:8001/apis-d'name=test'-d'uris=/'-d'上游\u url=http://apiindex/' 但是然后返回

  • 现在我的要求是,每当我通过API获取数据时,我必须将其保存到2-3个不同的地方(例如,保存到我自己的数据库中,保存到某个BI服务中,有时还保存到日志数据库中)。 我不知道是否可以将单个资源和单个方法绑定到多个lambda函数中。因此,我的替代方法是,因为我已经知道如何通过订阅SNS主题来触发多个lambda函数,我想如果我能从API网关发布到SNS主题,剩下的就容易了。我现在的想法是: 但问题是,

  • Spring Boot主应用程序 全堆栈跟踪