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

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

Например: Скопировать файл productionbucket/feed/feedname/date к developmentbucket/feed/feedname/date

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

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

Ответ 1

Обновление

Как отметил Альберге (+1), в настоящее время превосходный интерфейс командной строки AWS предоставляет наиболее универсальный подход для взаимодействия (почти) со всеми вещами AWS - тем временем он охватывает большинство сервисов. 'API-интерфейсы, а также функции команд S3 более высокого уровня для конкретного случая использования, см. справку по CLI 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 может быть достигнуто с помощью 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() в документации по boto S3 API.

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

Ответ 2

Новый официальный 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

Ответ 3

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

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname

Ответ 7

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

aws s3 mv s3://bucket/data s3://bucket/old_data --recursive

Ответ 8

Для этого выполняется класс 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

Ответ 9

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

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

Ответ 10

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

https://github.com/snowplow/sluice

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

Ответ 11

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

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

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