AWS S3 копирует файлы и папки между двумя корзинами

112

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

Я попытался использовать опцию копирования консоли AWS S3, но это привело к отсутствию некоторых вложенных файлов.

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

cnicolaou
источник
Рассмотреть возможность увеличения ваш параллельный подсчет запроса 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

Layke
источник
Запустил его из EC2 и скопировал 80 МБ примерно за 5 секунд.
Stew-au
1
Именно то, что мне было нужно, поскольку в геме aws-sdk нет функции для одновременного копирования или синхронизации всего ведра. Спасибо!
odigity
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 Вы используете неверное имя сегмента. Вы либо используете неправильный префикс, либо используете старый способ обращения к корзине. Проверьте название своей корзины точно в консоли администратора.
Layke
8
Обратите внимание: если вы впервые используете инструмент cli, вам необходимо запустить aws configure и ввести свои кредиты
S ..
41

Упрощенный пример использования гема aws-sdk:

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.

KDEx
источник
4
Потрясающие! Он имеет в виду веб-интерфейс. В отличие от большинства других, я мог делать это с iPad.
Джейкоб Фоши
2
Это случайным образом не учитывает вложенные объекты во вложенных папках - спустя 3 года AWS все еще не может исправить такую ​​простую ошибку!
RunLoop 01
это для тех же регионов или для всех?
hakiko 06
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

Анатолий
источник
Спасибо, что показали, как копировать между серверами. Я пытаюсь скопировать с нашего сервера на сингапурский сервер.
Arcolye
@Arcolye, как сейчас задержка в AWS Singapore? Год назад это было медленно и непоследовательно.
Анатолий
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 в другую.

Он многопоточен, что позволяет выполнять параллельное КОПИРОВАНИЕ и очень эффективно использовать память, он успешно работает там, где s3cmd полностью не работает.

Использование:

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

Если у вас очень большой ковш и вы ищете максимальную производительность, возможно, стоит попробовать.

Если вы решите попробовать, дайте мне знать, если у вас есть отзывы.

Cobbzilla
источник
У меня был большой опыт работы с s3s3mirror. Мне удалось установить его на узле m1.small EC2 и скопировать 1,5 миллиона объектов примерно за 2 часа. Установка была немного сложной из-за моего незнания Maven и Java, но для установки всего потребовалось всего несколько команд apt-get в Ubuntu. И последнее замечание: если (как и я) вас беспокоит запуск неизвестного сценария в большом важном сегменте s3, создайте специального пользователя с доступом только для чтения в сегменте copy-from и используйте эти учетные данные. Нет шансов на случайное удаление.
Micah
4

Если вы находитесь в оболочке и хотите скопировать несколько файлов, но не все файлы: s3cmd cp --recursive s3: // BUCKET1 / OBJECT1 s3: // BUCKET2 [/ OBJECT2]

user1978008
источник
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

Из документов knox-copy :

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"
hurrymaplelad
источник
Это не javascript, извините ... (да, я знаю о coffeescript и что вы можете его использовать, но не javascript)
Виктор Шредер,
1

Мне сообщили, что вы также можете сделать это с помощью s3distcp в кластере EMR. Предполагается, что это будет быстрее для данных, содержащих большие файлы. Он достаточно хорошо работает с небольшими наборами данных, но я бы предпочел другое решение, учитывая кривую обучения, которая потребовалась для настройки такого небольшого объема данных (я никогда раньше не работал с EMR).

Вот ссылка из документации AWS: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

Обновление: для того же набора данных s3s3mirror был намного быстрее, чем s3distcp или AWS cli. Гораздо проще настроить.

curious_george
источник
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 убедитесь, что для сегментов включено управление версиями.

vredrav
источник
0

Как насчет aws s3 syncкоманды cli. aws s3 sync s3: // bucket1 / s3: // bucket2 /


источник
0

Как объяснил Нил Бхаат в этом блоге , для этой цели можно использовать множество различных инструментов. Некоторые из них предоставляются AWS, большинство из них - сторонние инструменты. Все эти инструменты требуют, чтобы вы сохранили ключ и секрет своей учетной записи AWS в самом инструменте. Будьте очень осторожны при использовании сторонних инструментов, так как учетные данные, которые вы сохраняете, могут стоить вам всей вашей ценности и убить вас.

Поэтому я всегда рекомендую использовать для этой цели AWS CLI . Вы можете просто установить это по этой ссылке . Затем выполните следующую команду и сохраните ключ и секретные значения в AWS CLI.

aws configure

И используйте следующую команду для синхронизации AWS S3 Bucket с локальным компьютером. (На локальном компьютере должен быть установлен 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/

Шубхам Упадхьяй
источник