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

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

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

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

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



답변

최신 정보

으로 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을 통해 파일을 명시 적으로 삭제해야 하지만 버킷 및 파일 이름을 처리하는 전체 스크립트가 제자리에 있으면 몇 줄만 더 추가됩니다 (각 예제도 있습니다. , 예를 들어 요청 당 하나의 개체 삭제 참조 ).


답변

새로운 공식 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


답변

이에 필요한 복사본을 병렬화하기 위해 며칠 동안 사용자 지정 도구를 작성했지만 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 팀과 이야기했고 그들은 그것을 조사하고 있습니다.


답변

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

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


답변

요청 된 .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);

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


답변

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

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


답변

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

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