Лучший способ переместить файлы между корзинами S3? - PullRequest
82 голосов
/ 12 марта 2012

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

Например: Скопируйте производственную корзину / фид / имя фида / дату в каталог разработки / фид / имя фида / дату

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

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

Ответы [ 11 ]

101 голосов
/ 12 марта 2012

Обновление

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

  • синхронизация - Синхронизация каталогов и префиксов S3. Ваш сценарий использования покрыт Пример 2 (более детальное использование с --exclude, --include, также доступна обработка префиксов и т. Д.):

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

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

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


Начальный ответ

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

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

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

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

64 голосов
/ 13 января 2014

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

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

aws s3 sync s3://oldbucket s3://newbucket
27 голосов
/ 27 февраля 2013

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

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1
17 голосов
/ 26 октября 2016

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

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 + МБ / с. увеличение скорости в 70 раз по сравнению с конфигурацией по умолчанию.

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

12 голосов
/ 11 февраля 2013

.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);

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

8 голосов
/ 18 мая 2016

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

aws s3 mv s3://bucket/data s3://bucket/old_data --recursive
8 голосов
/ 16 мая 2012

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

s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname
6 голосов
/ 16 ноября 2012

Вот класс ruby ​​для выполнения этого: 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
5 голосов
/ 22 октября 2016

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

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

3 голосов
/ 10 ноября 2012

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

https://github.com/snowplow/sluice

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...