Amazon web services 如何在多个S3通知上仅触发一次AWS Lambda

Amazon web services 如何在多个S3通知上仅触发一次AWS Lambda,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我们正在设计一条管道。我们得到许多原始文件,这些文件进入S3存储桶,然后我们应用一个模式,然后将它们保存为拼花地板 到目前为止,我们正在为写入的每个文件触发lambda函数,但理想情况下,我们希望仅在写入所有文件后才启动此过程。如何触发lambda一次?将lambda连接到Webhook(API网关),然后在客户端应用完成后从客户端应用调用它。解决方案: 将所有文件压缩在一起,Lambda将其解压缩 创建UI代码并逐个发送文件,在发送最后一个文件时从中触发lambda Lambda检查文件,如果

我们正在设计一条管道。我们得到许多原始文件,这些文件进入S3存储桶,然后我们应用一个模式,然后将它们保存为拼花地板


到目前为止,我们正在为写入的每个文件触发lambda函数,但理想情况下,我们希望仅在写入所有文件后才启动此过程。如何触发lambda一次?

将lambda连接到Webhook(API网关),然后在客户端应用完成后从客户端应用调用它。

解决方案:

  • 将所有文件压缩在一起,Lambda将其解压缩
  • 创建UI代码并逐个发送文件,在发送最后一个文件时从中触发lambda
  • Lambda检查文件,如果没有找到所有文件,则无声退出。如果找到所有文件,则在一个线程中处理所有文件

  • 我鼓励您使用另一种方法来保持出版商(无论是谁在写作)和订阅者(您)之间的分离。出版商告诉你什么时候写东西;选择何时处理这些事情是你的责任。这里的整洁模式是出版商分批编写其文件,并发布清单,供您触发:即一个列表,上面写着“我刚刚写了所有这些东西,您可以在这些地方找到它们”。由于您没有/无法更改发布者,我建议您:

  • 将发布者的通知发送到

  • 安排lambda按计划运行;多久进食一次取决于你愿意延迟进食的时间。如果您希望数据在发布和被系统接收之间最多延迟5分钟,请将lambda设置为每4分钟触发一次。您可以为此使用Cloudwatch通知

  • 当lambda运行时,轮询队列。继续操作,直到累积了要一次性处理的通知的最大数量X,或者队列为空

  • 过程。如果停止轮询时队列不为空,请立即触发另一个lambda执行

  • 在上述方面需要记住的事项:

  • 如前所述,它不是并行的,因此如果lambda的执行速率低于队列的填充速率,则需要1。更频繁地运行或2。插入一个负载平衡步骤:一个lambda,该lambda根据调度触发,轮询队列,并根据需要调用尽可能多的处理lambda,以便每个lambda都获得X个通知

  • 一般而言,SNS和SQS非FIFO队列并不保证一次交付。他们可以向您发送重复的通知。确保可以干净地处理重复处理


  • 文件太大,因此压缩和解压缩可能需要很长时间。此外,我们没有对源系统的控制,源系统只是将所有文件复制到我们的S3存储桶中。第3点也许可以做到,但它看起来不像是优雅的解决方案。请注意,zip(和其他类似的工具)可以仅仅用作容器,而不需要压缩阶段。当然,创建文件是有成本的,包括决定如何处理可能重复的存储大小。我对AWS和API非常陌生,我将探讨您的建议。您是否有任何web链接,以便我阅读和理解webhook(API网关)解决方案?谢谢,我将进一步探讨您的建议。@MyStack为什么不建议直接从Amazon SQS消息触发Lambda函数?这将避免安排Lambda函数的需要。@JohnRotenstein这是个好问题。它的最大限制是最大批量为10()。否则,它是上述方法的一个很好的(不太灵活)替代方法,这可以避免您需要安排自己的lambda调用,但仍然需要一些非常挑剔的配置。