我曾经是一个快乐的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。
为什么会这样?我该如何解决?如果它无法解决,我可以使用哪种替代工具?
答案 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上取得了巨大的成功。它会上传和下载,同时使用尽可能多的线程。