Лучший способ перемещения файлов между ведрами S3?
Я хотел бы ежедневно копировать некоторые файлы из производственного ведра в ведро разработки.
например:
Копировать productionbucket / feed / feedname / date
чтобы developmentbucket / feed / feedname / date
потому что файлы, которые я хочу, так глубоко в структуре папок, это слишком много времени, чтобы перейти к каждой папке и скопировать/вставить.
Я играл с монтированием дисков в каждое ведро и писал пакетный скрипт windows, но это очень медленно, и это излишне загружает все файлы / папки на локальный сервер и снова создает резервную копию.
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