Как перенести файл из одной корзины S3 в другую с двумя разными пользователями - PullRequest
0 голосов
/ 09 июля 2019

Мне нужно написать код (python) для копирования файла S3 из одного сегмента S3 в другой. Исходная корзина находится в другой учетной записи AWS, и мы используем учетные данные пользователя IAM для чтения из этой корзины. Код выполняется с той же учетной записью, что и целевое хранилище, поэтому у него есть доступ на запись с ролью IAM. Один из способов, который я могу придумать, - это создать клиентское соединение s3 с исходной учетной записью, прочитать весь файл в память (getObject-?), А затем создать еще один клиент s3 с целевым сегментом и записать содержимое (putObject-?), Которое были ранее прочитаны в память. Но это может стать очень неэффективным, если размер файла увеличивается, поэтому задаюсь вопросом, есть ли лучший способ, предпочтительно, если boto3 предоставляет управляемый AWS способ, который передает файл без чтения содержимого в память.

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

1 Ответ

1 голос
/ 09 июля 2019

Потоковая передача является стандартным решением для такого рода проблем.Вы устанавливаете источник и пункт назначения, а затем выполняете потоковую передачу от одного к другому.

Фактически оба метода boto3 get_object() и upload_fileobj() поддерживают потоки.

Ваш код выполняетсявыглядеть примерно так:

import boto3

src = boto3.client('s3', src_access_key, src_secret_key)
dst = boto3.client('s3') # creds implicit through IAM role

src_response = src.get_object(src_bucket, src_key)
dst.upload_fileobj(src_response['Body'], dst_bucket, dst_key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...