답변:
수백만은 큰 숫자입니다. 나중에 다시 설명하겠습니다.
접근 방식에 관계없이 기본 메커니즘은 한 버킷에서 다른 버킷으로 직접 복사해야합니다. 이러한 방식으로 (버킷이 같은 지역에 있기 때문에) 대역폭에 대한 비용이 발생하지 않습니다. 다른 접근 방식은 단순히 비효율적입니다 (예 : 파일 다운로드 및 다시 업로드).
버킷 사이의 복사는 'PUT 복사'를 사용하여 수행됩니다. 즉 'x-amz-copy-source'헤더를 포함하는 PUT 요청입니다. 이것은 COPY 요청으로 분류됩니다. 파일이 복사되고 기본적으로 관련 메타 데이터가 복사됩니다. ACL을 동시에 설정하려면 'x-amz-acl'을 올바른 값으로 포함해야합니다 (그렇지 않으면 기본값은 개인용 임). COPY 요청에 대해 요금이 청구됩니다 (1,000 달러 요청 당 0.01 달러). 불필요한 파일은 복사 된 후 삭제할 수 있습니다 (삭제 요청은 청구되지 않음). (내가 확실하지 않은 한 가지 점은 객체가 소스 버킷에서 먼저 가져와야하기 때문에 COPY 요청에 GET 요청에 대한 요금이 부과되는지 여부입니다. 요청).
위의 요금은 피할 수없는 것처럼 보입니다-백만 개의 물건에 대해 약 $ 10 (또는 $ 11)를보고 있습니다. 결국 대상 버킷에서 실제로 파일을 생성해야하므로 다른 접근 방식 (예 : 파일 tar-gzipping, Amazon Import / Export 등)은이 비용을 부담하지 않습니다. 전송해야 할 객체가 2 백만 개 이상인 경우 아마존에 문의하는 동안 가치가있을 수 있습니다.
위의 (피할 수없는 가격)을 감안할 때 다음으로 고려해야 할 것은 시간입니다. 이는 '수백만 개의 파일'을 복사 할 때 큰 요소가 될 것입니다. 버킷간에 직접 복사를 수행 할 수있는 모든 도구에는 동일한 요금이 부과됩니다. 불행히도 파일 당 하나의 요청 (복사), 삭제 요청 및 ACL 데이터 읽기 요청 (파일이 ACL이 다른 경우)이 필요합니다. 가장 빠른 속도는 가장 병렬 작업을 실행할 수있는 모든 것에서 나옵니다.
상당히 실행 가능한 몇 가지 명령 줄 접근 방식이 있습니다.
s3fs가 작동 할 가능성이 있습니다-상당히 병렬 적이며 동일한 버킷 사이의 사본을 지원합니다-다른 버킷 사이의 사본을 지원하지 않지만 다른 버킷 사이의 이동을 지원할 수 있습니다 .
s3cmd-modification으로 시작하여 성공했는지 확인하거나 더 나은 솔루션을 얻으려면 Amazon에 문의하십시오.
aws s3 sync s3://source s3://destination
적합합니까?
오래된 주제이지만 동일한 시나리오를 조사하는 사람을위한 것입니다. 시간이 지남에 따라 20,000 개 이상의 개체가 필요했습니다. AWS Linux / Centos에서 실행되며 각 객체는 대부분 비디오 및 다양한 미디어 파일과 함께 대부분 이미지입니다.
AWS CLI 도구를 사용하여 파일을 버킷 A에서 버킷 B로 복사
A. 새 버킷 생성
$ aws s3 mb s3://new-bucket-name
B. 기존 버킷을 새 버킷과 동기화
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
20,000 개 이상의 객체 복사 중 ...
시작 17:03
종료 17:06
20,000 개 이상의 객체에 대한 총 시간 = 약 3 분
새 버킷이 올바르게 구성되면 권한, 정책 등이 있고 이전 버킷을 제거하려고합니다.
C. 기존 버킷 제거 / 삭제
$ aws s3 rb --force s3://old-bucket-name
아마 지금까지 좋은 해결책을 찾았을 것입니다.하지만 최근에와 같이이 문제가 발생하는 다른 사람들을 위해 하나의 S3 버킷을 다른 것으로 미러링하기위한 간단한 유틸리티를 만들었습니다. 동시에 동시에 CPU와 메모리 효율적인 방식.
아파치 라이센스에 따라 github에 있습니다 : https://github.com/cobbzilla/s3s3mirror
당신이 그것을 시도하기로 결정하면 의견이 있으면 알려 주시기 바랍니다.
--cross-account-copy
옵션 -C
이 있습니다. 여러 계정으로 복사 할 때 ACL은 복사 되지 않습니다 . 대상 버킷의 소유자는 복사 된 데이터에 대한 모든 권한을 갖습니다.
AWS CLI는 병렬 프로세스에서 한 버킷을 다른 버킷으로 복사하는 방법을 제공합니다. https://stackoverflow.com/a/40270349/371699 에서 가져온 것 :
다음 명령은 AWS CLI에 1,000 개의 스레드를 사용하여 작업 (각각 작은 파일 또는 여러 부분 복사본의 일부)을 실행하고 100,000 개의 작업을 미리 보도록 지시합니다.
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
이를 실행 한 후 다음과 같이 simple sync 명령을 사용할 수 있습니다.
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
m4.xlarge 머신 (AWS--4 코어, 16GB RAM)에서 필자의 경우 (3-50GB 파일) 동기화 / 복사 속도가 약 9.5MiB / s에서 700 + MiB / s로 증가했습니다. 기본 구성보다 70 배.