Роль IAM и настройка ключей для S3 AWS с доступом к двум различным корзинам учетных записей с помощью boto3 - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть два разных аккаунта 1) Учетная запись, которая является учетной записью поставщика, и они дали нам AccessID и секретный ключ для доступа. 2) Наша учетная запись, где мы имеем полный доступ.

Нам нужно скопировать файлы из корзины Vendor S3 в нашу корзину S3, используя скрипты boto3 Python 3.7.

Какую функцию лучше использовать в boto3 для достижения максимальной производительности.

Я пытался использовать get_object и put_object. Проблема этого сценария в том, что я на самом деле читаю тело файла и пишу его. Как мы просто копируем из одной учетной записи в другую с более быстрым режимом копирования?

Могу ли я выполнить какие-либо настройки с моего конца для прямого копирования. Мы можем использовать лямбду, пока я получаю хорошую производительность. Я не могу запросить какие-либо изменения у поставщика, за исключением того, что они дают нам ключи доступа.

Спасибо Том

1 Ответ

0 голосов
/ 13 сентября 2018

Один из самых быстрых способов копирования данных между двумя сегментами - это использование 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 с доступом к корзине источника и корзине назначения.

...