6

我正在使用 django-storages (1.1.4) 的 boto (2.2.1) 后端将文件上传到 S3 存储桶。它适用于图像,但是当我尝试上传电影文件(小 mov、小 avi)或 mp3 时,我收到了 Broken pipe 错误。

这很奇怪。

深入研究 Django 回溯,我看到以下异常:

boto.https_connection.InvalidCertificateException

哪种适合我使用 Cyber​​duck 直接检查存储桶的经验:有时它抱怨我的证书*.s3.amazonaws.com和域不匹配*.s3-external-3.amazonaws.com

事实上,存储桶日志显示我正在接受 HTTP 307 临时重定向。是否可能是 AWS 以一种方式发送某些内容类型,而另一些则以另一种方式发送,但 boto/something 无法跟上这一点?电影的上传似乎确实击中了 S3 两次,而图像击中了一次,所以很可能 boto 正在应对 307 罚款(并且 boto 中支持 307 的封闭票已经有几年了),所以它可以好吧,没关系,还有其他事情发生了。

但是什么?我已经从一个愉快的高效的一天变成了一个头,这是非常令人沮丧的。

关于可能发生的事情和/或尝试解决此问题的任何建议?

(请注意,使用 boto S3 后端或简单的 S3 后端会失败 - 只是 boto 给了我看起来更具体的错误)

4

1 回答 1

3

我将其写为答案,因为它太长而无法放入评论中。它并不能真正回答您的问题,但也许它会帮助您找到答案。

您正在发生 307 重定向,因为存储桶位于 eu-west-1 中,但您正在访问标准 s3.amazonaws.com 端点。S3 使用一些 DNS 魔术和 HTTP 重定向将流量从通用 S3 端点路由到正确的区域端点。

为此,大多数 S3 客户端使用“子域”引用方案,该方案将存储桶名称添加到请求中的主机名之前。因此,如果您尝试访问您的存储桶,则请求中的 Host 标头在 boto 中默认为 foofoofoo-bar.s3.amazonaws.com,然后使用 DNS 魔术和 HTTP 重定向,S3 最终会获得您的请求到正确的地方。这一切都应该在 boto 中自动发生。

如果您的存储桶名称包含“.”,则此方法可能会导致问题。因为 Host 标头可能是 foofoofoo.bar.s3.amazonaws.com,并且由于 S3 端点上的通配符 SSL 证书仅适用于一级子域,因此存储桶名称中的句点会导致 SSL 证书验证失败.

这就是我问“。”的原因。在您的存储桶名称中,但显然这不是问题。无论如何,您可以从日志中提供更多上下文吗?我想看看在证书验证错误之前发生了什么。

于 2012-10-05T19:36:37.537 回答