如何将文件通过scp上传到Amazon S3?

30

我需要将大约2TB的备份文件发送到S3。我想最省心的选择可能是使用Linux scp命令(使用s3cmd有困难,也不希望使用过于复杂的Java或RoR)。

但是我不确定是否可行:如何在scp中使用S3的私有和公共密钥,并不知道我的目标IP/url/path是什么?

感谢您的提示。


升级到最新版本的s3cmd并从put命令中删除--private-ack后,我的s3cmd问题似乎已经解决了。 - qliq
我猜你可以在EC2中挂载S3(http://michaelaldridge.info/post/12086788604/mounting-s3-within-an-ec2-instance),然后进行SCP! - cbacelar
截至2018年11月左右,使用AWS Transfer Family,您现在可以为您的S3存储桶和文件夹添加FTP或SFTP服务器。 - tread
7个回答

53
截至2015年,SCP/SSH不受支持(并且可能永远不会得到支持,原因在其他答案中提到)。

用于将文件复制到/从S3的官方AWS工具

  1. command line tool (pip3 install awscli) - note credentials need to be specified, I prefer via environment variables rather than a file: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY.

    aws s3 cp /tmp/foo/ s3://bucket/ --recursive --exclude "*" --include "*.jpg"
    

    and an rsync-like command:

    aws s3 sync . s3://mybucket
    
  2. Web interface:

非AWS的方法

任何其他解决方案都依赖于第三方可执行文件(例如botosync,jungledisk...),只要它们得到支持就可以很好地运行。但是随着时间的推移,第三方工具会出现并消失,您的脚本将有更短的使用寿命。


编辑:实际上,AWS CLI 基于 botocore:

https://github.com/boto/botocore

因此,Botosync作为一位长者,应该得到比我之前给予他的更多尊重。


我想知道是否有一种方法可以通过ssh连接到服务器,然后使用AWS shell而不是传统的shell,该shell会暴露出原始文件系统(而AWS S3故意将其抽象化了)。 - Sridhar Sarnobat
2
请注意,在Ubuntu上,您可以使用apt-get install awscli安装AWS CLI,这可能比使用pip3 install awscli更可取。 - Philip Couling

11

这里有一个解决方案,boto-rsync。从任意Linux机器安装boto-rsync,然后使用它将/local/path/传输到your_bucket/remote/path/

boto-rsync -a your_access_key -s your_secret_key /local/path/ s3://your_bucket/remote/path/

路径也可以是文件。

对于非 AWS 的 S3 兼容提供商,请使用 --endpoint:

boto-rsync -a your_access_key -s your_secret_key --endpoint some.provider.com /local/path/ s3://your_bucket/remote/path/

3
这个 boto-rsync 工具很棒。 - Tom Roggero

8

您无法使用SCP。

如果您不介意花费一些钱,最快的方法可能是将数据存储到磁盘上并邮寄给他们,他们会将其上传到服务器。请参阅他们的Import/Export服务。


谢谢,但那太过头了 :) - qliq
2
好的,你确实有两TB,即使在非常快的网络上也需要一段时间 :) 你不能使用SCP,因为它不像EC2,没有运行SSH服务器供你进行SCP。你可以使用他们的API上传,尝试访问https://dev59.com/kUbRa4cB1Zd3GeqP5PNK获取更多信息。 - El Yobo
1
Amazon S3备份工具列表可能有助于避免向亚马逊付费:http://jeremy.zawodny.com/blog/archives/007641.html - qliq
1
我的服务器可以以5-10MB/s的速度上传。此外,我使用crontab来完成这个任务,因此不需要“等待”备份上传完成。这就是为什么我正在寻找一个命令行解决方案的原因。 - qliq
http://www.jets3t.org声称拥有您所需的内容,“Synchronize: 一个命令行应用程序,可将计算机上的目录与Amazon S3或Google Storage帐户同步。非常适合执行备份或在不同计算机之间同步文件。”。 - El Yobo

7

给你,

scp USER@REMOTE_IP:/FILE_PATH >(aws s3 cp - s3://BUCKET/SAVE_FILE_AS_THIS_NAME)

除了“-”以外,还能使用其他符号吗?@Gypsy - AATHITH RAJENDRAN
1
你的意思是什么? "-"代表通过bash的进程替换<()传递给aws cli的stdin。 - GypsyCosmonaut
这太棒了,几乎完全符合我的要求,只是方向相反。 - Devin Ledesma

4
为什么不将它scp到EBS卷中,然后从那里使用s3cmd呢?只要您的EBS卷和s3存储桶在同一区域,您只需要支付一次入站数据费用(从您的网络到EBS卷)。我发现,一旦进入s3网络,s3cmd比直接传输到s3更加可靠,并且数据传输速率更快。

1
说实话,这有点过头了。 - qliq

1
有一个很棒的工具叫做Dragon Disk。它不仅可以作为普通的scp工具,还可以作为同步工具。

http://www.s3-client.com/

提供了设置Amazon S3的指南这里,设置完成后,您可以将文件从本地计算机复制粘贴到S3,也可以设置自动同步。用户界面与WinSCP或Filezilla非常相似。


-3

对于我们的AWS备份,我们使用duplicity和trickle duplicity的组合来进行rsync和加密,并使用trickle来限制上传速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接