AWS S3 копирует файлы и папки между двумя ведрами
Я искал инструмент, который помог мне скопировать содержимое ведра S3 во второй ковш, не загружая содержимое сначала в локальную систему.
Я попробовал вариант копирования консоли AWS S3, но это привело к отсутствию некоторых вложенных файлов.
Я попытался использовать приложение Transmit (Panic), но дублирующаяся команда сначала копирует файлы в локальную систему, а затем обратно во второе ведро
Ответы
Ответ 1
Копирование между ведрами S3
AWS (совсем недавно) выпустил интерфейс командной строки для копирования между ведрами.
http://aws.amazon.com/cli/
$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp
..
Этот скопирует из одного целевого ведра в другой ведро.
См. документацию здесь: Документация по S3 CLI
Ответ 2
Упрощенный пример с использованием 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')
Ответ 3
Теперь вы можете сделать это из интерфейса администрирования S3. Просто зайдите в один ковш, выберите все ваши папки actions->copy
. Затем перейдите в новое ведро actions->paste
.
Ответ 4
Возможно с недавним жемчугом 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
Ответ 5
Я создал исполняемый файл 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
Ответ 6
Копирование между ведрами в разных регионах
$ aws s3 cp s3://src_bucket/file s3://dst_bucket/file --source-region eu-west-1 --region ap-northeast-1
Вышеупомянутая команда копирует файл из ведра в Европе (eu-west-1) в Японию (ap-северо-восток-1). Вы можете получить кодовое имя для вашего региона ковша с помощью этой команды:
$ aws s3api get-bucket-location --bucket my_bucket
Кстати, использование Copy and Paste в веб-консоли S3 очень просто, но, похоже, оно загружается из исходного кода в браузер, а затем загружается в целевой контейнер. Использование "aws s3" было намного быстрее для меня.
Ответ 7
Ознакомьтесь с приведенной ниже документацией. Я думаю, это то, что вы ищете.
http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html
RightAws gem S3Interface имеет функции копирования, которые делают выше.
http://rubydoc.info/gems/right_aws/3.0.0/RightAws/S3Interface#copy-instance_method
Ответ 8
Я бы предположил, что вы, вероятно, нашли хорошее решение к настоящему времени, но для других, которые сталкиваются с этой проблемой (как я только недавно), я создал простую утилиту специально для зеркалирования одного ведра S3 к другому в высококонкурентном, но эффективном режиме процессора и памяти.
Он на github под лицензией Apache здесь: https://github.com/cobbzilla/s3s3mirror
Если у вас очень большое ведро и вы ищете максимальную производительность, возможно, стоит попробовать.
Если вы решите попробовать, пожалуйста, дайте мне знать, если у вас есть обратная связь.
Ответ 9
Если вы находитесь в оболочке и хотите скопировать несколько файлов, но не все файлы:
s3cmd cp --recursive s3://BUCKET1/OBJECT1 s3://BUCKET2 [/OBJECT2]
Ответ 10
Я написал script, который поддерживает ведро 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
Ответ 11
Я слышу там модуль node, если вы в javascript: p
В knox-copy docs:
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"
Ответ 12
Мне сообщили, что вы также можете сделать это, используя s3distcp в кластере EMR. Он должен быть быстрее для данных, содержащих большие файлы. Он работает достаточно хорошо на небольших наборах данных - но я предпочел бы другое решение, учитывая кривую обучения, которую он потребовал, чтобы настроить для столь маленьких данных (я никогда раньше не работал с EMR).
Здесь ссылка из Документации AWS: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html
Обновление. Для того же набора данных s3s3mirror был намного быстрее, чем s3distcp или AWS cli. Гораздо проще настроить тоже.
Ответ 13
Копировать из одной корзины S3 в ту же или другую корзину S3 без загрузки в локальную систему довольно просто. Используйте приведенную ниже команду оболочки.
hdfs dfs -cp -f "s3://AccessKey:[email protected]/SourceFoldername/*.*" "s3://AccessKey:[email protected]/TargetFoldername"
Это скопирует все файлы из исходной папки Bucket SourceFoldername
в целевую папку TargetFoldername
. В приведенном выше коде замените AccessKey
, SecurityKey
и ExternalBucket
на соответствующие значения.
Ответ 14
Как насчет команды aws s3 sync
cli. aws s3 sync s3://bucket1/s3://bucket2/
Ответ 15
из AWS cli https://aws.amazon.com/cli/ вы можете сделать
aws s3 ls
- здесь будут перечислены все aws s3 ls
S3
aws cp --recursive s3://<source bucket> s3://<destination bucket>
- это скопирует файлы из одной корзины в другую
Примечание * Очень полезно при создании сегментов межрегиональной репликации. При выполнении вышеописанного все ваши файлы отслеживаются, а обновление исходного файла региона будет распространяться в реплицируемом сегменте. Все, кроме удаления файлов, синхронизируются.
Для CRR убедитесь, что у вас включено управление версиями.
Ответ 16
Как объяснил Нил Баат в этом блоге, для этой цели можно использовать много разных инструментов. Некоторые из них предоставляются AWS, а большинство - сторонними инструментами. Все эти инструменты требуют сохранения ключа учетной записи AWS и секрета в самом инструменте. Будьте очень осторожны при использовании сторонних инструментов, поскольку учетные данные, которые вы сохраняете, могут стоить вам, вашей полной стоимости и даже замертво.
Поэтому я всегда рекомендую использовать для этой цели интерфейс командной строки AWS. Вы можете просто установить это по этой ссылке. Затем выполните следующую команду и сохраните ключ, секретные значения в CLI AWS.
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>
Ответ 17
Лучший способ скопировать корзину S3 - использовать интерфейс командной строки AWS.
Он включает в себя эти 3 шага:
- Установка AWS CLI на вашем сервере.
**https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html**
-
Если вы копируете сегменты между двумя учетными записями AWS, вам необходимо прикрепить правильную политику к каждому сегменту.
-
После этого используйте эту команду для копирования из одного сегмента в другой.
aws s3 sync s3://sourcebucket s3://destinationbucket
Детали шага 2 и шага 3 приведены в этой ссылке:
https://aws.amazon.com/premiumsupport/knowledge-center/account-transfer-s3/