AWS Lambda python正在重置断开的连接

2024-05-19 06:47:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个AWS Python Lambda,它为我的基础设施管理资源标签(很多使用boto3的AWS API调用)。在我的笔记本电脑上执行的这个功能在Lambda下运行良好。但是当我在Lambda下执行它时,我的所有日志(调试或错误级别)都不会发送到cloudwatch日志。而不是像这样有多个日志:

Resetting dropped connection: ec2.us-west-2.amazonaws.com
Resetting dropped connection: ec2.us-west-2.amazonaws.com

Google告诉我,这是urlib3的问题,而且AWS API的请求频率太高。

我的问题是,如何避免在Lambda中检索我在cloudwatch日志中的日志?我寻找一个更好的解决方案,而不是将多个睡眠放在我的代码中。有办法在全球范围内做到这一点吗?

谢谢


Tags: lambdacomawsapi基础设施标签资源connection
3条回答

好吧,终于成功了。实际上,我在重试过程中过于激进,但我需要尽快执行每个操作(例如:在可用时附加一个EBS)。在boto3中,有一种更干净的方法可以等到资源准备好,而不是在代码中添加time.sleep(xx)。

解决方案是使用boto3 waiter 我的建议是为重试间隔设置一个自定义值,因为默认值是15s(太长)。

waiter.config.delay = 1
waiter.config.max_attempts = 10(as you want for this param)

使用此参数,您可以避免lambda发送类似“重置断开的连接:ec2.us-west-2.amazonaws.com”这样的日志,并以最快的方式执行lambda。

我同意smdev的说法,他说把sleep放在lambda函数中不是一个好主意(boto3-waiter是一个类似于sleep的函数),但是对我来说,当lambda函数只被调用了很少的时间时,它是可以接受的。例如,当自动缩放通知调用Lambda时。 如果您的Lambda是由API网关(例如)以中等或高频率直接调用的,这是一个非常糟糕的主意,但如果它只是每天2-3次,就可以了。

AWS clodwatch日志不会“覆盖”您自己的日志。请不要在lambda函数中睡觉,因为您也会为此付费。另外,如果请求率太高,则会出现RequestLimitExceeded错误。

有一些方法可以避免这种情况:

  1. 检查并删除正在紧密循环中调用AWS API的任何boto代码(for/while)
  2. 在boto代码中使用迭代器、MaxResults和分页来获取项的列表/集合,而不是查询单个项
  3. 在两个lambda之间使用sqs(对于存在异步依赖关系的情况)。例如,如果删除未使用的AMI的-one lambda来标识和注销AMI,并将相关快照推送到sqs。从sqs读取和删除快照的第二个lambda。

希望这能澄清。

在何处放置此等待配置:

waiter.config.delay = 1
waiter.config.max_attempts = 10

(根据您对此参数的需要)

相关问题 更多 >

    热门问题