Cách tốt nhất để di chuyển tệp giữa các nhóm S3?


89

Tôi muốn sao chép một số tệp từ nhóm sản xuất sang nhóm phát triển hàng ngày.

Ví dụ: Sao chép productionbucket / feed / feedname / date sang developmentbucket / feed / feedname / date

Bởi vì các tệp tôi muốn nằm rất sâu trong cấu trúc thư mục, quá mất thời gian để đi đến từng thư mục và sao chép / dán.

Tôi đã thử nghiệm với việc gắn các ổ đĩa vào từng nhóm và viết một tập lệnh hàng loạt của windows, nhưng điều đó rất chậm và nó tải tất cả các tệp / thư mục xuống máy chủ cục bộ và sao lưu lại một cách không cần thiết.

Câu trả lời:


109

Cập nhật

Như đã chỉ ra bởi alberge (+1), ngày nay Giao diện dòng lệnh AWS tuyệt vời cung cấp cách tiếp cận linh hoạt nhất để tương tác với (hầu hết) mọi thứ AWS - trong khi đó nó bao gồm hầu hết các API của dịch vụ và cũng có các lệnh S3 cấp cao hơn để xử lý trường hợp sử dụng cụ thể, hãy xem tham chiếu AWS CLI cho S3 :

  • sync - Đồng bộ hóa các thư mục và tiền tố S3. Trường hợp sử dụng của bạn được bao phủ bởi Ví dụ 2 (thêm mịn hạt sử dụng với --exclude, --includevà xử lý tiền tố vv cũng có sẵn):

    Lệnh đồng bộ sau đồng bộ hóa các đối tượng dưới tiền tố và nhóm được chỉ định với các đối tượng dưới tiền tố và nhóm được chỉ định khác bằng cách sao chép đối tượng s3. [...]

    aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
    

Để hoàn thiện, tôi sẽ đề cập rằng các lệnh S3 cấp thấp hơn cũng vẫn có sẵn thông qua lệnh phụ s3api , cho phép dịch trực tiếp bất kỳ giải pháp dựa trên SDK nào sang AWS CLI trước khi áp dụng chức năng cấp cao hơn của nó.


Câu trả lời ban đầu

Việc di chuyển tệp giữa các nhóm S3 có thể thực hiện được nhờ Đối tượng PUT - API Sao chép (tiếp theo là Đối tượng DELETE ):

Việc triển khai hoạt động PUT này tạo ra một bản sao của một đối tượng đã được lưu trữ trong Amazon S3. Thao tác sao chép PUT cũng giống như thực hiện GET và sau đó là PUT. Thêm tiêu đề yêu cầu, x-amz-copy-source, thực hiện thao tác PUT sao chép đối tượng nguồn vào nhóm đích. Nguồn

Có sẵn các mẫu tương ứng cho tất cả AWS SDK hiện có, hãy xem Sao chép đối tượng trong một thao tác . Đương nhiên, giải pháp dựa trên kịch bản sẽ là lựa chọn đầu tiên rõ ràng ở đây, vì vậy Sao chép một đối tượng bằng AWS SDK cho Ruby có thể là một điểm khởi đầu tốt; nếu bạn thích Python thay vào đó, điều tương tự cũng có thể đạt được thông qua boto , hãy xem phương pháp copy_key()trong tài liệu API S3 của boto .

PUT Objectchỉ sao chép tệp, vì vậy bạn sẽ cần xóa tệp qua ảnh DELETE Objecttĩnh sau khi thao tác sao chép thành công, nhưng đó sẽ chỉ là một vài dòng nữa khi tập lệnh tổng thể xử lý nhóm và tên tệp được đặt (cũng có các ví dụ tương ứng , xem ví dụ: Xóa một đối tượng cho mỗi yêu cầu ).


Tôi đã hoàn thành việc viết kịch bản cho hoạt động với AWS SDK trong .NET
Matt Dell

1
@MattDell bạn có thể thêm câu trả lời .NET cho câu hỏi này không?
balexandre

1
Điều tồi tệ về điều này là Amazon không rõ ràng về việc liệu lệnh sao chép có thành công hay không, vì vậy việc xóa sau khi thao tác có vẻ nguy hiểm.
James McMahon

Chỉ để rõ ràng, tôi đã đề cập cụ thể đến API Java. Tôi đã mở một câu hỏi riêng biệt stackoverflow.com/questions/17581582
James McMahon,

Chúng tôi vẫn cần một số cách đơn giản để tạo một id và khóa duy nhất có khả năng đọc từ một nhóm và ghi vào nhóm khác. Đặc biệt nếu các nhóm nằm trên nhiều tài khoản.
CMCDragonkai

65

AWS CLI chính thức mới nguyên bản hỗ trợ hầu hết các chức năng của s3cmd. Trước đây tôi đã sử dụng s3cmdhoặc AWS SDK ruby ​​để làm những việc như thế này, nhưng CLI chính thức hoạt động tốt cho việc này.

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

aws s3 sync s3://oldbucket s3://newbucket

4
Điều này sẽ được bình chọn lên đầu danh sách. Đó là cách thích hợp để đồng bộ nhóm và cập nhật nhất trong tất cả các câu trả lời này.
dft

Nếu bạn gặp sự cố với lỗi truy cập 403 bị từ chối, hãy xem bài đăng trên blog này. Nó đã giúp đỡ. alfielapeter.com/posts/…
crlane

3
bản sao xuyên vùngaws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
tương đương

nếu bạn cần chạy đêm cú này trên máy chủ, hãy sử dụng nohup aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1 & thegeekstuff.com/2010/12/5-ways-to-execute-linux-command
tương đương

@alberge Có cách nào để cung cấp khóa truy cập & bí mật bằng cách sử dụng đối số dòng lệnh không?
EmptyData

28

Để di chuyển / sao chép từ nhóm này sang nhóm khác hoặc cùng một nhóm, tôi sử dụng công cụ s3cmd và hoạt động tốt. Ví dụ:

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1

28

Tôi đã dành nhiều ngày để viết công cụ tùy chỉnh của riêng mình để song song các bản sao cần thiết cho việc này, nhưng sau đó tôi xem qua tài liệu về cách nhận lệnh đồng bộ AWS S3 CLI để đồng bộ hóa các nhóm với tính năng song song lớn . Các lệnh sau sẽ yêu cầu AWS CLI sử dụng 1.000 luồng để thực thi các công việc (mỗi một tệp nhỏ hoặc một phần của bản sao nhiều phần) và xem xét trước 100.000 công việc:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

Sau khi chạy chúng, bạn có thể sử dụng lệnh đồng bộ đơn giản như sau:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

Trên máy m4.xlarge (trong AWS - 4 lõi, RAM 16 GB), đối với trường hợp của tôi (tệp 3-50 GB), tốc độ đồng bộ hóa / sao chép đã tăng từ khoảng 9,5MiB / giây lên 700 + MiB / giây, tăng tốc độ 70 lần so với cấu hình mặc định.

Cập nhật: Lưu ý rằng S3CMD đã được cập nhật qua nhiều năm và những thay đổi này hiện chỉ có hiệu quả khi bạn đang làm việc với nhiều tệp nhỏ. Cũng lưu ý rằng S3CMD trên Windows (chỉ trên Windows) bị giới hạn nghiêm trọng về thông lượng tổng thể và chỉ có thể đạt được khoảng 3Gbps trên mỗi quy trình bất kể kích thước phiên bản hoặc cài đặt bạn sử dụng. Các hệ thống khác như S5CMD cũng gặp vấn đề tương tự. Tôi đã nói chuyện với nhóm S3 về điều này và họ đang xem xét nó.


Cảm ơn, tôi đã quản lý để đạt được hơn 900 MiB / s với cấu hình của bạn, tăng tốc rất lớn theo mặc định.
kozyr

@James: API có hạn chế chúng tôi trong việc đạt được tốc độ truyền cao như vậy không? Tôi đang sử dụng api transfermanager do AWS Java SDK so với CLI cung cấp từ máy T2 EC2 để truyền tệp 2 GB. Sự khác biệt về thời gian là ~ 5,5 lần (CLI - 14 giây) so với (SDK - 80 giây). Ngoài ra, tôi không thấy bất kỳ tùy chọn nào cho s3.max_queue_size trong SDK. Có ý kiến ​​gì không?
Dwarrior

@Dwarrior, cả hai cài đặt này đều dành cho CLI. Khi sử dụng SDK, bạn phải tự mình quản lý tất cả các yêu cầu xếp hàng. Bộ phận hỗ trợ AWS tuyên bố đã đạt khoảng 80% thông lượng tối đa có thể giữa EC2 và S3 bằng cách sử dụng Linux (tức là thông lượng mạng phiên bản EC2 được quảng cáo). Windows là công dân hạng hai trên AWS và không thể đạt được thậm chí một nửa con số đó với các công cụ do Amazon cung cấp và có vẻ như họ không có kế hoạch sửa chữa điều đó. :-( Với máy T2, AWS không chỉ định chính xác bạn nhận được bao nhiêu băng thông, mặc dù mọi thứ được cải thiện phần nào nếu bạn thiết lập điểm cuối S3 VPC.
James

@James Tôi đã đi đến mức song song hóa danh sách tệp của mình qua cụm trong spark, kết hợp với song song hóa trong mỗi phân vùng và sau đó sử dụng transfermanager để tải lên song song cho bất kỳ tệp nhất định nào. Tôi thấy sự cải thiện từ 80 đến 45 giây sau khi làm điều đó nhưng vẫn còn thiếu trong cách CLI xử lý từ EC2. Cảm ơn, mặc dù thiết lập này. Nó cũng cải thiện đáng kể hiệu suất trên các cửa sổ. Trong SDK, chúng tôi có thể đặt kết nối tối đa nhưng không đặt kích thước hàng đợi, vì vậy tôi nghĩ chúng tôi có thể phải rời khỏi nó. :) Mọi gợi ý về cách quản lý xếp hàng, bất kỳ mã mẫu nào mà tôi có thể lấy làm đường cơ sở.
Dwarrior

2
S5Cmd ( github.com/peakgames/s5cmd ) là tiện ích mà những người hỗ trợ AWS sử dụng để đạt được thông lượng tối đa. Kích thước phiên bản thực sự tạo ra sự khác biệt lớn. Dòng c5n mới rất tiết kiệm chi phí cho việc kết nối mạng và đạt tốc độ 100Gbps đáng kinh ngạc.
James

13

.NET Ví dụ theo yêu cầu:

using (client)
{
    var existingObject = client.ListObjects(requestForExisingFile).S3Objects; 
    if (existingObject.Count == 1)
    {
        var requestCopyObject = new CopyObjectRequest()
        {
            SourceBucket = BucketNameProd,
            SourceKey = objectToMerge.Key,
            DestinationBucket = BucketNameDev,
            DestinationKey = newKey
        };
        client.CopyObject(requestCopyObject);
    }
}

với khách hàng là một cái gì đó giống như

var config = new AmazonS3Config { CommunicationProtocol = Protocol.HTTP, ServiceURL = "s3-eu-west-1.amazonaws.com" };
var client = AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretAccessKey, config);

Có thể có một cách tốt hơn, nhưng đó chỉ là một số mã nhanh tôi đã viết để chuyển một số tệp.


1
Đó có vẻ như là một giải pháp tốt. nhưng điều gì sẽ xảy ra nếu bạn có thông tin đăng nhập khác nhau cho 2 nhóm?
Roee Gavirel

2
Thông tin xác thực dành cho việc thực hiện lệnh sao chép. Những thông tin xác thực đó yêu cầu quyền đọc / ghi thích hợp trong nhóm nguồn / đích. Để sao chép giữa các tài khoản, bạn cần sử dụng chính sách nhóm để cho phép truy cập vào nhóm từ thông tin đăng nhập của tài khoản khác.
Matt Houser,

9

Nếu bạn có máy chủ lưu trữ unix trong AWS, thì hãy sử dụng s3cmd từ s3tools.org. Thiết lập quyền để khóa của bạn dưới dạng đọc có quyền truy cập vào nhóm phát triển của bạn. Sau đó chạy:

s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname

Phía máy chủ? Không có phía máy chủ cho s3. Tất cả các lệnh được thực hiện từ một máy khách từ xa.
dk.

Nhân tiện, lệnh này dường như hoạt động tốt trên internet!
Gabe Kopley

3
Câu hỏi "phía máy chủ" là hợp lệ. Liệu s3cmd có chuyển shunt tất cả dữ liệu sang máy khách hay là chuyển trực tiếp từ S3 sang S3? Nếu trước đây, tốt hơn là chạy điều này trong đám mây AWS để tránh việc truyền WAN bên ngoài.
Bruce Edge

1
Việc sao chép diễn ra tất cả từ xa trên S3.
dk.

Cũng lưu ý rằng nếu bạn vô tình gián đoạn quá trình này s3cmd cpkhông chấp nhận các --skip-existingtùy chọn, bạn tuy nhiên có thể chạy s3cmd syncthay vì với skip hiện
ianstarz

9

Đối với tôi, lệnh sau chỉ hoạt động:

aws s3 mv s3://bucket/data s3://bucket/old_data --recursive

2
giải pháp đơn giản và dễ hiểu ... tại sao lại sử dụng các công cụ hoặc giải pháp thay thế của bên thứ 3 cho nhiệm vụ đơn giản như vậy khi điều này có thể được thực hiện với aws cli ?!
Fr0zenFyr

7

Đây là một lớp ruby ​​để thực hiện điều này: https://gist.github.com/4080793

Ví dụ sử dụng:

$ gem install aws-sdk
$ irb -r ./bucket_sync_service.rb
> from_creds = {aws_access_key_id:"XXX",
                aws_secret_access_key:"YYY",
                bucket:"first-bucket"}
> to_creds = {aws_access_key_id:"ZZZ",
              aws_secret_access_key:"AAA",
              bucket:"first-bucket"}
> syncer = BucketSyncService.new(from_creds, to_creds)
> syncer.debug = true # log each object
> syncer.perform

5

Trên thực tế, gần đây tôi chỉ sử dụng hành động sao chép + dán trong giao diện AWS s3. Chỉ cần điều hướng đến các tệp bạn muốn sao chép, nhấp vào "Tác vụ" -> "Sao chép" sau đó điều hướng đến nhóm đích và "Tác vụ" -> "Dán"

Nó chuyển các tệp khá nhanh và có vẻ như là một giải pháp ít phức tạp hơn, không yêu cầu bất kỳ lập trình nào hoặc hơn các giải pháp hàng đầu như vậy.


Đúng. Tôi đã phát hiện ra điều tương tự cách đây vài phút. Tôi đã ủng hộ, vì vậy sẽ có nhiều người tiết kiệm thời gian hơn :)
JCarlosR 13/09/17

Tôi đã thử điều đó trên một thùng để sao chép với 134.364 đối tượng trong đó. Nó đã mất hàng giờ. Và đích đến chỉ có 134.333 tệp - bản sao nói rằng nó là "Thành công", nhưng không có lời giải thích cho các tệp bị thiếu.
Warrens

Sử dụng lệnh loại "aws s3 sync" được mô tả trong các bài viết khác ở đây, tất cả 134.364 đối tượng đã được sao chép trong khoảng 20 phút.
Warrens

4

Chúng tôi đã gặp vấn đề chính xác này với các công việc ETL của mình tại Snowplow , vì vậy chúng tôi đã trích xuất mã sao chép tệp song song của mình (Ruby, được xây dựng trên Fog ), thành viên ngọc Ruby của riêng nó, được gọi là Sluice:

https://github.com/snowplow/sluice

Sluice cũng xử lý xóa, di chuyển và tải xuống tệp S3; tất cả được song song hóa và tự động thử lại nếu một hoạt động không thành công (điều mà nó thường xuyên xảy ra một cách đáng ngạc nhiên). Tôi hy vọng nó hữu ích!



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.