从 lambda 向 SNS 发布超过 6000 条消息

Publishing over 6000 messages to SNS from a lambda

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

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

任何想法表示赞赏!

我想你可以使用 SQS 队列来解决你的问题。

从 SNS 将消息发送到 SQS 队列。然后从 SQS 你 lambda 可以轮询消息(默认是 10 但你可以通过 cli 来决定它)。

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


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

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

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

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

使用新的 Workflow Studio 这应该相对容易实现。

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