AWS S3 sao chép tệp và thư mục giữa hai nhóm


112

Tôi đã tìm kiếm một công cụ giúp tôi sao chép nội dung của nhóm AWS S3 vào nhóm AWS S3 thứ hai mà không cần tải nội dung đó xuống hệ thống tệp cục bộ trước.

Tôi đã cố gắng sử dụng tùy chọn sao chép bảng điều khiển AWS S3 nhưng điều đó dẫn đến việc thiếu một số tệp lồng nhau.

Tôi đã cố gắng sử dụng ứng dụng Truyền (của Panic). Lệnh trùng lặp tải tệp xuống trước tiên vào hệ thống cục bộ sau đó tải chúng trở lại nhóm thứ hai, điều này khá kém hiệu quả.


Cân nhắc tăng số lượng yêu cầu đồng thời của bạn aws configure set default.s3.max_concurrent_requests 200 Xem bài đăng này để biết thêm chi tiết và các tùy chọn stackoverflow.com/questions/4663016/…
Balmipour

Câu trả lời:


175

Sao chép giữa các Nhóm S3

AWS (mới đây) đã phát hành giao diện dòng lệnh để sao chép giữa các nhóm.

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

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

Thao tác này sẽ sao chép từ một nhóm đích sang một nhóm khác.

Xem tài liệu tại đây: Tài liệu S3 CLI


Chạy nó từ EC2 và được sao chép 80MB trong khoảng 5 giây.
Stew-au

1
Chính xác những gì tôi cần, vì đá quý aws-sdk không có tính năng sao chép hoặc đồng bộ hóa toàn bộ nhóm cùng một lúc. Cảm ơn!
odigity

Nó ném ra lỗi sauA 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.
Giovanni Bitliner

@GiovanniBitliner Tên nhóm bạn đang sử dụng không chính xác. Bạn đang sử dụng tiền tố sai hoặc sử dụng cách cũ để chỉ nhóm. Kiểm tra chính xác tên nhóm của bạn trong bảng điều khiển dành cho quản trị viên.
Đặt

8
Lưu ý nếu đây là lần đầu tiên bạn sử dụng công cụ cli, bạn cần chạy 'aws config' và nhập các khoản tín dụng của bạn
S ..

41

Một ví dụ đơn giản bằng cách sử dụng đá quý 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')

Nếu bạn muốn thực hiện sao chép giữa các nhóm khác nhau, hãy chỉ định tên nhóm đích:

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

41

Bây giờ bạn có thể làm điều đó từ giao diện quản trị S3. Chỉ cần vào một nhóm để chọn tất cả các thư mục của bạn actions->copy. Sau đó chuyển sang nhóm mới của bạn actions->paste.


4
Tuyệt vời! Anh ấy đang đề cập đến giao diện web. Không giống như hầu hết những người khác, tôi có thể làm điều này từ iPad.
Jacob Foshee

2
Điều này ngẫu nhiên loại bỏ các đối tượng lồng nhau trong các thư mục con - 3 năm sau và AWS vẫn không thể sửa một lỗi cơ bản như vậy!
RunLoop

nó dành cho cùng một vùng hay tất cả?
hakiko

1
Những vấn đề này có được ghi nhận bởi Amazon không? @RunLoop
davetapley Ngày

1
@dukedave Tôi không biết và đã không kiểm tra lại trong một thời gian khá lâu vì tôi đã sử dụng cách sao chép qua dòng lệnh vì nó hoạt động hoàn hảo.
RunLoop

8

Có thể với đá quý aws-sdk gần đây , hãy xem mẫu mã:

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

thêm chi tiết: Cách sao chép tệp qua các nhóm bằng đá quý aws-s3


Cảm ơn bạn đã chỉ cách sao chép trên các máy chủ. Tôi đang cố gắng sao chép từ máy chủ của chúng tôi sang máy chủ Singapore.
Arcolye

@Arcolye hiện tại độ trễ trong AWS Singapore như thế nào? Nó chậm và không nhất quán cách đây một năm.
Anatoly

7

Sao chép giữa các nhóm ở các vùng khác nhau

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

Lệnh trên sao chép tệp từ một nhóm ở Châu Âu (eu-west-1) sang Nhật Bản (ap-Northwest-1). Bạn có thể lấy tên mã cho vùng của nhóm bằng lệnh sau:

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

Nhân tiện, sử dụng Sao chép và Dán trong bảng điều khiển web S3 rất dễ dàng, nhưng có vẻ như tải xuống từ nhóm nguồn vào trình duyệt, sau đó tải lên nhóm đích. Tôi sử dụng "aws s3" nhanh hơn nhiều.


6

Tôi đã tạo tệp thi hành Docker của công cụ s3s3mirror . Một tiện ích để sao chép và nhân bản từ một nhóm AWS S3 sang một nhóm khác.

Nó được phân luồng cho phép SAO CHÉP song song và rất hiệu quả về bộ nhớ, nó thành công khi s3cmd hoàn toàn không thành công.

Sử dụng:

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

Để có danh sách đầy đủ các tùy chọn, hãy thử:

docker run pmoust/s3s3mirror 


5

Tôi tưởng tượng rằng bạn có thể đã tìm thấy một giải pháp tốt ngay bây giờ, nhưng đối với những người khác đang gặp phải vấn đề này (như tôi mới đây), tôi đã tạo ra một tiện ích đơn giản dành riêng cho mục đích sao chép một thùng S3 sang một thùng khác trong một cách đồng thời cao nhưng CPU và bộ nhớ hiệu quả.

Nó trên github theo Giấy phép Apache tại đây: https://github.com/cobbzilla/s3s3mirror

Khi bạn có một thùng rất lớn và đang tìm kiếm hiệu suất tối đa, nó có thể đáng để thử.

Nếu bạn quyết định dùng thử, vui lòng cho tôi biết nếu bạn có bất kỳ phản hồi nào.


Tôi đã có một trải nghiệm tuyệt vời với s3s3mirror. Tôi đã có thể thiết lập nó trên một nút EC2 m1.small và sao chép 1,5 triệu đối tượng trong khoảng 2 giờ. Việc thiết lập hơi khó khăn, do tôi không quen với Maven và Java, nhưng chỉ mất một vài lệnh apt-get trên Ubuntu để cài đặt mọi thứ. Một lưu ý cuối cùng: Nếu (như tôi) bạn lo lắng về việc chạy một tập lệnh không xác định trên một nhóm s3 lớn, quan trọng, hãy tạo một người dùng đặc biệt có quyền truy cập chỉ đọc trên nhóm sao chép từ và sử dụng các thông tin đăng nhập đó. Không có khả năng xóa ngẫu nhiên.
Micah

4

Nếu bạn đang ở trong shell và muốn sao chép nhiều tệp nhưng không phải tất cả các tệp: s3cmd cp --recursive s3: // BUCKET1 / OBJECT1 s3: // BUCKET2 [/ OBJECT2]


3

Tôi đã viết một tập lệnh sao lưu nhóm 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()

Tôi sử dụng điều này trong tác vụ rake (đối với ứng dụng 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

Tôi nghe nói có một mô-đun nút cho điều đó nếu bạn thích javascript: p

Từ tài liệu 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"

Đây không phải là javascript, xin lỗi ... (vâng, tôi biết coffeescript và bạn có thể sử dụng nó, vẫn còn, không javascript)
Victor Schröder

1

Tôi đã được thông báo rằng bạn cũng có thể thực hiện việc này bằng cách sử dụng s3distcp trên một cụm EMR. Nó được cho là sẽ nhanh hơn đối với dữ liệu chứa các tệp lớn. Nó hoạt động đủ tốt trên các tập dữ liệu nhỏ - nhưng tôi sẽ thích một giải pháp khác vì đường cong học tập cần thiết để thiết lập cho quá ít dữ liệu (tôi chưa bao giờ làm việc với EMR trước đây).

Đây là liên kết từ Tài liệu AWS: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html

Cập nhật: Đối với cùng một tập dữ liệu, s3s3mirror nhanh hơn nhiều so với s3distcp hoặc AWS cli. Dễ dàng thiết lập hơn nhiều.


1

Để sao chép từ một nhóm S3 sang cùng một hoặc một nhóm S3 khác mà không cần tải xuống cục bộ, nó khá đơn giản. Sử dụng lệnh shell dưới đây.

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

Thao tác này sẽ sao chép tất cả các tệp từ SourceFoldernamethư mục của nhóm nguồn sang thư mục của nhóm đích TargetFoldername. Trong đoạn mã trên, hãy thay thế AccessKey, SecurityKeyExternalBucketvới giá trị tương ứng của bạn.


hdfsgì?
Anthony Kong

1

từ AWS, bấm https://aws.amazon.com/cli/ bạn có thể làm

aws s3 ls - Điều này sẽ liệt kê tất cả các nhóm S3

aws cp --recursive s3://<source bucket> s3://<destination bucket> - Thao tác này sẽ sao chép các tệp từ nhóm này sang nhóm khác

Lưu ý * Rất hữu ích khi tạo nhóm sao chép vùng chéo, bằng cách làm như trên, tất cả các tệp của bạn đều được theo dõi và bản cập nhật cho tệp vùng nguồn sẽ được truyền tới nhóm sao chép. Tất cả mọi thứ trừ việc xóa tệp được đồng bộ hóa.

Đối với CRR, hãy đảm bảo rằng bạn đã bật lập phiên bản trên nhóm.


0

Làm thế nào về aws s3 synclệnh cli. aws s3 đồng bộ s3: // bucket1 / s3: // bucket2 /


0

Như Neel Bhaat đã giải thích trong blog này , có nhiều công cụ khác nhau có thể được sử dụng cho mục đích này. Một số được cung cấp AWS, trong đó hầu hết là các công cụ của bên thứ ba. Tất cả các công cụ này đều yêu cầu bạn lưu khóa và bí mật tài khoản AWS của mình trong chính công cụ đó. Hãy hết sức thận trọng khi sử dụng các công cụ của bên thứ ba, vì bằng chứng xác thực bạn lưu có thể khiến bạn mất giá, toàn bộ giá trị của bạn và khiến bạn chết.

Do đó, tôi luôn khuyên bạn nên sử dụng AWS CLI cho mục đích này. Bạn chỉ cần cài đặt nó từ liên kết này . Tiếp theo, chạy lệnh sau và lưu các giá trị khóa, bí mật của bạn trong AWS CLI.

aws configure

Và sử dụng lệnh sau để đồng bộ hóa Nhóm AWS S3 với máy cục bộ của bạn. (Máy cục bộ phải được cài đặt AWS CLI)

aws s3 sync <source> <destination>

Ví dụ:

1) Đối với AWS S3 vào Bộ nhớ cục bộ

aws s3 sync <S3Uri> <LocalPath>

2) Từ Bộ nhớ cục bộ sang AWS S3

aws s3 sync <LocalPath> <S3Uri>

3) Từ nhóm AWS s3 sang nhóm khác

aws s3 sync <S3Uri> <S3Uri> 

0

Cách tốt nhất để sao chép nhóm S3 là sử dụng AWS CLI .

Nó bao gồm 3 bước sau:

  1. Cài đặt AWS CLI trên máy chủ của bạn.
**https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html**
  1. Nếu bạn đang sao chép nhóm giữa hai tài khoản AWS, bạn cần đính kèm chính sách chính xác với mỗi nhóm.

  2. Sau đó, sử dụng lệnh này để sao chép từ nhóm này sang nhóm khác.

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

Chi tiết của bước 2bước 3 được cung cấp trong liên kết này:

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.