s3cmd失败太多次了

我曾经是一个快乐的S3CMS用户。 然而,最近当我尝试将一个大的压缩文件(〜7Gig)传输到Amazon 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 。

为什么这样? 我该如何解决呢? 如果它是无法解决的,我可以使用什么替代工具?

而现在在2014年,aws cli有能力上传大文件来代替s3cmd。

http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html有安装/configuration说明,或经常:;

 $ 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 

会得到满意的结果。

我刚刚遇到这个问题。 我有一个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 

把原始文件和分割文件的md5sum存储到S3存储桶中,如果不是那么大,使用像parchive这样的系统可以检查,甚至修复一些下载问题也是有价值的。

我尝试了所有其他的答案,但没有工作。 它看起来像s3cmd是相当敏感的。 在我的情况下,s3桶在欧盟。 小文件会上传,但是当它达到~60K时,它总是失败。

当我改变〜/ .s3cfg它工作。

以下是我所做的更改:

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

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

我有与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... 

解决scheme是用s3tools.org的指令更新s3cmd :

Debian和Ubuntu

我们的DEB存储库已经以最兼容的方式进行了仔细的创build – 它应该适用于Debian 5(Lenny),Debian 6(Squeeze),Ubuntu 10.04 LTS(Lucid Lynx)以及所有较新版本,也可能适用于一些较旧的Ubuntu版本。 从命令行执行以下步骤:

  • 导入S3tools签名密钥:

    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

  • 刷新包caching并安装最新的s3cmd:

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

当Amazon返回一个错误时,会发生这个错误:他们似乎然后断开套接字,以防止上传千兆字节的请求,以回应“没有,失败”的回应。 这就是为什么有些人由于时钟倾斜而得到它,有些人由于策略错误而得到它,另外一些人则遇到需要使用多部分上传API的大小限制。 并不是每个人都是错的,或者甚至是在看不同的问题:这些都是s3cmd中相同潜在行为的不同症状。

由于大多数错误条件都是确定性的,所以s3cmd扔掉错误信息和重试速度慢的行为是一种非常不幸的现象。为了得到实际的错误信息,你可以进入/ usr / share / s3cmd / S3 / S3.py(记住删除相应的.pyc,以便使用更改),并在send_file函数的except Exception, e: block 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”的值进行签名计算,然后结束(至less有很多请求;这可能基于某种散列顺序),向Amazon发送“Content-Type”导致签名错误。

在我今天的具体情况下,似乎-M会导致s3cmd猜测正确的内容types,但它似乎是基于文件名单做的…我本来希望它会使用基于内容的mimemagic数据库的文件。 老实说,s3cmd在上传文件失败时甚至无法返回失败的shell退出状态,所以结合所有这些其他的问题,最好是编写自己的一次性工具来做一个你需要的东西…几乎可以肯定的是,当你被这个工具的一些特殊情况所困扰时,最终它会为你节省时间:(。

s3cmd 1.0.0不支持多部分。 我试过1.1.0-beta,它工作得很好。 你可以阅读这里的新function: http : //s3tools.org/s3cmd-110b2-released

在我的情况下,失败的原因是服务器在S3时间之前的时间。 由于我在我的服务器(位于美国东部)使用了GMT + 4,而且我正在使用亚马逊的美国东部存储设备。

调整我的服务器到美国东部时间后,问题就没有了。

我遇到了同样的问题,原来是~/.s3cfg一个错误的bucket_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 

更正此值以使用正确的名称解决了问题。

对我来说,以下工作:

在.s3cfg中,我更改了host_bucket

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

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

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

这将以1 GB的块进行上传。

我遇到了安全组策略设置错误的同一个pipe道错误。我怪S3文档。

我写了关于如何在我的博客中正确设置政策 ,即:

 { "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource": "arn:aws:s3:::example_bucket", "Condition": {} }, { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectAclVersion" ], "Resource": "arn:aws:s3:::example_bucket/*", "Condition": {} } ] } 

在我的情况下,我已经解决这只是添加正确的权限。

 Bucket > Properties > Permissions "Authenticated Users" - List - Upload/Delete - Edit Permissions 

我遇到了一个类似的错误,最终导致机器上的时间漂移​​。 正确设置时间为我解决了这个问题。

search.s3cfg文件,一般在您的主文件夹中。

如果你有它,你得到了恶棍。 更改以下两个参数应该可以帮到你。

 socket_timeout = 1000 multipart_chunk_size_mb = 15 

我通过简单地不使用s3cmd来解决这个问题。 相反,我在GitHub上的python项目S3-Multipart上取得了巨大的成功。 它可以上传和下载,并可以根据需要使用多个线程。