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/何かがそれに追いついていないのでしょうか? 映画のアップロードは S3 に 2 回ヒットするようですが、画像は 1 回ヒットするため、boto は 307 の罰金に対処している可能性があります (そして、boto の 307 サポートのクローズド チケットは数年前のものです)。大丈夫、何か他のことが起きています。

しかし、何?楽しく生産的な 1 日からヘッドエンドになり、非常にイライラしています。

何が起きている可能性があるか、および/またはこれを回避するために何を試みるかについて何か提案はありますか?

(これは、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 で自動的に行われるはずです。

このアプローチは、バケット名に「.」が含まれている場合に問題を引き起こす可能性があります。その場合、ホスト ヘッダーは foofoofoo.bar.s3.amazonaws.com である可能性があり、S3 エンドポイントのワイルドカード SSL 証明書はサブドメインの 1 つのレベルに対してのみ有効であるため、バケット名のピリオドが原因で SSL 証明書の検証が失敗します。 .

だから「.」について聞いてみた。バケット名に含まれていますが、明らかにそれは問題ではありません。ログからより多くのコンテキストを提供できる方法はありますか? 証明書の検証エラーが発生する前に何が起こっているかを確認したいと思います。

于 2012-10-05T19:36:37.537 に答える