S3 버킷간에 파일을 이동하는 가장 좋은 방법은 무엇입니까?


90

매일 프로덕션 버킷에서 개발 버킷으로 일부 파일을 복사하고 싶습니다.

예 : productionbucket / feed / feedname / date를 developmentbucket / feed / feedname / date에 복사하십시오.

원하는 파일이 폴더 구조에 너무 깊기 때문에 각 폴더로 이동하여 복사 / 붙여 넣기하는 데 너무 많은 시간이 걸립니다.

각 버킷에 드라이브를 마운트하고 Windows 배치 스크립트를 작성하는 작업을 해봤지만 이는 매우 느리고 불필요하게 모든 파일 / 폴더를 로컬 서버에 다운로드하고 다시 백업합니다.

답변:


110

최신 정보

으로 alberge 지적 (+1), 현재 우수한 AWS 명령 줄 인터페이스 (거의) 모든 것을 AWS와 상호 작용에 가장 다양한 접근 방식을 제공합니다 - 그것은 한편 대부분의 서비스 'API를 포함하고 또한 특징으로 높은 수준의 S3 명령을 처리하기위한 당신의 특히 사용 사례 는 S3에 대한 AWS CLI 참조를 참조 하십시오 .

  • 동기화 - 동기화합니다 디렉토리와 S3 접두사. 사용 사례가 적용되는 예 2 (더 벌금과 함께 사용 그레인 --exclude, --include등 처리 접두사도 가능)

    다음 sync 명령은 s3 객체를 복사하여 지정된 접두사 및 버킷 아래의 객체를 다른 지정된 접두사 및 버킷 아래의 객체에 동기화합니다. [...]

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

완전성을 위해 하위 수준 S3 명령s3api 하위 명령 을 통해서도 계속 사용할 수 있으며 , 이는 궁극적으로 상위 수준 기능을 채택하기 전에 모든 SDK 기반 솔루션을 AWS CLI로 직접 변환 할 수 있습니다.


초기 답변

S3 버킷 간 파일 이동은 PUT Object-Copy API (뒤에 DELETE Object ) 를 사용하여 수행 할 수 있습니다 .

이 PUT 작업 구현은 Amazon S3에 이미 저장된 객체의 복사본을 생성합니다. PUT 복사 작업은 GET을 수행 한 다음 PUT를 수행하는 것과 동일합니다. 요청 헤더 x-amz-copy-source를 추가하면 PUT 작업이 원본 객체를 대상 버킷에 복사합니다. 출처

사용 가능한 모든 기존 AWS SDK에 대한 각각의 샘플이 있습니다 . 단일 작업으로 객체 복사를 참조하십시오 . 당연히 여기서는 스크립팅 기반 솔루션이 당연한 첫 번째 선택 이 될 것이므로 Ruby 용 AWS SDK를 사용하여 객체 복사 가 좋은 시작점이 될 수 있습니다. 대신 Python을 선호하는 경우 boto 를 통해 동일한 작업을 수행 할 수 있습니다 . copy_key()boto의 S3 API 문서 내의 method를 참조하십시오 .

PUT Object파일 만 복사하므로 DELETE Object성공적인 복사 작업 후 still을 통해 파일을 명시 적으로 삭제해야 하지만 버킷 및 파일 이름을 처리하는 전체 스크립트가 제자리에 있으면 몇 줄만 더 추가됩니다 (각 예제도 있습니다. , 예를 들어 요청 당 하나의 개체 삭제 참조 ).


나는 .NET에서 AWS SDK와 함께 작업을 스크립팅 결국
매트 델에게

1
@MattDell이 질문에 .NET 답변을 추가 할 수 있습니까?
balexandre

1
이것에 대해 짜증나는 것은 Amazon이 복사 명령이 성공했는지 여부에 대해 명확하지 않기 때문에 작업 후 삭제가 위험 해 보인다는 것입니다.
James McMahon

명확하게 말하자면 저는 특별히 Java API를 언급했습니다. 나는 별도의 질문 연 stackoverflow.com/questions/17581582
제임스 맥마흔

한 버킷에서 읽고 다른 버킷에 쓸 수있는 단일 ID 및 키를 만드는 간단한 방법이 여전히 필요합니다. 특히 버킷이 여러 계정에있는 경우.
CMCDragonkai

66

새로운 공식 AWS CLI는 기본적으로 s3cmd. 이전에는 s3cmd또는 루비 AWS SDK를 사용하여 이와 같은 작업을 수행했지만 공식 CLI가 이에 적합합니다.

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

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

4
이것은 목록의 맨 위에 투표되어야합니다. 버킷을 동기화하는 적절한 방법이며 이러한 모든 답변에서 가장 최신입니다.
dft

403 액세스 거부 오류에 문제가있는 경우이 블로그 게시물을 참조하십시오. 도움이되었습니다. alfielapeter.com/posts/…
crlane

3
교차 리전 복사aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
동등

이 밤을 서버에서 실행해야한다면 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를
equivalent8

@alberge 명령 줄 인수를 사용하여 액세스 키 및 비밀을 제공하는 방법이 있습니까?
EmptyData

29

이에 필요한 복사본을 병렬화하기 위해 며칠 동안 사용자 지정 도구를 작성했지만 AWS S3 CLI sync 명령을 사용하여 버킷을 대규모 병렬화로 동기화하는 방법대한 설명서를 살펴 보았습니다 . 다음 명령은 AWS CLI에 1,000 개의 스레드를 사용하여 작업 (각 작은 파일 또는 멀티 파트 복사본의 일부)을 실행하고 100,000 개의 작업을 미리 보도록 지시합니다.

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

이를 실행 한 후 다음과 같이 간단한 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 배.

업데이트 : S3CMD는 수년에 걸쳐 업데이트되었으며 이러한 변경 사항은 이제 많은 작은 파일로 작업하는 경우에만 적용됩니다. 또한 Windows의 S3CMD (Windows 만 해당)는 전체 처리량이 심각하게 제한되며 사용하는 인스턴스 크기 나 설정에 관계없이 프로세스 당 약 3Gbps 만 달성 할 수 있습니다. S5CMD와 같은 다른 시스템에도 동일한 문제가 있습니다. 나는 이에 대해 S3 팀과 이야기했고 그들은 그것을 조사하고 있습니다.


감사합니다. 구성으로 900 + MiB / s 이상을 얻을 수 있었으며 기본 속도보다 훨씬 빨라졌습니다.
kozyr

@James : API가 그러한 고속 전송을 달성하는 데 제한을 주나요? AWS Java SDK에서 제공하는 transfermanager API와 T2 EC2 시스템의 CLI를 사용하여 2GB 파일을 전송하고 있습니다. 시간 차이는 ~ 5.5 배 (CLI-14 초)와 (SDK-80 초)입니다. 또한 SDK에서 s3.max_queue_size에 대한 옵션이 표시되지 않습니다. 다른하실 말씀 있나요?
Dwarrior

@Dwarrior,이 두 설정은 모두 CLI 용입니다. SDK를 사용하는 경우 대기열에있는 모든 요청을 직접 관리해야합니다. AWS 지원은 Linux를 사용하는 EC2와 S3 사이에서 가능한 최대 처리량의 약 80 %에 도달했다고 주장합니다 (예 : 광고 된 EC2 인스턴스 네트워크 처리량). Windows는 AWS에서 2 등 시민이며 Amazon 제공 도구로는 절반도 얻을 수 없으며이를 수정할 계획이없는 것 같습니다. :-( T2 머신의 경우 AWS는 확보하는 대역폭의 양을 정확히 지정하지 않지만 S3 VPC 엔드 포인트를 설정하면 상황이 다소 개선됩니다.
James

@James 나는 스파크에서 클러스터를 통해 파일 목록을 병렬화하고 각 파티션 내에서 병렬화와 결합한 다음 주어진 파일에 대한 병렬 업로드를 위해 transfermanager를 사용하는 정도까지 갔다. 이 작업을 수행 한 후 80 초에서 45 초로 개선되었지만 CLI가 EC2에서 처리하는 방식이 여전히 누락되었습니다. 그래도이 설정에 감사드립니다. 창에 비해 성능이 크게 향상되었습니다. SDK에서는 최대 연결을 설정할 수 있지만 대기열 크기는 설정할 수 없으므로 그대로 두어야 할 수도 있습니다. :) 큐잉을 관리하는 방법에 대한 포인터, 기준선으로 사용할 수있는 모든 샘플 코드.
Dwarrior

2
S5Cmd ( github.com/peakgames/s5cmd )는 AWS 지원 사람들이 최대 처리량을 위해 사용하는 유틸리티입니다. 인스턴스 크기는 큰 차이를 만듭니다. 새로운 c5n 시리즈는 네트워킹에 매우 비용 효율적이며 놀라운 100Gbps에 이릅니다.
James

28

한 버킷에서 다른 버킷 또는 동일한 버킷으로 이동 / 복사하려면 s3cmd 도구를 사용하고 제대로 작동합니다. 예를 들면 :

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

13

요청 된 .NET 예제 :

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

클라이언트는

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

더 나은 방법이있을 수 있지만 일부 파일을 전송하기 위해 작성한 빠른 코드 일뿐입니다.


1
좋은 해결책 인 것 같습니다. 하지만 2 개의 버킷에 대해 다른 자격 증명이 있으면 어떻게됩니까?
Roee Gavirel 2014 년

2
자격 증명은 복사 명령을 실행하기위한 것입니다. 이러한 단일 자격 증명에는 소스 / 대상 버킷에서 적절한 읽기 / 쓰기 권한이 필요합니다. 계정간에 복사하려면 버킷 정책을 사용하여 다른 계정의 자격 증명에서 버킷에 대한 액세스를 허용해야합니다.
Matt Houser

9

AWS 내에 unix 호스트가있는 경우 s3tools.org의 s3cmd를 사용합니다. 키가 개발 버킷에 대한 읽기 액세스 권한이되도록 권한을 설정합니다. 그런 다음 다음을 실행하십시오.

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

서버 측? s3에는 서버 측이 없습니다. 모든 명령은 원격 클라이언트에서 수행됩니다.
dk.

그런데이 명령은 인터넷을 통해 잘 작동하는 것 같습니다!
Gabe Kopley 2013 년

3
"서버 측"질문이 유효합니다. s3cmd 전송은 모든 데이터를 클라이언트로 분류합니까, 아니면 S3에서 S3 로의 직접 전송입니까? 전자의 경우 외부 WAN 전송을 피하기 위해 AWS 클라우드에서 실행하는 것이 좋습니다.
Bruce Edge

1
복사는 모두 S3에서 원격으로 발생합니다.
dk.

또한 실수로이 프로세스를 중단하는 경우 옵션이 s3cmd cp허용되지 않지만 대신 기존 건너 뛰기로 --skip-existing실행할 수 있습니다.s3cmd sync
ianstarz

9

나를 위해 다음 명령이 방금 작동했습니다.

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

2
간단하고 직접적인 솔루션 ... AWS CLI로 수행 할 수있는 간단한 작업에 타사 도구 또는 해결 방법을 사용하는 이유는 무엇입니까?!
Fr0zenFyr

7

다음은이를 수행하기위한 루비 클래스입니다 : https://gist.github.com/4080793

사용 예 :

$ 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

6

실제로 최근에는 AWS s3 인터페이스에서 복사 + 붙여 넣기 작업을 사용했습니다. 복사하려는 파일로 이동하여 "작업"-> "복사"를 클릭 한 다음 대상 버킷 및 "작업"-> "붙여 넣기"로 이동하면됩니다.

파일을 매우 빠르게 전송하며 프로그래밍이 필요하지 않은 덜 복잡한 솔루션이거나 이와 같은 최고 솔루션보다 더 나은 것 같습니다.


예. 몇 분 전에 같은 것을 발견했습니다. 나는 upvoted, 그래서 더 많은 사람들이 시간을 절약 할 것입니다 :)
JCarlosR

버킷에 134,364 개의 객체가있는 버킷 복사본을 시도했습니다. 몇 시간이 걸렸습니다. 그리고 대상은 134,333 개의 파일로 끝났습니다. 복사본은 "성공"이라고 말했지만 누락 된 파일에 대한 설명은 없었습니다.
워렌 스

여기의 다른 게시물에 설명 된 "aws s3 sync"유형 명령을 사용하여 134,364 개 객체가 모두 약 20 분 만에 복사되었습니다.
warrens

4

Snowplow 의 ETL 작업에이 정확한 문제가 있었기 때문에 병렬 파일 복사 코드 (Ruby, Fog 위에 빌드 됨 )를 Sluice라는 자체 Ruby gem으로 추출 했습니다.

https://github.com/snowplow/sluice

Sluice는 S3 파일 삭제, 이동 및 다운로드도 처리합니다. 모두 병렬화되고 작업이 실패하면 자동 재시도 (놀랍게도 자주 발생 함). 유용하기를 바랍니다!



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.