Лучший способ перемещать файлы между ведрами S3?

91

Я хотел бы ежедневно копировать некоторые файлы из производственной корзины в группу разработки.

Например: скопируйте productionbucket / feed / feedname / date в developmentbucket / feed / feedname / date.

Поскольку файлы, которые мне нужны, находятся так глубоко в структуре папок, переход в каждую папку и копирование / вставка занимает слишком много времени.

Я поигрался с подключением дисков к каждой корзине и написанием пакетного сценария Windows, но это очень медленно, и он без необходимости загружает все файлы / папки на локальный сервер и снова выполняет резервное копирование.

Мэтт Делл
источник

Ответы:

111

Обновить

Как указывает alberge (+1), в настоящее время превосходный интерфейс командной строки AWS обеспечивает наиболее универсальный подход для взаимодействия (почти) со всем, что связано с AWS - в то же время он охватывает API большинства служб, а также содержит команды S3 более высокого уровня для работы с вашими В частности, см. справочник по интерфейсу командной строки AWS для S3 :

  • sync - синхронизирует каталоги и префиксы S3. Использование случай охватываются примером 2 (более мелкозернистое использование с --exclude, --includeи обработкой префикса и т.д. также доступен):

    Следующая команда синхронизации синхронизирует объекты с указанным префиксом и сегментом с объектами с другим указанным префиксом и сегментом путем копирования объектов s3. [...]

    aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
    

Для полноты я упомяну, что команды S3 более низкого уровня также по-прежнему доступны через подкоманду s3api , которая позволит напрямую транслировать любое решение на основе SDK в интерфейс командной строки AWS перед тем, как в конечном итоге принять его функциональность более высокого уровня.


Первоначальный ответ

Перемещение файлов между бакетами S3 может быть достигнуто с помощью API PUT Object - Copy (за которым следует DELETE Object ):

Эта реализация операции PUT создает копию объекта, который уже хранится в Amazon S3. Операция копирования PUT аналогична выполнению GET, а затем PUT. Добавление заголовка запроса x-amz-copy-source заставляет операцию PUT копировать исходный объект в целевую корзину. Источник

Существуют соответствующие образцы для всех существующих SDK AWS, см. Копирование объектов за одну операцию . Естественно, решение на основе сценариев будет здесь очевидным первым выбором, поэтому копирование объекта с помощью AWS SDK для Ruby может быть хорошей отправной точкой; Если вы предпочитаете Python, то же самое можно сделать и с помощью boto, конечно, см. метод copy_key()в документации boto S3 API .

PUT Objectкопирует только файлы, поэтому вам нужно будет явно удалить файл через DELETE Objectвсе еще после успешной операции копирования, но это будет всего лишь несколько строк после того, как общий сценарий, обрабатывающий ведро и имена файлов, будет на месте (есть также соответствующие примеры , см., например, Удаление одного объекта по запросу ).

Штеффен Опель
источник
В итоге я написал сценарий для работы с AWS SDK в .NET
Мэтт Делл
1
@MattDell, можете ли вы добавить ответ .NET на этот вопрос?
balexandre
1
В этом отстойно то, что Amazon не очень понимает, была ли команда копирования успешной или нет, поэтому удаление после операции кажется опасным.
Джеймс МакМахон
Чтобы внести ясность, я имел в виду именно Java API. Я открыл отдельный вопрос stackoverflow.com/questions/17581582
Джеймс МакМахон
Нам все еще нужен простой способ сделать один идентификатор и ключ, способный читать из одного ведра и записывать в другое ведро. Особенно, если ведра находятся в разных учетных записях.
CMCDragonkai
66

Новый официальный интерфейс командной строки AWS изначально поддерживает большую часть функциональности s3cmd. Раньше я использовал s3cmdRuby AWS SDK для подобных вещей, но официальный интерфейс командной строки отлично подходит для этого.

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

aws s3 sync s3://oldbucket s3://newbucket
AB
источник
4
Это должно быть поставлено на первое место в списке. Это правильный способ синхронизации сегментов и самый последний во всех этих ответах.
dft
Если у вас возникли проблемы с ошибками 403 отказа в доступе, см. Это сообщение в блоге. Это помогло. alfielapeter.com/posts/…
crlane 02
3
перекрестная копия регионаaws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
эквивалент8
если вам нужно запустить эту ночную ночь на сервере, используйте nohup aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1 & thegeekstuff.com/2010/12/5-ways-to-execute-linux-command
эквивалент8
@alberge Есть ли способ предоставить ключ доступа и секрет с помощью аргумента командной строки?
EmptyData
30

Я потратил дни на написание собственного специального инструмента для распараллеливания копий, необходимых для этого, но затем наткнулся на документацию о том, как получить команду синхронизации CLI AWS S3 для синхронизации сегментов с массовым распараллеливанием . Следующие команды сообщают интерфейсу командной строки AWS использовать 1000 потоков для выполнения заданий (каждый представляет собой небольшой файл или одну часть составной копии) и просматривать 100000 заданий:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

После их запуска вы можете использовать простую команду синхронизации следующим образом:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

На машине m4.xlarge (в AWS - 4 ядра, 16 ГБ ОЗУ) для моего случая (файлы от 3 до 50 ГБ) скорость синхронизации / копирования увеличилась с 9,5 МБ / с до 700 + МБ / с, прирост скорости составил 70x по сравнению с конфигурацией по умолчанию.

Обновление: обратите внимание, что S3CMD обновлялся на протяжении многих лет, и теперь эти изменения эффективны только при работе с большим количеством небольших файлов. Также обратите внимание, что S3CMD в Windows (только в Windows) серьезно ограничен в общей пропускной способности и может достигать только около 3 Гбит / с на процесс независимо от того, какой размер экземпляра или настройки вы используете. У других систем, таких как S5CMD, такая же проблема. Я говорил об этом с командой S3, и они изучают это.

Джеймс
источник
Спасибо, удалось получить более 900 + MiB / s с вашей конфигурацией, огромная скорость по умолчанию.
kozyr 08
@James: Ограничивает ли нас API в достижении такой высокой скорости передачи? Я использую API-интерфейс transfermanager, предоставляемый AWS Java SDK и CLI с компьютера T2 EC2, для передачи файла размером 2 ГБ. Разница во времени составляет ~ 5,5 раза (CLI - 14 секунд) против (SDK - 80 секунд). Кроме того, я не вижу опции для s3.max_queue_size в SDK. Любые комментарии?
Dwarrior
@Dwarrior, обе эти настройки предназначены для интерфейса командной строки. При использовании SDK вы должны сами управлять всей очередью запросов. Служба поддержки AWS утверждает, что достигла примерно 80% максимально возможной пропускной способности между EC2 и S3 с использованием Linux (т. Е. Заявленная пропускная способность сети инстанса EC2). Windows является второсортным гражданином на AWS и не может получить и половины этого с помощью инструментов, предоставляемых Amazon, и похоже, что они не планируют это исправлять. :-( Для машины T2 AWS не указывает точно, сколько пропускной способности вы получаете, хотя ситуация несколько улучшается, если вы настраиваете конечную точку S3 VPC.
Джеймс,
@James Я дошел до степени распараллеливания моего списка файлов по кластеру в Spark, совмещая с распараллеливанием внутри каждого раздела, а затем используя transfermanager для параллельной загрузки любого заданного файла. Я вижу улучшение с 80 до 45 секунд после этого, но все еще отсутствует способ обработки интерфейса командной строки из EC2. Спасибо за эту настройку. Это также значительно улучшило производительность по сравнению с окнами. В SDK мы можем установить максимальное количество подключений, но не размер очереди, поэтому я думаю, что нам, возможно, придется оставить это. :) Любые указатели на то, как управлять очередями, любой пример кода, который я могу взять за основу.
Dwarrior
2
S5Cmd ( github.com/peakgames/s5cmd ) - это утилита, которую специалисты службы поддержки AWS использовали для максимальной пропускной способности. Размер экземпляра имеет большое значение. Новая серия c5n очень экономична для работы в сети и обеспечивает потрясающую скорость 100 Гбит / с.
Джеймс
29

Для перемещения / копирования из одного ведра в другое или из одного и того же я использую инструмент s3cmd, и он отлично работает. Например:

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1
sgimeno
источник
14

Пример .NET по запросу:

using (client)
{
    var existingObject = client.ListObjects(requestForExisingFile).S3Objects; 
    if (existingObject.Count == 1)
    {
        var requestCopyObject = new CopyObjectRequest()
        {
            SourceBucket = BucketNameProd,
            SourceKey = objectToMerge.Key,
            DestinationBucket = BucketNameDev,
            DestinationKey = newKey
        };
        client.CopyObject(requestCopyObject);
    }
}

с клиентом что-то вроде

var config = new AmazonS3Config { CommunicationProtocol = Protocol.HTTP, ServiceURL = "s3-eu-west-1.amazonaws.com" };
var client = AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretAccessKey, config);

Может быть и лучший способ, но это всего лишь небольшой код, который я написал для передачи файлов.

Мэтт Делл
источник
1
Кажется, это хорошее решение. но что произойдет, если у вас разные учетные данные для двух ведер?
Roee Gavirel
2
Учетные данные предназначены для выполнения команды копирования. Эти единые учетные данные требуют соответствующих разрешений на чтение / запись в исходных / целевых сегментах. Для копирования между учетными записями вам необходимо использовать политику корзины, чтобы разрешить доступ к корзине с учетными данными другой учетной записи.
Мэтт Хаузер
9

Если у вас есть unix-хост в AWS, используйте s3cmd с s3tools.org. Настройте разрешения так, чтобы ваш ключ был доступом для чтения к вашей корзине разработки. Затем запустите:

s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname
dk.
источник
На стороне сервера? Для s3 нет серверной части. Все команды выполняются с удаленного клиента.
дк.
Кстати, эта команда, похоже, отлично работает через Интернет!
Гейб Копли,
3
Вопрос "на стороне сервера" актуален. Передает ли s3cmd все данные клиенту, или это прямая передача S3 на S3? В первом случае было бы предпочтительнее запустить это в облаке AWS, чтобы избежать передачи внешних WAN.
Брюс Эдж
1
Копирование происходит удаленно на S3.
дк.
Также обратите внимание, что если вы случайно прервали этот процесс s3cmd cp, вы не примете эту --skip-existingопцию, однако вы можете запустить s3cmd syncвместо этого, пропустив существующий
ianstarz
9

Для меня просто сработала следующая команда:

aws s3 mv s3://bucket/data s3://bucket/old_data --recursive
одинокий
источник
2
простое и понятное решение ... зачем использовать сторонние инструменты или обходные пути для такой простой задачи, когда это можно сделать с помощью aws cli ?!
Fr0zenFyr
7

Вот рубиновый класс для этого: https://gist.github.com/4080793

Пример использования:

$ gem install aws-sdk
$ irb -r ./bucket_sync_service.rb
> from_creds = {aws_access_key_id:"XXX",
                aws_secret_access_key:"YYY",
                bucket:"first-bucket"}
> to_creds = {aws_access_key_id:"ZZZ",
              aws_secret_access_key:"AAA",
              bucket:"first-bucket"}
> syncer = BucketSyncService.new(from_creds, to_creds)
> syncer.debug = true # log each object
> syncer.perform
бантик
источник
6

На самом деле с недавнего времени я просто использую действие копирования + вставки в интерфейсе AWS s3. Просто перейдите к файлам, которые вы хотите скопировать, нажмите «Действия» -> «Копировать», затем перейдите к целевому сегменту и «Действия» -> «Вставить».

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

Джастин Уоркман
источник
Да. Я обнаружил то же самое несколько минут назад. Я проголосовал за, так что больше людей сэкономят время :)
JCarlosR
Я пробовал это на ведре для копирования в ведро с 134 364 объектами в нем. На это ушли часы. В конечном итоге получилось всего 134 333 файла - в копии говорилось, что это «успешно», но отсутствующим файлам не было объяснения.
Уорренс
Используя команду типа «aws s3 sync», описанную в других публикациях здесь, все 134 364 объекта были скопированы примерно за 20 минут.
Уорренс
4

У нас была именно эта проблема с нашими заданиями ETL в Snowplow , поэтому мы извлекли наш код параллельного копирования файлов (Ruby, построенный поверх Fog ) в его собственный гем Ruby, называемый Sluice:

https://github.com/snowplow/sluice

Sluice также обрабатывает удаление, перемещение и загрузку файлов S3; все распараллелено и с автоматической повторной попыткой в ​​случае сбоя операции (что случается на удивление часто). Надеюсь, это пригодится!

Алекс Дин
источник
1

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

Вы можете использовать Если вы используете .NET, эта статья может вам помочь

https://edunyte.com/2015/03/aws-s3-copy-object-from-one-bucket-or/

Нихил Гаур
источник
0

Для новой версии aws2.

aws2 s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME
Анкит Кумар Раджпут
источник