使用 boto3 批量复制

Jef*_*ner 7 python amazon-s3 amazon-web-services boto3

Boto3 有一个托管复制方法,它非常适合单个对象。同样,它似乎有一个delete()适用于集合的方法。但是如果我有一组对象(见objects下文),似乎我可以进行批量操作的唯一方法是使用我自己的线程/进程池(为了简单起见,我使用了多处理,但 concurrent.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))
Run Code Online (Sandbox Code Playgroud)

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

如果做不到这一点,是否对线程或进程是更好的选择有什么想法?(我认为大多数服务器端副本将只是等待网络 I/O 无论如何)。

Moh*_*med 0

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

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