如果您最初存放文件的位置空间有限,那么将文件上传到S3,并随后在与S3桶位于同一地区的EC2实例上下载、压缩和重新上传文件到S3,实际上是一个非常明智的(尽管看似违反直觉的)建议,因为有一个简单的原因:
AWS 不会向您收取在同一区域内的EC2和S3之间的带宽费用。
这是spot instance的理想工作...也是SQS告诉spot机器需要完成什么任务的一个很好的用例。
另一方面...如果您在上传之前不先压缩文件,则会消耗更多本地带宽。
如果您是程序员,应该能够编写类似我编写的实用程序供内部使用(这不是广告;目前不可发布),该实用程序可以通过外部工具压缩并实时上传文件到S3。
它的工作方式类似于此伪代码示例命令行:
cat input_file | gzip -9c | stream-to-s3 --bucket 'the-bucket' --key 'the/path'
那只是一个简化的使用示例,以说明概念。当然,我的“stream-to-s3”实用程序接受许多其他参数,包括x-amz-meta元数据、aws访问密钥和秘密,但你可能已经有了想法。
像gzip、pigz、bzip2、pbzip2、xz和pixz这样的常见压缩工具都可以从STDIN读取源文件,并将压缩数据写入STDOUT,而不必将文件的压缩版本写入磁盘。
我使用的实用程序通过管道从其STDIN读取文件数据,并使用S3 Multipart上传(即使对于不需要它的小文件,因为S3 Multipart Upload聪明地
不需要您提前知道文件的大小),它只需将数据发送到S3,直到在其输入流上达到EOF。然后它完成多部分上传并确保一切都成功了。
我使用此实用程序构建和上传整个tarball,带有压缩,而不必触碰单个磁盘空间块。再次强调,编写它并不特别困难,可以使用多种语言完成。我甚至没有使用任何S3 SDK,而是从头开始自己编写了一个,使用标准的HTTP用户代理和S3 API文档。
zip - big_file | aws s3 cp - s3://bucket/folder/big_file.zip
- freethebeess3cmd
和tar
来完成这个操作的方法? - Marry Jane