AWS Lambda python重置已断开的连接

时间:2016-05-27 07:33:13

标签: python amazon-web-services aws-lambda boto3

我有一个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日志中检索我的日志?我搜索了一个更好的解决方案,而不是在我的代有没有办法在全球范围内做到这一点?

由于

3 个答案:

答案 0 :(得分:1)

好的,终于可行了。事实上,我在重试过程中过于激进,但我需要尽快完成每项操作(例如:在可用时附加EBS)。在boto3中,有一种更简洁的方法可以等待资源准备就绪,而不是在代码中放入time.sleep(xx)。

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

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

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

我同意smdev的说法,将睡眠置于lambda函数中是不太好的(boto3服务员就像睡觉一样),但对我而言,只需几次调用Lambda函数即可。例如,当Autoscaling通知调用您的Lambda时。 如果您的Lambda直接由API Gateway(示例)以中等或高频率调用,那么这是一个非常糟糕的想法,但如果它每天只有2-3次就可以了。

答案 1 :(得分:0)

AWS clodwatch日志不会"覆盖"你自己的日志。请不要在lambda函数中睡觉,因为您也将为此付费。此外,如果请求率过高,您将收到$date = new Carbon("2016-05-30 15:35:00"); echo $date->toIso8601String(); 错误。

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

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

答案 2 :(得分:-2)

放置此等待配置的位置:

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

(正如你想要的那样)