AWS S3 копирует файлы и папки между двумя корзинами - PullRequest
104 голосов
/ 15 февраля 2012

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

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

Я пытался использовать приложение Transmit (Panic), но дублирующая команда сначала копирует файлы в локальную систему, а затем обратно во второе ведро

Ответы [ 17 ]

161 голосов
/ 12 сентября 2013

Копирование между сегментами S3

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

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

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

This скопирует из одного целевого сегмента в другой.

См. Документацию здесь: Документация по S3 CLI

40 голосов
/ 20 августа 2012

Упрощенный пример с использованием gem 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')
37 голосов
/ 22 декабря 2013

Теперь вы можете сделать это из интерфейса администратора S3. Просто зайдите в одно ведро, выберите все свои папки actions->copy. Затем переместитесь в свое новое ведро actions->paste.

7 голосов
/ 09 мая 2012

Это возможно с недавним aws-sdk gem, см. Пример кода:

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})

подробнее: Как скопировать файл между корзинами, используя gem aws-s3

7 голосов
/ 02 ноября 2015

Копирование между сегментами в разных регионах

$ 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 голосов
/ 22 августа 2014

Я создал исполняемый файл 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 голосов
/ 17 мая 2013

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

Он находится на github под лицензией Apache здесь: https://github.com/cobbzilla/s3s3mirror

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

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

5 голосов
/ 16 февраля 2012

Ознакомьтесь с документацией ниже.Я думаю, это то, что вы ищете.http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html

S3Interface компании RightAws gem имеет функции копирования, которые выполняют вышеописанное.

http://rubydoc.info/gems/right_aws/3.0.0/RightAws/S3Interface#copy-instance_method

4 голосов
/ 02 мая 2013

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

3 голосов
/ 14 сентября 2012

Я написал скрипт для резервного копирования корзины 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()

Я использую это в задаче rake (для приложения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...