我在Node.js中编写一个AWS lambda函数来调整图像大小,并在图像上传时触发它。 我的存储桶中已经有超过1,000,000张图像。
我想在该图像上运行此lambda函数,但到目前为止什么都找不到。
如何在S3存储桶的现有映像上运行AWS lamdba函数?
注意:-我知道这个问题已经在堆栈溢出中问了,但是问题是,到目前为止还没有给出解决方案
答案 0 :(得分:4)
不幸的是,无法自动为S3存储桶中已存在的对象触发Lambda。
您将必须为S3存储桶中的每个图像手动调用Lambda函数。
首先,您需要使用the ListObjectsV2
action列出S3存储桶中的现有对象。
然后对于S3存储桶中的每个对象,您必须invoke your Lambda function并以Payload
的形式提供S3对象的信息。
答案 1 :(得分:2)
是的,lambda不能被s3存储桶中已存在的对象触发完全是事实,但是为每个对象手动调用lambda是一个完全愚蠢的主意。
借助一些巧妙的技术,您可以轻松地在这些图像上执行任务:
困难的方法是,在本地创建一个程序,该程序与lambda函数的功能完全相同,但又添加了两点,首先,您必须遍历存储桶中的每个对象,然后在其上执行代码,然后调整大小后,将其保存到s3的目标路径。 即,对于已存储在s3存储桶中的所有图像,而不是使用lambda,您将在计算机中本地调整图像大小并将其保存回s3目标位置。
最简单的方法是,首先确保已将s3通知的事件类型配置为对象已创建(全部)作为lambda的触发器。
然后,将所有已存储的图像移至新的临时存储桶,然后将这些图像移回原始存储桶,这就是lambda的操作方式自动为每个图像触发。您可以使用AWS提供的sdk轻松完成移动任务。例如,要在python中使用boto3移动文件,可以引用此link to moving example in python using boto3
答案 2 :(得分:1)
除了Mausam Sharma的评论外,您还可以使用aws cli在存储桶之间运行副本:
aws s3 sync s3://SOURCE-BUCKET-NAME s3://DESTINATION-BUCKET-NAME --source-region SOURCE-REGION-NAME --region DESTINATION-REGION-NAME
从这里: https://medium.com/tensult/copy-s3-bucket-objects-across-aws-accounts-e46c15c4b9e1
答案 3 :(得分:1)
您可以使用CLI简单地复制回 same 存储桶,该CLI将用其自身替换原始文件,然后运行lambda。
aws s3 copy s3://SOURCE-BUCKET-NAME s3://SOURCE-BUCKET-NAME --recursive
您还可以包括/排除可用于选择性地针对特定日期或特定扩展名运行的全局模式。
aws s3 copy s3://SOURCE-BUCKET-NAME s3://SOURCE-BUCKET-NAME --recursive --exclude "*" --include "2020-01-15*"
值得注意的是,像这里的许多其他答案一样,这将在s3上进行读/写等操作,因此请谨慎使用此方法,以防存储包含大量文件的存储桶。