4

我计划将现有的图像处理逻辑迁移到 AWS lambda。Lambda 缩略图生成器比我之前的代码更好,所以我想使用 lamdba 重新处理现有存储桶中的所有文件。

Lambda 似乎只是事件驱动的,这意味着我的 lamdba 函数只能通过 PUT 事件调用。由于文件已经在存储桶中,因此不会触发任何事件。

我考虑过创建一个新存储桶并将文件从现有存储桶移动到新存储桶。这将触发新的 PUT 事件,但我的存储桶有 2MM 文件,所以我拒绝将此 hack 视为可行的选项。

4

2 回答 2

1

即使您将处理 S3 文件,也不一定必须使用 S3 作为事件源。例如,您可以创建一个接受自定义事件的函数,可能使用 S3 存储桶和图像文件名作为键,然后调用 AWS 开发工具包来检索实际图像数据进行处理。然后,您可以使用要处理的存储桶和文件名从控制台或命令行调用此函数,一切顺利。

于 2015-03-03T06:48:02.620 回答
1

您可以添加 SQS 队列作为 Lambda 的事件源/触发器,在 Lambda 中进行细微更改以正确处理 SQS 事件而不是 S3 事件,然后使用本地脚本循环遍历所有对象的列表S3 存储桶(给定 2MM 文件的分页)并将它们作为消息添加到 SQS。然后当你完成后,只需删除 SQS 事件源和队列。

这不会绕过编写脚本来列出并查找然后调用 lambda 函数,但脚本真的很短。虽然这种方式确实需要设置队列,但由于 lambda 并发限制,您将无法通过直接调用来处理 2MM 文件。

例子:

  1. 设置 SQS 队列并作为事件源添加到 Lambda。
    • 读取 SQS 消息和 S3 事件的语法应该非常相似
  2. list_objects_v2在 for 循环中对 S3 存储桶进行分页
  3. 使用创建消息send_message_batch

建议: 根据新文件登陆存储桶的吞吐量,您可能希望切换到 S3 -> SQS -> Lambda 处理,而不是直接 S3 -> Lambda 调用。例如,如果您有大量流量突发,那么您可能会达到您的 Lambda 并发限制,或者如果发生错误并且您想要保留消息(可以通过为您的 lambda 配置 DLQ 来解决)。

于 2019-06-04T20:36:59.127 回答