【问题标题】:Publishing over 6000 messages to SNS from a lambda从 lambda 向 SNS 发布超过 6000 条消息
【发布时间】:2021-09-14 11:07:15
【问题描述】:

我有一个脚本,我们想在 AWS 中作为 Lambda 运行,用 Python 编写。这将每 24 小时运行一次。它描述了环境中的所有 ec2 实例,我正在检查一些细节以确保合规性。之后,我们希望将所有实例详细信息发送到其他类似合规脚本正在使用的 SNS 主题,这些主题被发送到 lambda 并从那里发送到 sumologic。我目前只使用一个环境进行测试,但是有超过 1000 个实例,因此有超过 1000 条消息要一一发布到 SNS。 lambda 在发送所有这些之前很久就超时了。一旦检查了所有环境及其实例,可能有近 6000 条消息要发布到 SNS。

我需要一些关于如何构建它以适应所有环境的建议。我在想也许将我的 lambda 中的所有记录放入一个 S3 存储桶中,然后创建另一个 lambda,它会从存储桶中读取每条记录,例如,一次 50 条,并将它们一个接一个地推送到 SNS 主题中。我也不确定这会如何工作。

任何想法表示赞赏!

【问题讨论】:

  • 我不明白发送超过 6000 条 SNS 消息需要超过 15 分钟,您的超时和内存设置是多少?
  • 可能每个 SNS 消息都在触发一个 Lambda,因此总并发数达到 1000 以上,因此超时
  • @Maurice 在将消息发送到 SNS 之前,他需要使用 SDK 从 1000 个 EC2 实例中读取详细信息。因此,除了 SNS 请求之外,还有很多查询正在进行。 AFAIK SNS 发布不支持批处理。所以如果你写错了你的代码,我猜即使有 900 秒的超时,它也很容易超时。

标签: python-3.x amazon-web-services amazon-ec2 aws-lambda amazon-sns


【解决方案1】:

我想你可以给你一个 SQS 队列来解决你的问题。

从 SNS 将消息发送到 SQS 队列。然后,您可以从 SQS 中 lambda 轮询消息(默认为 10,但您可以通过 cli 对其进行判定)。

【讨论】:

    【解决方案2】:

    我建议使用 Step Functions 来解决这个问题。即使您现在解决这个问题,迟早随着实例数量的增加或您想要执行单个 Lambda 的最长 900 秒运行时持续时间的额外步骤也将不再足够。


    使用 Step Functions 的简单方法可能是:

    第 1 步:创建一个 EC2 实例列表以使用第一个 Lambda 进行“检查”。可以是所有实例,也可以是带有特定标签的实例等。您可以随心所欲地发挥创意。

    第 2 步:使用 parallel step 处理此实例列表,每个实例 ID 调用一个 Lambda。

    第 3 步: 触发的 Lambda 从提供的 EC2 实例中读取详细信息,然后将结果发布到 SNS。发布到 SNS 可能已经有一个预定义的步骤,因此您无需自己编程。

    有了新的Workflow Studio,这应该相对容易实现。

    注意:这可能不会比单个 Lambda 快,但它会在扫描更多 EC2 实例时更好地扩展。这里唯一的瓶颈可能是第 1 步中的 Lambda。如果 Lambda 需要超过 15 分钟才能“找到”所有 EC2 实例进行“扫描”,那么您需要有点创意。但这是可以解决的。

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 2022-01-27
      • 2016-03-05
      • 2016-04-02
      • 2015-10-12
      • 2022-01-03
      • 2021-10-18
      • 2018-04-09
      • 2023-03-18
      相关资源
      最近更新 更多