如何在同一 S3 位置复制和粘贴多个对象以生成 ObjectCreated 通知?
Posted
技术标签:
【中文标题】如何在同一 S3 位置复制和粘贴多个对象以生成 ObjectCreated 通知?【英文标题】:How to copy and paste multiple objects in same S3 location to generate ObjectCreated notifications? 【发布时间】:2022-01-07 11:02:23 【问题描述】:我的 S3 存储桶中已经有数千个对象。我现在已经编写了一个 lambda 函数来处理它们,并且当文件被放入该 S3 存储桶时它会被触发。我想复制一些具有匹配模式的对象并将它们放在同一个桶中以触发我的 lambda。目前,我正在遵循以下方法,这需要很多时间。
import boto3, botocore
s3_source = boto3.resource('s3')
bucket_source = s3_source.Bucket('vistradata')
key_list = []
objs = list(bucket_source.objects.filter(Prefix='data/'))
for i in range(0, len(objs)):
key_list.append(objs[i].key)
files = [i for i in key_list if 'mystring' in i]
def copy_data_from_s3(input_file):
s3 = boto3.resource('s3')
copy_source =
'Bucket': 'bucket',
'Key': input_file
s3.meta.client.copy(copy_source, 'bucket', input_file)
for i in files:
copy_data_from_s3(i)
有没有更好的方法使用 aws s3 sync 或 aws s3 cp?我在网上看到的示例是将数据从一个存储桶复制到另一个存储桶,而不是在同一个存储桶中。谢谢。
【问题讨论】:
【参考方案1】:是的,您可以运行这样的命令来强制触发通知。
aws s3 sync s3://mybucket/* s3://mybucket/folder/
这会将存储桶内的所有文件复制到存储桶内的新文件夹并为每个文件触发通知。
您也可以先在禁用通知的情况下运行它,然后如果需要反向运行它。
【讨论】:
【参考方案2】:您可以完全跳过 S3 复制。您现有的for i in range
循环可以直接为每个文件invoke 您的通知lambda。这就是 S3 所做的。您的事件负载将是 S3 notification event 的精简版本,仅包含 bucket
、key
或您需要的任何字段。
这将比复制 S3 对象更快、更便宜,但谁在乎呢?如果这是一次性操作,您或 @Coin-Graham 的方法也可以完成工作。
【讨论】:
以上是关于如何在同一 S3 位置复制和粘贴多个对象以生成 ObjectCreated 通知?的主要内容,如果未能解决你的问题,请参考以下文章