在S3存储桶之间移动文件的最佳方法?

时间:2012-03-12 09:56:05

标签: amazon-s3

我想每天将一些文件从生产存储桶复制到开发存储桶。

例如: 复制productionbucket / feed / feedname / date 到developmentbucket / feed / feedname / date

因为我想要的文件在文件夹结构中非常深,所以转到每个文件夹并复制/粘贴都太费时了。

我已经玩过将驱动器安装到每个存储桶并编写Windows批处理脚本,但这非常慢,并且不必要地将所有文件/文件夹下载到本地服务器并重新备份。

12 个答案:

答案 0 :(得分:100)

更新

作为pointed out by alberge(+1),现在优秀的AWS Command Line Interface提供了与(几乎)所有事物进行交互的最通用的方法 - 它同时涵盖了大多数服务的API以及更高级别的S3命令专门用于处理您的用例,请参阅AWS CLI reference for S3

  • sync - Syncs目录和S3前缀。您的使用案例由Example 2涵盖(使用--exclude进行更细粒度的使用,--include和前缀处理等也可用):
      

    以下sync命令通过复制s3对象将指定前缀和存储区下的对象同步到另一个指定前缀和存储区下的对象。 [...]

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

为了完整起见,我会提到低级别S3命令仍然可以通过s3api子命令获得,这将允许直接将任何基于SDK的解决方案转换为AWS CLI最终采用其更高级别的功能之前。


初步答复

可以通过PUT Object - Copy API(后跟DELETE Object)来实现在S3存储桶之间移动文件:

  

PUT操作的这种实现创建了一个对象的副本   已存储在Amazon S3中。 PUT复制操作是相同的   执行GET然后执行PUT。添加请求标头,   x-amz-copy-source,使PUT操作将源对象复制到   目的地桶。 Source

可用的所有现有AWS软件开发工具包都有相应的示例,请参阅Copying Objects in a Single Operation。当然,基于脚本的解决方案在这里显然是首选,因此Copy an Object Using the AWS SDK for Ruby可能是一个很好的起点;如果您更喜欢Python,那么同样可以通过boto来实现,当然,请参阅boto的S3 API documentation中的方法copy_key()

PUT Object仅复制文件,因此您需要在成功复制操作后仍然通过DELETE Object显式删除文件,但是一旦整个脚本处理存储桶,这将只是另外几行并且文件名已经到位(也有相应的例子,参见例如Deleting One Object Per Request)。

答案 1 :(得分:63)

新官方AWS CLI本身支持s3cmd的大部分功能。我以前一直在使用s3cmd或ruby AWS SDK来做这样的事情,但官方CLI对此非常有用。

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

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

答案 2 :(得分:26)

要从一个桶移动/复制到另一个桶或同一个桶我使用s3cmd工具并且工作正常。例如:

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

答案 3 :(得分:16)

我花了几天时间编写自己的自定义工具来并行化所需的副本,但后来我在how to get the AWS S3 CLI sync command to synchronize buckets with massive parallelization上搜索了文档。以下命令将告诉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倍。

更新:请注意,多年来S3CMD已经更新,现在这些更改仅在您处理大量小文件时才有效。另请注意,Windows上的S3CMD(仅限Windows)严重限制了整体吞吐量,无论您使用何种实例大小或设置,每个进程只能达到约3Gbps。其他系统如S5CMD也有同样的问题。我已经和S3团队讨论了这个问题,他们正在研究它。

答案 4 :(得分:12)

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

可能有一种更好的方法,但它只是为了传输一些文件而编写的一些快速代码。

答案 5 :(得分:8)

如果您在AWS中有unix主机,请使用s3tools.org中的s3cmd。设置权限,以便您的密钥作为对开发存储桶的读取权限。然后运行:

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

答案 6 :(得分:7)

对我来说,以下命令才有效:

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

答案 7 :(得分:6)

以下是执行此操作的ruby类: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

答案 8 :(得分:5)

实际上,最近我只使用AWS s3界面中的复制+粘贴操作。只需导航到要复制的文件,然后单击"操作" - > "复印"然后导航到目标存储桶和"操作" - > "粘贴"

它可以非常快速地传输文件,它似乎是一个不太复杂的解决方案,不需要任何编程,或者像这样的顶级解决方案。

答案 9 :(得分:3)

我们在Snowplow的ETL作业遇到了这个问题,因此我们将并行文件复制代码(Ruby,构建在Fog之上)提取到自己的Ruby gem中,称为Sluice :

https://github.com/snowplow/sluice

Sluice还处理S3文件的删除,移动和下载;所有并行化并在操作失败时自动重试(经常令人惊讶)。我希望它有用!

答案 10 :(得分:0)

我知道这是一个旧线程,但对于那些到达那里的人,我的建议是创建一个预定作业,将内容从生产桶复制到开发者。

您可以使用如果您使用.NET,本文可能会帮助您

http://www.codewithasp.net/2015/03/aws-s3-copy-object-from-one-bucket-or.html

答案 11 :(得分:0)

对于新版本aws2。

aws2 s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME