s3cmd 失败次数过多

51

我曾经是一个快乐的s3cmd用户。然而最近当我尝试传输一个大约7G的压缩文件到亚马逊S3时,我遇到了这个错误:

$> s3cmd put thefile.tgz s3://thebucket/thefile.tgz

....
  20480 of 7563176329     0% in    1s    14.97 kB/s  failed
WARNING: Upload failed: /thefile.tgz ([Errno 32] Broken pipe)
WARNING: Retrying on lower speed (throttle=1.25)
WARNING: Waiting 15 sec...
thefile.tgz -> s3://thebucket/thefile.tgz  [1 of 1]
       8192 of 7563176329     0% in    1s     5.57 kB/s  failed
ERROR: Upload of 'thefile.tgz' failed too many times. Skipping that file.

我正在使用最新的Ubuntu版本的s3cmd

为什么会这样?我该如何解决它?如果无法解决,是否有其他替代工具可用?


1
请注意,如果发生这种情况,s3cmd <= 1.5.0也可能从s3cmd put的返回代码中返回0(甚至是后续版本)。不要将s3cmd用于关键操作。 - Antti Haapala -- Слава Україні
2
@AnttiHaapala,你有什么替代s3cmd的建议吗? - Henley
15个回答

57

现在,2014年以后,aws cli有能力上传大型文件,取代s3cmd。

http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html提供安装/配置指南或常见问题解答:

$ wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
$ aws configure

接着

$ aws s3 cp local_file.tgz s3://thereoncewasans3bucket

会让您获得令人满意的结果。


+1!我有一个110GB的文件需要定期备份,分批备份很麻烦。以上解决方案非常棒! - Geesu
我刚刚花了大约一个小时与AWS支持人员聊天,他们实际上向我发送了这篇SO文章!尽管我的文件小于100Mb,而且这个错误突然出现了...安装AWS CLI并切换到它解决了问题。 - Dave Collins

28

我自己遇到了这个问题。我有一个24GB的.tar.gz文件要上传到S3。

上传较小的文件可以有所帮助。

此外,还有约5GB的文件大小限制,因此我正在将文件分成多个部分,以便在稍后下载这些部分时可以重新组装文件。

split -b100m ../input-24GB-file.tar.gz input-24GB-file.tar.gz-

那行代码的最后一部分是“前缀”。Split会将其附加到“aa”、“ab”、“ac”等。-b100m表示每个块大小为100MB。一个24GB的文件最终将产生大约240个100MB的部分,称为“input-24GB-file.tar.gz-aa”至“input-24GB-file.tar.gz-jf”。

要稍后将它们合并,请将它们全部下载到一个目录中,然后执行以下命令:

cat input-24GB-file.tar.gz-* > input-24GB-file.tar.gz

对原始文件和拆分文件进行md5校验,并将其存储在S3存储桶中,或者更好的方式是,如果文件不太大,使用类似parchive这样的系统来检查并修复一些下载问题也可能很有价值。


1
谢谢Alister。我不知道有5Gig文件大小限制。所以s3cmd没有问题 :) - qliq
4
我认为这是 s3cmd 的限制,因为亚马逊允许上传几个TB大小的文件。 - philfreo
文件太大可能是一个原因。但是我遇到过文件只有100MB大小的问题。 - qliq
这一切都与网络有关。在AWS上通常问题较少,但在本地网络之外,一切皆有可能。您可能需要将文件分割得更小。 - Alister Bulman
split -b5G 对我有效。尝试了 -b10G 但失败了。那就用5G吧。 - Xavi Montero
4
目前,S3允许存储最大为5TB的文件,但单个上传最大只能达到5GB。如果超过这个大小,需要使用多部分上传。具体信息请参考http://aws.amazon.com/s3/faqs/#How_much_data_can_I_store。 - Leopd

16

我尝试了其他所有答案,但都没有成功。看起来s3cmd相当敏感。

在我的情况下,s3存储桶位于欧盟。小文件可以上传,但到了大约60k时,总是失败。

当我更改了~/.s3cfg文件后,它就可以工作了。

这是我所做的更改:

host_base = s3-eu-west-1.amazonaws.com

host_bucket = %(bucket)s.s3-eu-west-1.amazonaws.com


谢谢。今天它救了我的命。 - Slawek Rewaj
太棒了。你也救了我的一天。 - aherve
你拯救了我的一天!谢谢! - Mike
bucket_location = eu-west-1 存储桶位置 = 欧洲西部-1 - dwery

10

我在 Ubuntu 上使用 s3cmd 时遇到了同样的问题。

s3cmd --guess-mime-type --acl-public put test.zip s3://www.jaumebarcelo.info/teaching/lxs/test.zip
test.zip -> s3://www.jaumebarcelo.info/teaching/lxs/test.zip  [1 of 1]
 13037568 of 14456364    90% in  730s    17.44 kB/s  failed
WARNING: Upload failed: /teaching/lxs/test.zip (timed out)
WARNING: Retrying on lower speed (throttle=0.00)
WARNING: Waiting 3 sec...
test.zip -> s3://www.jaumebarcelo.info/teaching/lxs/test.zip  [1 of 1]
  2916352 of 14456364    20% in  182s    15.64 kB/s  failed
WARNING: Upload failed: /teaching/lxs/test.zip (timed out)
WARNING: Retrying on lower speed (throttle=0.01)
WARNING: Waiting 6 sec...
解决方法是按照s3tools.org的说明更新s3cmd:

Debian和Ubuntu

我们的DEB软件库已经被精心创建,具有最兼容性 - 它应该适用于Debian 5(Lenny),Debian 6(Squeeze),Ubuntu 10.04 LTS(Lucid Lynx)以及所有更新版本,可能还包括一些旧版的Ubuntu。请按照以下命令行步骤进行操作:

  • 导入S3工具签名密钥:

    wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | sudo apt-key add -

  • 将软件库添加到sources.list中:

    sudo wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list

  • 刷新软件包缓存并安装最新的s3cmd:

    sudo apt-get update && sudo apt-get install s3cmd


2
将链接的内容复制到此处,将链接作为参考。抱歉,您没有提供要翻译的具体内容或链接。请提供更多信息以便我能够帮助您进行翻译。 - Inbar Rose
我已经按照原始页面的说明尝试更新,但仍然无法处理24GB的文件,而1GB的文件可以。正在尝试其他解决方案。 - Xavi Montero
如果这不起作用,请从tar包安装。http://sourceforge.net/projects/s3tools/files/s3cmd/1.1.0-beta2/s3cmd-1.1.0-beta2.tar.gz/download - Elmer
1
确实,对我来说不起作用。它更新到1.0.x,但是出现了相同的问题。正如@user1681360建议的那样,构建tarball(v 1.5.x)解决了问题(使用了多部分上传)。 - DavidJ
我在上传一个38MB的文件时遇到了问题,因为我使用的是带有有限带宽的t1.micro实例 - 更改为m1-medium实例解决了这个问题。 - devstopfix

6
当亚马逊返回错误时,会出现此错误:他们似乎断开了套接字以防止您上传千兆字节的请求并得到“不,失败”的响应。这就是为什么有些人由于时钟偏差而遇到此问题,有些人由于策略错误而遇到此问题,其他人则因为使用多部分上传API而遇到大小限制。并不是每个人都错了,或者甚至在看不同的问题:这些都是s3cmd中相同基础行为的不同症状。
由于大多数错误条件将是确定性的,s3cmd的行为是丢弃错误消息并慢速重试,这有点不幸 :(.要获取实际的错误消息,您可以进入 /usr/share/s3cmd/S3/S3.py(记得删除相应的.pyc以使用更改),并在 send_file 函数的 except Exception, e: 块中添加一个 print e
在我的情况下,我尝试将上传文件的 Content-Type 设置为“application/x-debian-package”。显然,s3cmd 的 S3.object_put 1) 不遵循通过 --add-header 传递的 Content-Type,但是 2) 无法覆盖通过 --add-header 添加的 Content-Type,因为它将标头存储在具有区分大小写键的字典中。结果是它使用“content-type”的值进行签名计算,然后最终(至少在许多请求中;这可能基于某种哈希排序)将“Content-Type”发送到亚马逊,导致签名错误。
在我今天的特定情况下,似乎 -M 会导致 s3cmd 猜测正确的 Content-Type,但它似乎仅基于文件名来执行此操作...我本来希望它会根据文件内容使用 mimemagic 数据库。不过,说实话:当它无法上传文件时,s3cmd 甚至无法返回失败的 shell 退出状态,因此结合所有这些其他问题,最好只编写自己的一次性工具来执行您需要的一件事...最终几乎可以肯定,当您遇到此工具的某些角落案例时,它会节省您的时间 :(。

谢谢您明确指出s3cmd并不像他的流行度让我相信的那样好。现在使用aws s3 cp - tobltobs

5

1
我希望我能够给这个更多的赞:它是Alister Bulman描述的问题的最简单解决方案(而不是Jaume Barcelo、qliq或其他人描述的问题)。s3cmd-1.1.0-betaX(写作时为beta3)不仅可以为您拆分和上传文件,还会要求Amazon重新组合文件,以便它们在S3上显示为一个文件。如果您要在Elastic Map-Reduce中使用它,则这是必不可少的,因为您没有手动使用cat重新组合它们的选项。 - Jim Pivarski

4

我曾经遇到了相同的问题,原来是在~/.s3cfgbucket_location的值有误。

这篇博客帖子帮助我找到了答案。

如果您要上传的存储桶不存在(或者您打错了它),它将以该错误失败。感谢通用错误消息。- 更多信息请参见:http://jeremyshapiro.com/blog/2011/02/errno-32-broken-pipe-in-s3cmd/#sthash.ZbGwj5Ex.dpuf

检查我的~/.s3cfg后发现其中写着:

bucket_location = Sydney

不是:

bucket_location = ap-southeast-2

将该值更正为使用“正确”的名称解决了问题。 proper 正确的名称指的是AWS S3区域名称。

一样的问题 - 必须将 bucket_location = EU 更改为 bucket_location = eu-west-1 - Jakub Kukul

4
在我的情况下,失败的原因是服务器时间比S3时间快。由于我在位于美国东部的服务器上使用GMT+4,并且我正在使用亚马逊的美国东部存储设施。调整我的服务器到美国东部时间后,问题消失了。

2

对我而言,以下方法可行:

在.s3cfg文件中,我将host_bucket更改为

host_bucket = %(bucket)s.s3-external-3.amazonaws.com

此问题与存储桶无关,而与其 DNS 传播有关。 - Mich. Gio.

1

s3cmd版本1.1.0-beta3或更高版本将自动使用多部分上传以允许发送任意大的文件()。您也可以控制它使用的块大小,例如:

s3cmd --multipart-chunk-size-mb=1000 put hugefile.tar.gz s3://mybucket/dir/

这将分为1 GB的块进行上传。

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