Копіюйте файли та папки AWS S3 між двома відрами


112

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

Я намагався використовувати параметр копіювання консолі AWS S3, але це призвело до відсутності деяких вкладених файлів.

Я спробував використовувати додаток Transmit (від Panic). Команда дублікат завантажує файли спочатку в локальну систему, потім завантажує їх назад у друге відро, що є досить неефективним.


Розглянути можливість збільшення ваш паралельний підрахунок запиту aws configure set default.s3.max_concurrent_requests 200 Дивіться цей пост для більш докладної інформації та опції stackoverflow.com/questions/4663016 / ...
Balmipour

Відповіді:


176

Скопіюйте між ковшами S3

AWS (зовсім недавно) випустив інтерфейс командного рядка для копіювання між відрами.

http://aws.amazon.com/cli/

$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp
..

Це скопіює з одного цільового відра до іншого.

Дивіться документацію тут: Документація S3 CLI


Дістався з EC2 і отримав 80 МБ, скопійований приблизно за 5 секунд.
Stew-au

1
Саме те, що мені було потрібно, оскільки aws-sdk gem не має функції копіювання або синхронізації цілого відра одразу. Дякую!
одіозність

Це кидає таку помилкуA client error (PermanentRedirect) occurred when calling the ListObjects operation: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
Джованні Бітлінер

@GiovanniBitliner Ім'я відра, яке ви використовуєте, невірне. Ви або використовуєте неправильний префікс, або використовуєте старий спосіб посилання на відро. Перевірте ім’я відра саме в консолі адміністратора.
Лайке

8
Зверніть увагу, якщо вперше за допомогою інструменту cli потрібно запустити "aws configure" та ввести свої кредити
S ..

41

Спрощений приклад із використанням aws-sdk gem:

AWS.config(:access_key_id => '...', :secret_access_key => '...')
s3 = AWS::S3.new
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key')

Якщо ви хочете виконати копію між різними відрами, то вкажіть назву цільового відра:

s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key', :bucket_name => 'target-bucket')

41

Тепер це можна зробити через адміністраторський інтерфейс S3. Просто перейдіть в одне відро, виберіть усі свої папки actions->copy. Потім перейдіть у своє нове відро actions->paste.


4
Дивовижно! Він має на увазі веб-інтерфейс. На відміну від більшості інших, я міг це зробити з iPad.
Якоб Фоші

2
Це випадковим чином залишає вкладені об’єкти в папках - через 3 роки, і AWS все ще не може виправити таку базову помилку!
RunLoop

це для тих же регіонів чи всіх?
hakiko

1
Чи будь-де документовані ці питання Amazon де-небудь? @RunLoop
davetapley

1
@dukedave Я не знаю і не перевірявся знову за досить довгий час, оскільки я вдався зробити копіювання за допомогою командного рядка, оскільки це працювало чудово.
RunLoop

8

Це можливо з останнім коштом aws-sdk , дивіться зразок коду:

require 'aws-sdk'

AWS.config(
  :access_key_id     => '***',
  :secret_access_key => '***',
  :max_retries       => 10
)

file     = 'test_file.rb'
bucket_0 = {:name => 'bucket_from', :endpoint => 's3-eu-west-1.amazonaws.com'}
bucket_1 = {:name => 'bucket_to',   :endpoint => 's3.amazonaws.com'}

s3_interface_from = AWS::S3.new(:s3_endpoint => bucket_0[:endpoint])
bucket_from       = s3_interface_from.buckets[bucket_0[:name]]
bucket_from.objects[file].write(open(file))

s3_interface_to   = AWS::S3.new(:s3_endpoint => bucket_1[:endpoint])
bucket_to         = s3_interface_to.buckets[bucket_1[:name]]
bucket_to.objects[file].copy_from(file, {:bucket => bucket_from})

Докладніше: Як скопіювати файл у відра, використовуючи aws-s3 gem


Дякуємо, що показали, як копіювати на сервери. Я намагаюся скопіювати з нас сервер на сервер Singapore.
Arcolye

@Arcolye, як зараз відбувається затримка в AWS Сінгапурі? Рік тому був повільним і непослідовним.
Анатолій

7

Копіюйте між відрами у різних регіонах

$ aws s3 cp s3://src_bucket/file  s3://dst_bucket/file --source-region eu-west-1 --region ap-northeast-1

Наведена вище команда копіює файл із відра в Європі (eu-west-1) до Японії (ap-northeast-1). Ви можете отримати кодове ім'я для регіону відра за допомогою цієї команди:

$ aws s3api get-bucket-location --bucket my_bucket

До речі, використовувати Копіювати та Вставити у веб-консолі S3 дуже просто, але, здається, завантажувати з вихідного відра у браузер, а потім завантажувати до місця призначення. Використання "aws s3" було для мене набагато швидшим.


6

Я створив Docker виконуваний файл з s3s3mirror інструменту. Утиліта для копіювання та дзеркального відображення з відра AWS S3 в інше.

Він нарізаний потоком, що дозволяє паралельно КОПІЮВАТИ та дуже ефективно працювати з пам'яттю.

Використання:

docker run -e AWS_ACCESS_KEY_ID=FOO -e AWS_SECRET_ACCESS_KEY=BAR pmoust/s3s3mirror [OPTIONS] source_bucket[/prefix] dest_bucket[/prefix]

Для повного переліку варіантів спробуйте:

docker run pmoust/s3s3mirror 


5

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

Це на Github під ліцензією Apache тут: https://github.com/cobbzilla/s3s3mirror

Коли у вас дуже велике відро і ви хочете досягти максимальної продуктивності, можливо, варто спробувати.

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


У мене був великий досвід роботи з s3s3mirror. Мені вдалося налаштувати його на m1.small EC2-вузол і скопіювати 1,5 мільйона об'єктів приблизно за 2 години. Налаштування було трохи жорстким через мою незнайомість з Maven та Java, але для встановлення всього було потрібно лише кілька команд apt-get на Ubuntu. Останнє зауваження: Якщо (як і я) ви переживаєте, щоб запустити невідомий сценарій на великому важливому відрізку s3, створіть спеціального користувача з доступом лише для читання у відрі для копіювання та використовуйте ці облікові дані. Нульовий шанс випадкового видалення.
Міхей

4

Якщо ви знаходитесь в оболонці і хочете скопіювати декілька файлів, але не всі файли: s3cmd cp - rekursive s3: // BUCKET1 / OBJECT1 s3: // BUCKET2 [/ OBJECT2]


3

Я написав сценарій, який створює резервне копіювання відра S3: https://github.com/roseperrone/aws-backup-rake-task

#!/usr/bin/env python
from boto.s3.connection import S3Connection
import re
import datetime
import sys
import time

def main():
    s3_ID = sys.argv[1]
    s3_key = sys.argv[2]
    src_bucket_name = sys.argv[3]
    num_backup_buckets = sys.argv[4]
    connection = S3Connection(s3_ID, s3_key)
    delete_oldest_backup_buckets(connection, num_backup_buckets)
    backup(connection, src_bucket_name)

def delete_oldest_backup_buckets(connection, num_backup_buckets):
    """Deletes the oldest backup buckets such that only the newest NUM_BACKUP_BUCKETS - 1 buckets remain."""
    buckets = connection.get_all_buckets() # returns a list of bucket objects
    num_buckets = len(buckets)

    backup_bucket_names = []
    for bucket in buckets:
        if (re.search('backup-' + r'\d{4}-\d{2}-\d{2}' , bucket.name)):
            backup_bucket_names.append(bucket.name)

    backup_bucket_names.sort(key=lambda x: datetime.datetime.strptime(x[len('backup-'):17], '%Y-%m-%d').date())

    # The buckets are sorted latest to earliest, so we want to keep the last NUM_BACKUP_BUCKETS - 1
    delete = len(backup_bucket_names) - (int(num_backup_buckets) - 1)
    if delete <= 0:
        return

    for i in range(0, delete):
        print 'Deleting the backup bucket, ' + backup_bucket_names[i]
        connection.delete_bucket(backup_bucket_names[i])

def backup(connection, src_bucket_name):
    now = datetime.datetime.now()
    # the month and day must be zero-filled
    new_backup_bucket_name = 'backup-' + str('%02d' % now.year) + '-' + str('%02d' % now.month) + '-' + str(now.day);
    print "Creating new bucket " + new_backup_bucket_name
    new_backup_bucket = connection.create_bucket(new_backup_bucket_name)
    copy_bucket(src_bucket_name, new_backup_bucket_name, connection)


def copy_bucket(src_bucket_name, dst_bucket_name, connection, maximum_keys = 100):
    src_bucket = connection.get_bucket(src_bucket_name);
    dst_bucket = connection.get_bucket(dst_bucket_name);

    result_marker = ''
    while True:
        keys = src_bucket.get_all_keys(max_keys = maximum_keys, marker = result_marker)

        for k in keys:
            print 'Copying ' + k.key + ' from ' + src_bucket_name + ' to ' + dst_bucket_name

            t0 = time.clock()
            dst_bucket.copy_key(k.key, src_bucket_name, k.key)
            print time.clock() - t0, ' seconds'

        if len(keys) < maximum_keys:
            print 'Done backing up.'
            break

        result_marker = keys[maximum_keys - 1].key

if  __name__ =='__main__':main()

Я використовую це для завдання граблі (для програми Rails):

desc "Back up a file onto S3"
task :backup do
     S3ID = "AKIAJM3NRWC7STXWUWVQ"
     S3KEY = "0A5kuzV+E1dkaPjZxHQAezz1GlSddJd0iS5sNpry"
     SRCBUCKET = "primary-mzgd"
     NUM_BACKUP_BUCKETS = 2

     Dir.chdir("#{Rails.root}/lib/tasks")
     system "./do_backup.py #{S3ID} #{S3KEY} #{SRCBUCKET} #{NUM_BACKUP_BUCKETS}"
end

1

Я чую, що для цього є модуль вузла, якщо ви користуєтесь JavaScript: p

З док-копій документів:

knoxCopy = require 'knox-copy'

client = knoxCopy.createClient
  key: '<api-key-here>'
  secret: '<secret-here>'
  bucket: 'backups'

client.copyBucket
  fromBucket: 'uploads'
  fromPrefix: '/nom-nom'
  toPrefix: "/upload_backups/#{new Date().toISOString()}"
  (err, count) ->
     console.log "Copied #{count} files"

Це не javascript, вибачте ... (так, я знаю про coffeescript і що ви можете користуватися ним, все-таки, не javascript)
Victor Schröder

1

Мені повідомили, що ви також можете це зробити за допомогою s3distcp на кластері EMR. Це має бути швидше для даних, що містять великі файли. Він працює досить добре на невеликих наборах даних, але я б віддав перевагу іншому рішенню, враховуючи криву навчання, необхідну для встановлення настільки мало даних (я ніколи раніше не працював з EMR).

Ось посилання з AWS Documentation: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

Оновлення: для того ж набору даних s3s3mirror був набагато швидшим, ніж s3distcp або AWS cli. Набагато простіше налаштувати теж.


1

Скопіювати з одного відра S3 в те саме або інше відро S3 без завантаження в локальний, його досить просто. Використовуйте команду оболонки нижче.

hdfs dfs -cp -f "s3://AccessKey:SecurityKey@ExternalBucket/SourceFoldername/*.*" "s3://AccessKey:SecurityKey@ExternalBucket/TargetFoldername"

Це скопіює всі файли з SourceFoldernameпапки вихідного відра до папки відра TargetFoldername. У наведеному вище коді, будь ласка , замініть AccessKey, SecurityKeyі ExternalBucketз відповідними значеннями.


Що таке hdfs?
Ентоні Конг

1

з AWS cli https://aws.amazon.com/cli/ ви могли б зробити

aws s3 ls - Тут буде перераховано всі відра S3

aws cp --recursive s3://<source bucket> s3://<destination bucket> - Це скопіює файли з одного відра в інше

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

Для CRR переконайтеся, що у вас відключена версія.


0

Як щодо aws s3 syncкоманди cli. aws s3 sync s3: // bucket1 / s3: // bucket2 /


0

Як пояснила Ніл Бхат у цьому блозі , існує багато різних інструментів, які можна використовувати для цієї мети. Деякі надаються AWS, де більшість є сторонніми інструментами. Усі ці інструменти вимагають збереження ключа та секрету облікового запису AWS у самому інструменті. Будьте дуже обережні при використанні сторонніх інструментів, оскільки облікові дані, в яких ви зберігаєте, можуть коштувати вам, вашій ціні і втратити вас мертвими.

Тому я завжди рекомендую використовувати для цієї мети AWS CLI . Ви можете просто встановити це за цим посиланням . Далі, запустіть таку команду і збережіть свої ключові таємні значення в AWS CLI.

aws configure

І скористайтеся наступною командою, щоб синхронізувати відро AWS S3 з локальною машиною. (На локальній машині повинен бути встановлений AWS CLI)

aws s3 sync <source> <destination>

Приклади:

1) Для AWS S3 до локального зберігання

aws s3 sync <S3Uri> <LocalPath>

2) Від локального зберігання до AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Від відра AWS s3 до іншого відра

aws s3 sync <S3Uri> <S3Uri> 

0

Найкращим способом копіювання відра S3 є використання AWS CLI .

Він включає ці 3 кроки:

  1. Встановлення AWS CLI на ваш сервер.
**https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html**
  1. Якщо ви копіюєте відра між двома обліковими записами AWS, вам потрібно додати правильну політику до кожного пакета.

  2. Після цього використовуйте цю команду для копіювання з одного відра в інше.

aws s3 sync s3://sourcebucket s3://destinationbucket

Деталі кроку 2 та кроку 3 наведені за цим посиланням:

https://aws.amazon.com/premiumsupport/knowledge-center/account-transfer-s3/


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