我一直在寻找一个工具,可以帮助我将AWS S3存储桶的内容复制到第二个AWS S3存储桶,而不需要先将内容下载到本地文件系统。
我尝试使用AWS S3控制台的复制选项,但结果缺少了一些嵌套的文件。
我尝试使用Transmit应用程序(由Panic提供)。复制命令将文件首先下载到本地系统,然后再上传回第二个存储桶,这相当低效。
我一直在寻找一个工具,可以帮助我将AWS S3存储桶的内容复制到第二个AWS S3存储桶,而不需要先将内容下载到本地文件系统。
我尝试使用AWS S3控制台的复制选项,但结果缺少了一些嵌套的文件。
我尝试使用Transmit应用程序(由Panic提供)。复制命令将文件首先下载到本地系统,然后再上传回第二个存储桶,这相当低效。
AWS最近发布了一个用于在存储桶之间复制文件的命令行界面。
$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp
..
这将从一个目标存储桶复制到另一个存储桶。
在此处查看文档:S3 CLI文档
您现在可以在S3管理界面上执行此操作。只需进入一个存储桶,选择所有文件夹 操作->复制
。然后移动到新的存储桶中 操作->粘贴
。
使用aws-sdk宝石的简化示例:
AWS.config(:access_key_id => '...', :secret_access_key => '...')
s3 = AWS::S3.new
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key')
如果你想在不同的存储桶之间执行复制操作,那么请指定目标存储桶名称:
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key', :bucket_name => 'target-bucket')
$ aws s3 cp s3://src_bucket/file s3://dst_bucket/file --source-region eu-west-1 --region ap-northeast-1
以上命令将文件从欧洲区域的存储桶(eu-west-1)复制到日本区域(ap-northeast-1)。您可以使用此命令获取存储桶区域的代码名称:
$ aws s3api get-bucket-location --bucket my_bucket
顺便说一下,在S3 Web控制台中使用复制和粘贴很容易,但似乎是从源存储桶下载到浏览器,然后上传到目标存储桶。对我来说,使用“aws s3”更快。
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})
我创建了一个Docker可执行文件,用于运行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]
要获取完整选项列表,请尝试:
docker run pmoust/s3s3mirror
请查看下面的文档,我想这就是你要找的内容。 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
从AWS cli https://aws.amazon.com/cli/,您可以执行以下操作:
aws s3 ls
- 这将列出所有S3存储桶。
aws cp --recursive s3://<source bucket> s3://<destination bucket>
- 这将把文件从一个存储桶复制到另一个存储桶中。
注意*:当创建跨区域复制存储桶时非常有用。通过执行上述操作,您的文件将被全部跟踪,并且对源区域文件的更新将传播到复制的存储桶中。除了文件删除以外的所有内容都会同步。
在进行CRR时,请确保已在存储桶上启用版本控制。
aws configure set default.s3.max_concurrent_requests 200
。请参阅此帖子以获取更多详细信息和选项https://dev59.com/Tm445IYBdhLWcg3w3N0f。 - Balmipour