AWS Lambda python 重置断开的连接

AWS Lambda python Resetting dropped connection

我有一个 AWS Python Lambda,它为我的基础设施管理资源标签(在 AWS API 上使用 boto3 进行的许多调用)。该功能在我的笔记本电脑上运行良好,在 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 日志中的日志?我搜索了一个比在我的代码中放置多个睡眠更好的解决方案。有没有办法在全球范围内做到这一点?

谢谢

AWS clodwatch 日志不会 "overwrite" 您自己的日志。请不要睡在 lambda 函数中,因为您也会为此付费。此外,如果请求率太高,您将收到 RequestLimitExceeded 个错误。

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

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

希望这能说明问题。

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

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

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

使用此参数,您可以避免 lambda 发送这样的日志 "Resetting dropped connection: ec2.us-west-2.amazonaws.com",并以最快的方式执行您的 Lambda。

我同意 smdev 的说法,将 sleep 放在 lambda 函数中不是一个好主意(boto3 waiter 就像 sleep 一样),但对我来说,当你的 Lambda 函数只被调用几次时,这是可以接受的。例如,当自动缩放通知调用您的 Lambda 时。 如果您的 Lambda 被 API 网关(示例)以中等或高频率直接调用,这是一个非常糟糕的主意,但如果每天只有 2-3 次,那没关系。

将此等待配置放在哪里:

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

(这个参数你想要的)