Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 在S3存储桶之间移动文件的最佳方法?_Amazon S3 - Fatal编程技术网

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

Amazon s3 在S3存储桶之间移动文件的最佳方法?,amazon-s3,Amazon S3,我想每天把一些文件从生产桶复制到开发桶 例如: 复制productionbucket/feed/feedname/date 至开发桶/饲料/饲料名称/日期 因为我想要的文件在文件夹结构中的位置很深,所以转到每个文件夹并进行复制/粘贴太耗时 我曾经尝试过将驱动器装载到每个存储桶并编写windows批处理脚本,但这非常缓慢,而且它不必要地将所有文件/文件夹下载到本地服务器并重新备份。Update 正如(+1)所示,现在的卓越为与(几乎)所有AWS交互提供了最通用的方法-它同时涵盖了大多数服务的API

我想每天把一些文件从生产桶复制到开发桶

例如: 复制productionbucket/feed/feedname/date 至开发桶/饲料/饲料名称/日期

因为我想要的文件在文件夹结构中的位置很深,所以转到每个文件夹并进行复制/粘贴太耗时

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

Update 正如(+1)所示,现在的卓越为与(几乎)所有AWS交互提供了最通用的方法-它同时涵盖了大多数服务的API,还具有更高级别的S3命令,用于专门处理您的用例,请参见:

  • -同步目录和S3前缀。您的用例包含在以下内容中(使用
    --exclude
    --include
    和前缀处理等更细粒度的用法也可用): 下面的sync命令通过复制s3对象,将指定前缀和bucket下的对象同步到另一个指定前缀和bucket下的对象。[……]

    aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
    
为了完整起见,我要提到的是,较低级别的S3命令仍然可以通过sub命令使用,这将允许在最终采用其较高级别的功能之前,将任何基于SDK的解决方案直接转换到AWS CLI


初步答复 可以通过以下方式在S3存储桶之间移动文件(后跟):

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

所有现有AWS SDK都有相应的样本可用,请参阅。当然,基于脚本的解决方案显然是这里的首选,因此可能是一个很好的起点;如果您更喜欢Python,当然也可以通过以下方法实现:参见boto中的方法
copy_key()


PUT Object
仅复制文件,因此在成功执行复制操作后,仍然需要通过
delete Object
显式删除文件,但在处理存储桶和文件名的整个脚本就位后,这将只是另外几行(也有相应的示例,请参见示例).

如果AWS中有unix主机,请使用s3tools.org中的s3cmd。设置权限,以便将密钥设置为对开发bucket的读访问权限。然后运行:

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

我们在的ETL工作中遇到了这个问题,所以我们将并行文件复制代码(Ruby,构建在上)提取到它自己的Ruby gem中,称为Slucte:


Slucte还处理S3文件的删除、移动和下载;所有操作都是并行的,如果操作失败,会自动重试(这一点令人惊讶地经常发生)。我希望它有用

下面是一个ruby类,用于执行以下操作:

用法示例:

$ 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

.NET示例(按要求):

使用(客户端)
{
var existingObject=client.ListObjects(requestForExisingFile).S3Objects;
如果(existingObject.Count==1)
{
var requestCopyObject=new CopyObjectRequest()
{
SourceBucket=BucketNameProd,
SourceKey=objectToMerge.Key,
DestinationBucket=BucketNameDev,
DestinationKey=newKey
};
client.CopyObject(requestCopyObject);
}
}
客户是这样的

var config=newamazons3config{CommunicationProtocol=Protocol.HTTP,ServiceURL=“s3-eu-west-1.amazonaws.com”};
var client=AWSClientFactory.CreateAmazonS3Client(AWSAccessKey,awsseccesskey,config);

可能有更好的方法,但这只是我编写的一些快速代码,用于传输一些文件。

要从一个存储桶移动/复制到另一个或同一个存储桶,我使用s3cmd工具,效果很好。例如:

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1
新的官方软件本机支持大部分的
s3cmd
功能。我以前一直在使用
s3cmd
或ruby-AWS-SDK来做类似的事情,但是官方的CLI非常适合这样做


我知道这是一个老话题,但对于其他人来说,我的建议是创建一个计划作业,将内容从生产桶复制到开发桶

如果您使用.NET,则可以使用。本文可能会对您有所帮助


对我来说,以下命令刚刚起作用:

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

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


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

我花了好几天时间编写自己的自定义工具来并行化这项工作所需的副本,但后来我在上运行了文档。以下命令将告诉AWS CLI使用1000个线程执行作业(每个线程都是一个小文件或多部分副本的一部分)并展望100000个作业:

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也有同样的问题。我已经说过了
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
aws2 s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME