Настройка роли iam и ключей для s3 aws с доступом к двум различным корзинам учетных записей с помощью boto3

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

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

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

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

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

Спасибо Том

0
0
289
1

Ответы 1

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

Привет! Как мне указать название целевого сегмента? Я имею в виду, что мне не нужно подключаться к имени целевого сегмента, прежде чем копировать его в эту папку. Как упоминалось ранее, мой источник и пункт назначения - разные учетные записи и разные корзины. Сегмент назначения У меня есть ключи доступа. Я запускаю этот скрипт Python в экземпляре EC2

Hyder Tom 14.09.2018 01:16

Целевой сегмент указан в коде destination_bucket_name = 'dst_bucket_name'. Если вы запускаете код с машины EC2, вам не нужно указывать какие-либо ключи AWS, просто создайте роль профиля экземпляра (и прикрепите ее к машине) с разрешением на доступ к целевому сегменту. Также попросите своего поставщика предоставить доступ для чтения к исходной корзине вашей учетной записи AWS, а затем делегируйте эту политику профилю экземпляра вашего компьютера. Проверить здесь docs.aws.amazon.com/AmazonS3/latest/dev/…

nicor88 14.09.2018 09:55

Привет, спасибо за это. У меня есть секретные ключи доступа к ведру. Какую команду я использую, я не хочу читать в буфер (EC2), а затем копировать ее в свою корзину S3. Как объяснено: s3_vendor_connection, s3_our_connection. Затем читаем s3_vendor.get_object (), затем s3_our.put_object (). Я пытаюсь сразу положить его в ведро, не доставая и не кладя. Хорошо ли использовать get () и put (). Спасибо

Hyder Tom 14.09.2018 18:11

К сожалению, единственное решение, которое приходит мне в голову с использованием секретов aws, - это то, которое вы предложили в начале. Загрузите объекты S3 из исходного ведра, а затем снова загрузите объекты в целевое ведро, что действительно неэффективно. Есть ли возможность убедить поставщика прикрепить политику S3 GetObject к вашей учетной записи AWS? На данный момент это будет лучшим решением. Проверьте это blog.vizuri.com/how-to-copy/… В значительной степени то, что вы хотите сделать, но они используют aws cli (это написано на boto3)

nicor88 14.09.2018 19:33

Итак, исходя из моего понимания, если мы не используем CLI, то другим лучшим решением является создание роли IAM, которая может читать корзину поставщика и записывать в нашу корзину S3? Это верно.

Hyder Tom 14.09.2018 19:47

Необходимо выполнить 2 операции: - создать роль IAM с разрешением на чтение в исходный сегмент и разрешение на запись в целевой сегмент - попросить поставщика предоставить вашей учетной записи AWS разрешение на чтение для объектов в сегменте (это делается с помощью принципала AWS. концепция)

nicor88 14.09.2018 19:50

Другие вопросы по теме