AWS S3在两个存储桶之间复制文件和文件夹

cni*_*aou 108 copy amazon-s3 amazon-web-services

我一直在寻找一种工具来帮助我将S3存储桶的内容复制到第二个存储桶中,而无需先将内容下载到本地系统.

我尝试过AWS S3控制台复制选项但导致一些嵌套文件丢失.

我曾尝试使用Transmit app(Panic),但duplicate命令首先将文件复制到本地系统,然后再复制到第二个存储桶

Lay*_*yke 166

在S3 Buckets之间复制

AWS(刚刚发布)发布了一个用于在存储桶之间进行复制的命令行界面.

http://aws.amazon.com/cli/

$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp
..
Run Code Online (Sandbox Code Playgroud)

这将从一个目标存储桶复制到另一个存储桶.

请参阅此处的文档:S3 CLI文档

  • 请注意,如果这是您第一次使用cli工具,则需要运行'aws configure'并输入您的信用卡 (8认同)

Tre*_*owe 41

使用aws-sdk gem的简化示例:

AWS.config(:access_key_id => '...', :secret_access_key => '...')
s3 = AWS::S3.new
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key')
Run Code Online (Sandbox Code Playgroud)

如果要在不同存储桶之间执行复制,请指定目标存储桶名称:

s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key', :bucket_name => 'target-bucket')
Run Code Online (Sandbox Code Playgroud)


KDE*_*DEx 38

您现在可以从S3管理界面执行此操作.只需进入一个桶中选择所有文件夹即可actions->copy.然后进入你的新桶actions->paste.

  • 真棒!他指的是网络界面.与大多数其他人不同,我可以通过iPad进行此操作. (4认同)
  • 这种随机遗漏了嵌套对象中的子文件夹 - - 3年后和AWS仍然无法修复这样一个基本的错误! (2认同)

Ana*_*oly 8

有可能使用最近的aws-sdk gem,请参阅代码示例:

require 'aws-sdk'

AWS.config(
  :access_key_id     => '***',
  :secret_access_key => '***',
  :max_retries       => 10
)

file     = 'test_file.rb'
bucket_0 = {:name => 'bucket_from', :endpoint => 's3-eu-west-1.amazonaws.com'}
bucket_1 = {:name => 'bucket_to',   :endpoint => 's3.amazonaws.com'}

s3_interface_from = AWS::S3.new(:s3_endpoint => bucket_0[:endpoint])
bucket_from       = s3_interface_from.buckets[bucket_0[:name]]
bucket_from.objects[file].write(open(file))

s3_interface_to   = AWS::S3.new(:s3_endpoint => bucket_1[:endpoint])
bucket_to         = s3_interface_to.buckets[bucket_1[:name]]
bucket_to.objects[file].copy_from(file, {:bucket => bucket_from})
Run Code Online (Sandbox Code Playgroud)

更多细节:如何使用aws-s3 gem在存储桶之间复制文件


Ada*_*ain 7

在不同区域的存储桶之间复制

$ aws s3 cp s3://src_bucket/file  s3://dst_bucket/file --source-region eu-west-1 --region ap-northeast-1
Run Code Online (Sandbox Code Playgroud)

上面的命令将文件从欧洲(eu-west-1)的桶复制到日本(ap-northeast-1).您可以使用以下命令获取存储桶区域的代码名称:

$ aws s3api get-bucket-location --bucket my_bucket
Run Code Online (Sandbox Code Playgroud)

顺便说一下,在S3 Web控制台中使用复制和粘贴很容易,但它似乎从源存储桶下载到浏览器中,然后上传到目标存储桶.使用"aws s3"对我来说要快得多.


Pan*_*los 6

我创建了一个泊坞可执行s3s3mirror工具.用于从AWS S3存储桶复制和镜像到另一个存储桶的实用程序.

它是线程允许并行COPY和非常高效的内存,它成功s3cmd完全失败.

用法:

docker run -e AWS_ACCESS_KEY_ID=FOO -e AWS_SECRET_ACCESS_KEY=BAR pmoust/s3s3mirror [OPTIONS] source_bucket[/prefix] dest_bucket[/prefix]
Run Code Online (Sandbox Code Playgroud)

有关选项的完整列表,请尝试:

docker run pmoust/s3s3mirror 
Run Code Online (Sandbox Code Playgroud)


Jos*_*hin 5

查看下面的文档.我想这就是你要找的东西. http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html

RightAws gem的S3Interface具有复制功能,可以执行上述操作.

http://rubydoc.info/gems/right_aws/3.0.0/RightAws/S3Interface#copy-instance_method


cob*_*lla 5

我想你现在可能已经找到了一个很好的解决方案,但对于遇到这个问题的其他人(就像我刚才那样),我已经精心设计了一个简单的工具,专门用于将一个S3存储桶镜像到另一个S3存储桶中.高度并发,但CPU和内存有效的方式.

它位于Apache许可下的github上:https://github.com/cobbzilla/s3s3mirror

当你有一个非常大的桶并且正在寻找最大性能时,它可能值得尝试.

如果您决定尝试一下,请告诉我您是否有任何反馈.


vre*_*rav 5

来自 AWS cli https://aws.amazon.com/cli/你可以做

aws s3 ls- 这将列出所有 S3 存储桶

aws cp --recursive s3://<source bucket> s3://<destination bucket>- 这会将文件从一个存储桶复制到另一个存储桶

注意* 在创建跨区域复制存储桶时非常有用,通过执行上述操作,您的文件都会被跟踪,并且源区域文件的更新将传播到复制存储桶。除文件删除外的所有内容均已同步。

对于 CRR,请确保您在存储桶上启用了版本控制。