在带有文件的现有存储桶中运行aws-lambda函数

时间:2015-03-03 02:40:08

标签: java python amazon-s3 thumbnails aws-lambda

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

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

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

3 个答案:

答案 0 :(得分:1)

即使您要处理S3文件,也不一定要使用S3作为事件源。例如,您可以创建一个接受custom event的函数,可能使用S3存储桶和图像文件名作为键,然后调用AWS SDK来检索实际的图像数据以进行处理。然后,您可以从控制台或命令行调用此函数,并使用您要处理的存储桶和文件名,这样您就可以了。

答案 1 :(得分:0)

您可以随时使用Algorithmia之类的服务来创建调整文件大小的函数,例如:

http://blog.algorithmia.com/amazon-s3-image-processing-pipeline-python/

希望它有所帮助! (示例是在python中,但您可以使用其他语言)

答案 2 :(得分:0)

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

编写脚本列出并查找然后调用lambda函数并不能解决问题,但是脚本确实很短。尽管此方法确实需要设置队列,但是由于lambda并发限制,您将无法直接调用处理2MM文件。

示例:

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

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