使用boto3批量复制

时间:2018-01-20 00:48:42

标签: python amazon-web-services amazon-s3 boto3

Boto3有一个托管复制方法,可以很好地处理单个对象。同样,它似乎有一个适用于集合的delete()方法。但是如果我有一个对象集合(参见下面的objects),似乎我可以进行批量操作的唯一方法是使用我自己的线程/进程池(为了简单起见,我使用多处理,但是并发.futures可能更适合错误处理)。

import boto3
import multiprocessing

bucket_name = '1000genomes'
prefix = 'changelog_details/'
bucket = boto3.resource('s3').Bucket(bucket_name)
objects = bucket.objects.filter(Prefix=prefix).limit(30)
sources = [{'Bucket': o.bucket_name, 'Key': o.key} for o in objects]

target_bucket = 'my-bucket'  # fill in bucket here!

def copy_to_bucket(src, bucket=target_bucket):
    # client is not thread-safe according to docs
    s3 = boto3.resource('s3')
    return s3.meta.client.copy(src, bucket, src['Key'])

pool = multiprocessing.Pool(20)
results = pool.map(copy_to_bucket, sources)
print('Copied %d results' % len(results))

我是否错过了有关如何批量执行此操作的内容?我试图浏览aws-cli代码库和/或S3Transfer类,但它们似乎都专注于上传或下载文件。

如果不这样做,关于线程或进程是否是更好的选择? (我认为大多数服务器端副本都只是在等待网络I / O)。

1 个答案:

答案 0 :(得分:0)

不久前我不得不解决这个问题,当我准备解决这个问题时,我写了这个DesignDoc

线程将是你最好的选择,因为这是一个 I/O 问题。我在 S3-migrator 的 s3 中编写了并发复制的实现。此外,由于我们的使用,我需要保持我正在复制和使用 mysql 的文件的状态。