Найкращий спосіб переміщення файлів між сегментами S3?


90

Я хотів би щодня копіювати деякі файли з робочого сегмента в сегмент розробки.

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

Оскільки файли, які я хочу, є настільки глибокими в структурі папок, надто багато часу потрібно переходити до кожної папки та копіювати / вставляти.

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

Відповіді:


110

Оновлення

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

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

    Наступна команда синхронізації синхронізує об’єкти під вказаним префіксом та сегментом із об’єктами під іншим вказаним префіксом та сегментом, копіюючи об’єкти s3. [...]

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

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


Початкова відповідь

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

Ця реалізація операції PUT створює копію об’єкта, який уже зберігається в Amazon S3. Операція копіювання PUT - це те саме, що виконувати GET, а потім PUT. Додавання заголовка запиту, x-amz-copy-source, змушує операцію PUT копіювати вихідний об’єкт у сегмент призначення. Джерело

Існують відповідні зразки для всіх наявних SDK AWS, див. Копіювання об’єктів за одну операцію . Звичайно, рішення на основі сценаріїв буде очевидним першим вибором тут, тому скопіювати об’єкт, використовуючи AWS SDK для Ruby, може бути гарною відправною точкою; якщо замість цього ви віддаєте перевагу Python, цього ж, звичайно, можна домогтися і за допомогою boto , див. метод copy_key()у документації API S3 до boto .

PUT Objectкопіює лише файли, тож вам потрібно буде явно видалити файл через DELETE Objectще після успішної операції копіювання, але це буде лише ще кілька рядків, як тільки буде встановлений загальний сценарій, що обробляє імена сегментів та файлів (є також відповідні приклади , див., наприклад, Видалення одного об’єкта на запит ).


Я закінчив сценарієм операції з AWS SDK у .NET
Matt Dell

1
@MattDell чи можете ви додати відповідь .NET на це запитання?
balexandre

1
Цього відмовляє те, що Amazon не зовсім зрозуміло, чи була команда копіювання успішною чи ні, тому видалення після операції видається небезпечним.
James McMahon

Щоб зрозуміти, я мав на увазі саме API Java. Я відкрив окреме запитання stackoverflow.com/questions/17581582
James McMahon

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

66

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

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

aws s3 sync s3://oldbucket s3://newbucket

4
Це повинно бути проголосовано до початку списку. Це правильний спосіб синхронізації сегментів і найсвіжіший з усіх цих відповідей.
dft

Якщо у вас виникли проблеми з помилками відмови у доступі 403, див. Цю публікацію в блозі. Це допомогло. alfielapeter.com/posts/…
crlane

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

29

Я цілими днями писав власний власний інструмент для розпаралелювання копій, необхідних для цього, але потім натрапив на документацію про те, як отримати команду синхронізації AWS S3 CLI для синхронізації сегментів з масовою розпаралелізацією . Наступні команди повідомлять 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

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

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


Дякуємо, вдалося отримати більше 900 + Мб / с за допомогою вашого конфігурації, величезна швидкість за замовчуванням.
козир

@James: Чи обмежує API нас у досягненні таких високошвидкісних передач? Я використовую transfermanager api, наданий AWS Java SDK vs CLI, з машини T2 EC2 для передачі файлу 2 Гб. Різниця в часі становить ~ 5,5 разів (CLI - 14 секунд) проти (SDK - 80 секунд). Крім того, я не бачу жодної опції для s3.max_queue_size у SDK. Будь-які коментарі?
Dwarrior

@Dwarrior, обидва ці налаштування призначені для CLI. Використовуючи SDK, вам доведеться самостійно керувати всіма чергами запитів. Підтримка AWS стверджує, що вона досягла близько 80% від максимально можливої ​​пропускної здатності між EC2 і S3 за допомогою Linux (тобто рекламована пропускна здатність мережі екземпляра EC2). Windows - громадянин другого класу на AWS і не може отримати навіть половини цього за допомогою інструментів, наданих Amazon, і схоже, вони не планують це виправляти. :-( З T2 машини, AWS не визначає точно , скільки трафіку ви отримаєте, хоча речі дещо покращиться , якщо встановити кінцеву точку S3 VPC.
Джеймс

@James Я пройшов паралелізацію мого списку файлів над кластером в іскрі, поєднуючись з розпаралелізацією в кожному розділі, а потім використовуючи transfermanager для паралельних завантажень для будь-якого даного файлу. Я бачу покращення з 80 до 45 секунд після цього, але все ще відсутній на шляху обробки CLI від EC2. Дякую, за це налаштування. Це також значно покращило продуктивність Windows. У SDK ми можемо встановити максимум підключень, але не розмір черги, тому я думаю, що нам, можливо, доведеться піти з ним. :) Будь-які вказівки щодо управління чергами, будь-який зразок коду, який я можу взяти за базовий.
Dwarrior

2
S5Cmd ( github.com/peakgames/s5cmd ) - це утиліта, яку користувачі AWS підтримують для максимальної пропускної здатності. Розмір екземпляра має велике значення. Нова серія c5n є дуже економічно вигідною для роботи в мережі і досягає неймовірних 100 Гбіт / с.
Джеймс

28

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

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

13

Приклад .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
Повноваження призначені для виконання команди копіювання. Ці окремі облікові дані вимагають відповідних дозволів на читання / запис у вихідних / цільових сегментах. Для копіювання між обліковими записами вам потрібно використовувати політику сегмента, щоб дозволити доступ до сегмента з облікових даних іншого облікового запису.
Matt Houser

9

Якщо у вас є хост unix в AWS, використовуйте s3cmd з s3tools.org. Налаштуйте дозволи, щоб ваш ключ як доступ для читання до вашого сегмента розробки. Потім запустіть:

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

Сторона сервера? Для s3 немає сторони сервера. Всі команди виконуються з віддаленого клієнта.
dk.

Ця команда, здається, чудово працює в Інтернеті, до речі!
Гейб Коплі,

3
Питання "на стороні сервера" є дійсним. Чи передає s3cmd шунтування всіх даних до клієнта, чи це пряма передача від S3 до S3? Якщо перше, переважно було б запустити це в хмарі AWS, щоб уникнути зовнішніх передач глобальної мережі.
Bruce Edge,

1
Копіювання відбувається все віддалено на S3.
dk.

Також зауважте, що якщо ви випадково перервали цей процес s3cmd cp, не --skip-existings3cmd sync
приймаючи

9

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

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

2
просте і пряме рішення ... навіщо використовувати сторонні інструменти або обхідні шляхи для такого простого завдання, коли це можна зробити за допомогою aws cli ?!
Пт0zenFyr

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

Насправді нещодавно я просто використовую дію copy + paste в інтерфейсі 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

Слуз також обробляє видалення, переміщення та завантаження файлу S3; все паралельно і з автоматичною повторною спробою, якщо операція не вдається (що робить напрочуд часто). Сподіваюся, це корисно!


1

Я знаю, що це стара тема, але для інших, хто звертається туди, моя пропозиція полягає у створенні запланованого завдання для копіювання вмісту з виробничого сегмента в розробковий.

Ви можете використовувати Якщо ви використовуєте .NET, ця стаття може вам допомогти

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.