Один из самых быстрых способов копирования данных между двумя сегментами - это использование S3DistCp, его стоит использовать, только если у вас есть много файлов для копирования, он будет копировать их распределенным способом с кластером EMR.Лямбда-функция с boto3 будет опцией, только если копирование занимает менее 5 минут, если дольше вы можете рассмотреть использование задач ECS (в основном, контейнеров Docker).
Что касается части, как копировать с помощью boto3, вы можете проверить здесь .Похоже, что вы можете сделать что-то вроде:
import boto3
s3_client = boto3.client('s3')
s3_resource = boto3.resource('s3')
source_bucket_name = 'src_bucket_name'
destination_bucket_name = 'dst_bucket_name'
paginator = s3_client.get_paginator('list_objects')
response_iterator = paginator.paginate(
Bucket=source_bucket_name,
Prefix='your_prefix',
PaginationConfig={
'PageSize': 1000,
}
)
objs = response_iterator.build_full_result()['Contents']
keys_to_copy = [o['Key'] for o in objs] # or use a generator (o['Key'] for o in objs)
for key in keys_to_copy:
print(key)
copy_source = {
'Bucket': source_bucket_name,
'Key': key
}
s3_resource.meta.client.copy(copy_source, destination_bucket_name, key)
Предлагаемое решение сначала получает имя объекта для копирования, а затем вызывает команду копирования для каждого объекта.Чтобы сделать это быстрее, вместо использования цикла for, вы можете использовать async.
Если вы запускаете код в задаче Lambda или ECS, не забудьте создать роль IAM с доступом к корзине источника и корзине назначения.