我想每天将一些文件从生产存储桶复制到开发存储桶。
例如:将productionbucket / feed / feedname / date复制到developmentbucket / feed / feedname / date
由于我想要的文件在文件夹结构中非常深,因此转到每个文件夹并进行复制/粘贴非常浪费时间。
我一直在尝试将驱动器安装到每个存储桶并编写Windows批处理脚本,但这非常慢,并且不必要地将所有文件/文件夹下载到本地服务器并再次备份。
Answers:
正如alberge(+1)所指出的那样,如今,出色的AWS Command Line Interface提供了与(几乎)所有AWS交互的最通用方法-同时涵盖了大多数服务的API,并且还具有更高级别的S3命令来处理您的AWS。具体来说,请参阅适用于S3的AWS CLI参考:
--exclude
,--include
以及前缀处理等):
以下同步命令通过复制s3对象,将指定前缀和存储桶下的对象同步到另一个指定前缀和存储桶下的对象。[...]
aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
为了完整起见,我将提到较低级别的S3命令仍然可以通过s3api子命令使用,这将允许在最终采用其更高级别的功能之前,将任何基于SDK的解决方案直接转换为AWS CLI。
在S3存储桶之间移动文件可以通过PUT对象-复制API(随后是DELETE Object)来实现:
PUT操作的此实现会创建已存储在Amazon S3中的对象的副本。PUT复制操作与先执行GET然后执行PUT相同。添加请求标头x-amz-copy-source可使PUT操作将源对象复制到目标存储桶中。资源
所有现有的AWS开发工具包都有相应的示例,请参阅“ 在单个操作中复制对象”。自然地,基于脚本的解决方案显然是这里的首选,因此,使用适用于Ruby的AWS开发工具包复制对象可能是一个不错的起点。如果您更喜欢Python,当然也可以通过boto来实现,请参见方法copy_key()
boto的S3 API文档中的方法。
PUT Object
仅复制文件,因此DELETE Object
在成功执行复制操作后,您仍需要通过静止方式显式删除文件,但是一旦处理了存储段和文件名的整个脚本到位(仅存在几例) ,请参见例如,每个请求删除一个对象)。
新的官方AWS CLI本机支持的大多数功能s3cmd
。我以前一直在使用s3cmd
ruby AWS开发工具包或ruby AWS开发工具包来做类似的事情,但是官方CLI对此非常有用。
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
aws s3 sync s3://oldbucket s3://newbucket
aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
nohup aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1 &
thegeekstuff.com/2010/12/5-ways-to-execute-linux-command
我花了几天的时间编写自己的自定义工具来并行化为此所需的副本,但是随后我浏览了有关如何获取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
运行这些命令后,可以使用简单的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(仅在Windows上)的S3CMD总体吞吐量受到严重限制,无论您使用何种实例大小或设置,每个进程只能达到约3Gbps。像S5CMD这样的其他系统也有同样的问题。我已经与S3团队进行了交谈,他们正在对此进行调查。
要求的.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);
也许有更好的方法,但这只是我编写的一些用于传输某些文件的快速代码。
如果您在AWS中拥有Unix主机,请使用s3tools.org中的s3cmd。设置权限,以便您的密钥成为对您的开发存储区的读取访问权限。然后运行:
s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname
s3cmd cp
,则不接受该--skip-existing
选项,但是可以s3cmd sync
改用现有的跳过程序运行
这是用于执行此操作的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
实际上,从最近开始,我只是在AWS s3界面中使用copy + paste操作。只需导航到要复制的文件,单击“操作”->“复制”,然后导航到目标存储区,然后单击“操作”->“粘贴”
它可以非常快速地传输文件,并且看起来像是一个复杂的解决方案,不需要任何编程,也不需要诸如此类的顶级解决方案。
我们在Snowplow的ETL作业遇到了这个确切的问题,因此我们将并行文件复制代码(Ruby,基于Fog构建)提取到了自己的Ruby gem中,称为Sluice:
https://github.com/snowplow/sluice
Sluice还处理S3文件的删除,移动和下载;全部并行化,并在操作失败时自动重试(它经常出奇地执行)。我希望它有用!
我知道这是一个旧线程,但是对于到达那里的其他人,我的建议是创建一个计划作业,以将内容从生产存储区复制到开发人员。
可以使用如果您使用.NET,则本文可能会为您提供帮助
https://edunyte.com/2015/03/aws-s3-copy-object-from-one-bucket-or/
对于新版本aws2。
aws2 s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME