亚马逊s3 - 在S3存储桶之间移动文件的最佳方式?
我想每天将生产桶中的一些文件复制到开发桶中。
例如:复制productionbucket / feed / feedname / date到developmentbucket / feed / feedname / date
因为我想要的文件在文件夹结构中是如此之深,所以去每个文件夹并复制/粘贴都太费时了。
我已经玩过将驱动器安装到每个存储桶并编写Windows批处理脚本,但这非常慢,并且不必要地将所有文件/文件夹下载到本地服务器并再次备份。
Matt Dell asked 2019-05-16T01:16:09Z
11个解决方案
90 votes
更新
正如alberge(+1)所指出的,现在卓越的AWS命令行界面提供了最通用的方法来与(几乎)所有AWS交互 - 它同时涵盖了大多数服务的API,并且还具有更高级别的S3命令来处理你的 具体用例,请参阅S3的AWS CLI参考:
sync - 同步目录和S3前缀。 您的用例由示例2涵盖(PUT Object,DELETE Object和前缀处理等更细粒度的用法也可用):以下sync命令通过复制s3对象将指定前缀和存储区下的对象同步到另一个指定前缀和存储区下的对象。[...]
PUT Object
为了完整起见,我将提到通过s3api子命令仍然可以使用较低级别的S3命令,这将允许在最终采用其更高级别功能之前将任何基于SDK的解决方案直接转换到AWS CLI。
初步答复
在S3存储桶之间移动文件可以通过PUT对象 - 复制API(后跟DELETE对象)来实现:
PUT操作的这种实现创建了对象的副本 已存储在Amazon S3中。 PUT复制操作是相同的 执行GET然后执行PUT。 添加请求标头, x-amz-copy-source,使PUT操作将源对象复制到 目的地桶。 资源
可用的所有现有AWS开发工具包都有相应的示例,请参阅在单个操作中复制对象。 当然,基于脚本的解决方案在这里显然是首选,因此使用AWS SDK for Ruby复制对象可能是一个很好的起点; 如果您更喜欢Python,那么同样可以通过boto实现,当然,请参阅boto的S3 API文档中的方法PUT Object。
PUT Object仅复制文件,因此您仍需要在成功复制操作后通过DELETE Object显式删除文件,但是一旦处理存储桶和文件名的整个脚本到位,这将只是另外几行(有相应的示例) 同样,请参阅例如每个请求删除一个对象)。
Steffen Opel answered 2019-05-16T01:17:26Z
61 votes
新的官方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
A B answered 2019-05-16T01:17:59Z
25 votes
要从一个桶移动/复制到另一个桶或同一个桶我使用s3cmd工具并且工作正常。 例如:
s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1
sgimeno answered 2019-05-16T01:18:24Z
15 votes
我花了几天时间编写自己的自定义工具来并行化所需的副本,但之后我遇到了有关如何获取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
运行这些后,您可以使用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团队讨论了这个问题,他们正在研究它。
James answered 2019-05-16T01:19:10Z
12 votes
.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);
可能有更好的方法,但它只是我写的一些快速代码来传输一些文件。
Matt Dell answered 2019-05-16T01:19:50Z
8 votes
如果您在AWS中有unix主机,请使用s3tools.org中的s3cmd。 设置权限,以便您的密钥作为对开发存储桶的读取权限。 然后运行:
s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname
dk. answered 2019-05-16T01:20:15Z
6 votes
这是执行此操作的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
bantic answered 2019-05-16T01:20:43Z
6 votes
对我来说,以下命令才有效:
aws s3 mv s3://bucket/data s3://bucket/old_data --recursive
lony answered 2019-05-16T01:21:08Z
5 votes
实际上,到目前为止,我只使用AWS s3界面中的复制+粘贴操作。 只需导航到要复制的文件,点击“操作” - > “复制”然后导航到目标存储桶和“操作” - > “糊”
它可以非常快速地传输文件,它似乎是一个不太复杂的解决方案,不需要任何编程,或者像这样的顶级解决方案。
Justin Workman answered 2019-05-16T01:21:43Z
3 votes
我们在Snowplow的ETL工作中遇到了这个问题,所以我们将并行文件复制代码(Ruby,构建在Fog之上)提取到自己的Ruby gem中,称为Sluice:
[https://github.com/snowplow/sluice]
Sluice还处理S3文件的删除,移动和下载; 所有并行化并在操作失败时自动重试(经常令人惊讶)。 我希望它有用!
Alex Dean answered 2019-05-16T01:22:23Z
0 votes
我知道这是一个旧线程但是对于那些到达那里的人我的建议是创建一个预定的工作来将内容从生产桶复制到开发桶。
您可以使用如果您使用.NET,本文可能会对您有所帮助
[http://www.codewithasp.net/2015/03/aws-s3-copy-object-from-one-bucket-or.html]
Nikhil Gaur answered 2019-05-16T01:23:04Z