首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS Lambda -车身尺寸误差太大,但车身尺寸限制。

AWS Lambda -车身尺寸误差太大,但车身尺寸限制。
EN

Stack Overflow用户
提问于 2021-04-06 15:12:38
回答 2查看 10.9K关注 0票数 3

我使用lambda函数为REST提供服务。在一个端点中,我得到了打印到cloudwatch日志中的“身体大小太长”。

我从函数中得到的响应是状态代码502,响应体{ "message":“内部服务器错误”}。如果我调用同一个端点,但使用了一个过滤器,那么响应体大小为2.26MB,并且可以工作。这就排除了我遇到异步响应体限制的可能性。

错误时响应体大小为5622338字节(5.36MB)。

我是这样计算响应大小的(python2.7):

代码语言:javascript
复制
import urllib2
...

out = {}
resp = urllib2.urlopen(req)
out.statusCode = resp.getcode()
out.body = resp.read()
print("num bytes: " + str(len(bytearray(out.body, 'utf-8'))))

所公布的用于同步调用的最大响应体大小为6MB。据我所知,我不应该收到这个错误。https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html

其他信息:

持续时间: 22809.11毫秒记帐持续时间: 22810毫秒内存大小:使用138MB最大内存: 129兆比特持续时间: 1322.71毫秒

任何帮助都将不胜感激。

更新4/22/21

经过进一步的研究,我发现如果响应的大小是1,048,574字节(0.999998 MB)或更多,lambda函数就会出错。

如果响应为1,048,573字节(0.999997 MB)或更少,它就能工作。

我就是这样回复的。我硬编码视图函数以返回特定大小的字节数组。例如。

代码语言:javascript
复制
return bytearray(1048573)

我打开了我正在使用的AWS网关阶段的日志记录,下面的错误被写入日志。这意味着该函数正在出错。不是调用函数: Lambda执行失败,状态200由于客户函数错误:主体大小太长。

据我理解,AWS Lambda函数的最大响应大小为6MB,AWS网关的最大响应大小为10 6MB。

AWS :调用有效负载响应https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html

API网关:用于配置和运行REST ->有效负载大小https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html的API网关配额

我是不是误解了限制?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-10 20:25:47

我为python3.7创建了一个新的lambda函数,发现它返回了一个更具描述性的错误。我能够确定在lambda函数离开lambda函数后,lambda函数在响应的大小上增加了大约1MB,这解释了为什么它在lambda函数中出错,而不是在端点代码中。在一种情况下,它添加了.82MB,而另一种情况则添加了.98MB。这似乎是基于反应的大小。我怀疑响应是得到base64编码、URL编码或类似的东西。我没有找到能够回答这个问题的文档,并且在接收端没有以任何方式编码响应。

用python3.7:构建lambda函数返回的错误消息

响应有效负载大小(8198440字节)超过了允许的最大有效负载大小(6291556字节)。

Lambda函数代码:

代码语言:javascript
复制
import requests, base64, json

def lambda_handler(event, context):
    
    headers = {...}
    url = ...
    
    response = requests.get(url, headers=headers)
    
    print (len(response.content))
    print (len(response.content.decode("utf-8")))

    
    return response.content.decode('UTF-8')

下面是在lambda函数中打印响应的大小,以及由lambda在错误消息中确定的响应大小。

我使用这两个print语句来确定响应的大小,这两个print语句总是返回相同的长度。Response.content是一个字节数组,所以我的想法是,获取它的长度将返回响应中的字节数: print (len(response.content) print (len(response.content.decode(“utf-8”)

Ex 1.

在lambda函数中打印时的大小:

7,165,488 (6.8335 MB)

大小,如错误消息中定义的:

8,198,440 (7.8186 MB)

额外:

1,032,952 (0.9851 MB)

错误信息:

响应有效负载大小(8198440字节)超过了允许的最大有效负载大小(6291556字节)。

ex2.lambda函数内打印时的大小:

5,622,338 (5.3619 MB)

大小,如错误消息中定义的:

6,482,232 (6.1819 MB)

额外:

859,894 (0.820059 MB)

错误信息:

响应有效负载大小(6482232字节)超过了允许的最大有效负载大小(6291556字节)。

我决定将端点代码中的软限制再降低1MB (4.7MB),以防止在lambda函数中达到限制。

票数 5
EN

Stack Overflow用户

发布于 2021-07-26 17:34:44

在金刚也试过了。events.APIGatewayV2HTTPResponse.Body可以是~5.300.000字节(没有测试确切的限制)。值在lambda函数(len(resp.Body))内测量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66971400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档