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



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



например:
Копировать productionbucket / feed / feedname / date
чтобы developmentbucket / feed / feedname / date



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



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

903   11  

11 ответов:

обновление

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

вот класс 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

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

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

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

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

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

https://github.com/snowplow/sluice

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

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

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

http://www.codewithasp.net/2015/03/aws-s3-copy-object-from-one-bucket-or.html

Comments

    Ничего не найдено.