s3cmd失败次数太多了

时间:2011-04-25 03:05:05

标签: file-upload ubuntu amazon-s3 backup

我曾经是一个快乐的s3cmd用户。然而,最近当我尝试将大型zip文件(~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.

我使用的是最新的s3cmd on Ubuntu

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

15 个答案:

答案 0 :(得分:55)

现在在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 :(得分:28)

我自己刚遇到这个问题。我有一个24GB的.tar.gz文件放入S3。

上传较小的作品会有所帮助。

还有~5GB的文件大小限制,因此我将文件拆分成碎片,可以在以后下载碎片时重新组装。

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

该行的最后一部分是'前缀'。斯普利特将附加'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

获取原始文件和拆分文件的md5sums并将其存储在S3存储桶中,或者更好,如果不是那么大,使用像parchive这样的系统来检查,甚至修复一些下载问题也可以很有价值。

答案 2 :(得分:15)

我尝试了所有其他答案但没有奏效。看起来s3cmd相当敏感。 就我而言,s3桶在欧盟。小文件会上传但是当它达到~60k时它总是失败。

当我改变〜/ .s3cfg时,它起作用了。

以下是我所做的更改:

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

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

答案 3 :(得分: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...

解决方案是使用instructions from s3tools.org更新s3cmd:

  

Debian& Ubuntu的

     

我们的DEB存储库已经在最兼容的版本中精心创建   它应该适用于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 -

  •   
  • 将repo添加到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

  •   

答案 4 :(得分:6)

当亚马逊返回错误时会发生此错误:它们似乎会断开套接字以防止您上传数十亿字节的请求以取回错误"不会,失败"作为回应。这就是为什么有些人由于时钟偏差而得到它,有些人因为政策错误而得到它,而其他人则因为需要使用多部分上传API而遇到大小限制。并不是每个人都错了,或者甚至在看不同的问题:这些都是s3cmd中相同基础行为的不同症状。

由于大多数错误条件都是确定性的,s3cmd丢弃错误消息并重试速度较慢的行为是一种疯狂的不幸:(。然后要获得实际的错误消息,你可以进入/ usr /share/s3cmd/S3/S3.py(记得删除相应的.pyc以便使用更改)并在send_file函数的print e块中添加except Exception, 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退出状态,因此结合所有这些其他问题,最好只编写自己的一次性工具来做你需要的一件事......几乎可以肯定的是,当你被这个工具的某些角落所困扰时,它最终会节省你的时间:(。

答案 5 :(得分:5)

s3cmd 1.0.0尚不支持多部分。我试过1.1.0-beta,它运行得很好。您可以在此处阅读有关新功能的信息:http://s3tools.org/s3cmd-110b2-released

答案 6 :(得分:4)

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

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

答案 7 :(得分:4)

我遇到了同样的问题,结果是bucket_location中的~/.s3cfg值很差。

这篇博客文章引导我回答。

  

如果你要上传的存储桶不存在(或者你输入错误),它将失败并显示错误。谢谢你的通用错误信息。 - 请参阅: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名称解决了问题。

答案 8 :(得分:2)

对我来说,以下工作:

在.s3cfg中,我更改了host_bucket

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

答案 9 :(得分:1)

s3cmd版本1.1.0-beta3或更高版本会自动使用multipart uploads来发送任意大文件(source)。您也可以控制它使用的块大小。 e.g。

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

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

答案 10 :(得分:0)

我遇到了相同的管道错误,因为安全组策略设置错误。我责备S3文档。

我在博客中写过how to set the policy correctly,其中包括:

{
  "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": {}
    }
  ]
}

答案 11 :(得分:0)

在我的情况下,我已修复此问题,只是添加了正确的权限。

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

搜索.s3cfg文件,通常在您的主文件夹中。

如果你拥有它,你就得到了恶棍。更改以下两个参数应该对您有帮助。

socket_timeout = 1000
multipart_chunk_size_mb = 15

答案 14 :(得分:-1)

我只是不使用s3cmd来解决这个问题。相反,我在python项目S3-Multipart on GitHub上取得了巨大的成功。它会上传和下载,同时使用尽可能多的线程。