我有一个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日志中的日志?我寻找一个更好的解决方案,而不是将多个睡眠放在我的代码中。有办法在全球范围内做到这一点吗?
谢谢
好吧,终于成功了。实际上,我在重试过程中过于激进,但我需要尽快执行每个操作(例如:在可用时附加一个EBS)。在boto3中,有一种更干净的方法可以等到资源准备好,而不是在代码中添加time.sleep(xx)。
解决方案是使用boto3 waiter 我的建议是为重试间隔设置一个自定义值,因为默认值是15s(太长)。
使用此参数,您可以避免lambda发送类似“重置断开的连接:ec2.us-west-2.amazonaws.com”这样的日志,并以最快的方式执行lambda。
我同意smdev的说法,他说把sleep放在lambda函数中不是一个好主意(boto3-waiter是一个类似于sleep的函数),但是对我来说,当lambda函数只被调用了很少的时间时,它是可以接受的。例如,当自动缩放通知调用Lambda时。 如果您的Lambda是由API网关(例如)以中等或高频率直接调用的,这是一个非常糟糕的主意,但如果它只是每天2-3次,就可以了。
AWS clodwatch日志不会“覆盖”您自己的日志。请不要在lambda函数中睡觉,因为您也会为此付费。另外,如果请求率太高,则会出现
RequestLimitExceeded
错误。有一些方法可以避免这种情况:
MaxResults
和分页来获取项的列表/集合,而不是查询单个项希望这能澄清。
在何处放置此等待配置:
(根据您对此参数的需要)
相关问题 更多 >
编程相关推荐