我在Python 3.7中有一个Lambda函数,它可以通过Boto 3显式地同步调用。它配置了5分钟的超时。当第一次调用正在进行一分钟时,第二次调用将使用另一个请求ID启动。又过了一分钟,请求再次被重试,这次它很快就完成了。因为它检测到系统状态已经改变。调用的示例序列
- 11:20:29至11:21:53 -日志流A -要求产品编号:68 cfbd 89 - 9 f4 c-4 e8 c-9de 0-b 9 e548983692
- 11:21:30至11:22:56 -日志流B -要求产品编号:1b 569 ffb-67 b8 - 4 e82 - 8 e99 - 46424 f45 e2 e5
- 11:22:30至11:22:33 -日志流A -要求产品编号:d9 d 60271 -4626- 43 ab-bb 3a-f14 be 057 af 13
从我的Lambda调用返回的请求ID是d9 d 60271 -4626- 43 ab-bb 3a-f14 be 057 af 13。
调用Lambda的堆栈如下:
- Jenkins正在运行一个Pipeline脚本。
- 该脚本运行一个Makefile,它执行两个连续的任务。
- 构建Docker容器
- 在容器内运行脚本。
- 在容器中运行的脚本是Python 3.7。它使用Boto 3调用一些AWS API,然后使用
InvocationType="RequestResponse"
调用lambda。
没有一个调用在退出时出现未处理的异常或任何明显的错误。拉姆达是在回我电话吗这个堆栈的任何其他元素,特别是Jenkins,是否可以“透明地”重试任务,如果是这样,我将如何确定这一点?
4条答案
按热度按时间jslywgbw1#
问题原来是由客户端的Boto 3引起的,而不是Lambda!当lambda在超过一分钟的时间内没有返回任何内容时,默认情况下Boto 3超时。为了解决这个问题,我不得不覆盖Boto的默认配置:
我演示这是一个客户端问题的方法是将参数reserved_concurrent_executions设置为1,从而防止并发执行我的Lambda,并注意到我从Boto获得了一个异常。
dldeef672#
这通常是由于在多次调用lambda时返回的超时读取而发生的。将--cli-read-timeout参数添加到aws lambda调用中,或者如果使用boto,则按照上面YitzikC的回答进行操作
对于aws命令,命令如下所示
aws lambda invoke --function-name <fn name> --cli-read-timeout 900 --log-type Tail --region <region> /dev/stdout
确保读取超时等于或大于lambda函数执行超时
trnvg8h33#
aws Jmeter 板上的Lamba函数超时配置是多次重试后的时间(这里是5分钟)。您的请求在分钟后重试,可能您的lamba客户端的超时默认为60秒/请求。因此,如果请求超过60秒,lamba将再次触发,直到达到5分钟超时。你需要增加lamba客户端超时。
在Ruby代码中检查类似的问题。https://stackoverflow.com/a/56986916/3551956
gg58donl4#
下面的代码是为我工作。两个函数的VPC设置相同,不需要实现下面的代码,单独运行子函数会成功执行,但是从父函数运行会给予readtimeout错误,所以将
connect_timeout
和read_timeout
的值都增加到900秒。