如何在同一 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 的精简版本,仅包含 bucketkey 或您需要的任何字段。

这将比复制 S3 对象更快、更便宜,但谁在乎呢?如果这是一次性操作,您或 @Coin-Graham 的方法也可以完成工作。

【讨论】:

以上是关于如何在同一 S3 位置复制和粘贴多个对象以生成 ObjectCreated 通知?的主要内容,如果未能解决你的问题,请参考以下文章

说一下批处理移动文件的原理吧

以编程方式复制和粘贴文件

从同一存储桶中另一个子文件夹中的 s3 子文件夹中复制文件

如何在同一个网站的多个地方使用 laravel fortify 进行身份验证

如何知道哪个位置正在渲染 S3 对象

同一个Tomcat如何在centos中部署多个项目