我计划将现有的图像处理逻辑迁移到 AWS lambda。Lambda 缩略图生成器比我之前的代码更好,所以我想使用 lamdba 重新处理现有存储桶中的所有文件。
Lambda 似乎只是事件驱动的,这意味着我的 lamdba 函数只能通过 PUT 事件调用。由于文件已经在存储桶中,因此不会触发任何事件。
我考虑过创建一个新存储桶并将文件从现有存储桶移动到新存储桶。这将触发新的 PUT 事件,但我的存储桶有 2MM 文件,所以我拒绝将此 hack 视为可行的选项。
我计划将现有的图像处理逻辑迁移到 AWS lambda。Lambda 缩略图生成器比我之前的代码更好,所以我想使用 lamdba 重新处理现有存储桶中的所有文件。
Lambda 似乎只是事件驱动的,这意味着我的 lamdba 函数只能通过 PUT 事件调用。由于文件已经在存储桶中,因此不会触发任何事件。
我考虑过创建一个新存储桶并将文件从现有存储桶移动到新存储桶。这将触发新的 PUT 事件,但我的存储桶有 2MM 文件,所以我拒绝将此 hack 视为可行的选项。
即使您将处理 S3 文件,也不一定必须使用 S3 作为事件源。例如,您可以创建一个接受自定义事件的函数,可能使用 S3 存储桶和图像文件名作为键,然后调用 AWS 开发工具包来检索实际图像数据进行处理。然后,您可以使用要处理的存储桶和文件名从控制台或命令行调用此函数,一切顺利。
您可以添加 SQS 队列作为 Lambda 的事件源/触发器,在 Lambda 中进行细微更改以正确处理 SQS 事件而不是 S3 事件,然后使用本地脚本循环遍历所有对象的列表S3 存储桶(给定 2MM 文件的分页)并将它们作为消息添加到 SQS。然后当你完成后,只需删除 SQS 事件源和队列。
这不会绕过编写脚本来列出并查找然后调用 lambda 函数,但脚本真的很短。虽然这种方式确实需要设置队列,但由于 lambda 并发限制,您将无法通过直接调用来处理 2MM 文件。
例子:
list_objects_v2
在 for 循环中对 S3 存储桶进行分页send_message_batch
建议: 根据新文件登陆存储桶的吞吐量,您可能希望切换到 S3 -> SQS -> Lambda 处理,而不是直接 S3 -> Lambda 调用。例如,如果您有大量流量突发,那么您可能会达到您的 Lambda 并发限制,或者如果发生错误并且您想要保留消息(可以通过为您的 lambda 配置 DLQ 来解决)。