web-dev-qa-db-ja.com

静的ファイルにs3、boto、Django-storageを使用すると、ピアによって接続がリセットされます

Djangoプロジェクトの静的ファイルをホストするためにAmazons3を使用するように切り替えようとしています。Django、boto、Django-storage、Django-compressorを使用しています。collectstaticを実行すると私の開発サーバー、エラーが発生します

socket.error: [Errno 104] Connection reset by peer 

私のすべての静的ファイルのサイズは74MBで、大きすぎないようです。誰かがこれを以前に見たことがありますか、またはデバッグのヒントがありますか?

これが完全なトレースです。

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/Django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/Django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/Django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/Django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/Django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/usr/local/lib/python2.7/dist-packages/Django/contrib/staticfiles/management/commands/collectstatic.py", line 163, in handle_noargs
    collected = self.collect()
  File "/usr/local/lib/python2.7/dist-packages/Django/contrib/staticfiles/management/commands/collectstatic.py", line 113, in collect
    handler(path, prefixed_path, storage)
  File "/usr/local/lib/python2.7/dist-packages/Django/contrib/staticfiles/management/commands/collectstatic.py", line 303, in copy_file
    self.storage.save(prefixed_path, source_file)
  File "/usr/local/lib/python2.7/dist-packages/Django/core/files/storage.py", line 45, in save
    name = self._save(name, content)
  File "/usr/local/lib/python2.7/dist-packages/storages/backends/s3boto.py", line 392, in _save
    self._save_content(key, content, headers=headers)
  File "/usr/local/lib/python2.7/dist-packages/storages/backends/s3boto.py", line 403, in _save_content
    rewind=True, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 1222, in set_contents_from_file
    chunked_transfer=chunked_transfer, size=size)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 714, in send_file
    chunked_transfer=chunked_transfer, size=size)
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/key.py", line 890, in _send_file_internal
    query_args=query_args
  File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 547, in make_request
    retry_handler=retry_handler
  File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 966, in make_request
    retry_handler=retry_handler)
  File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 927, in _mexe
    raise e
socket.error: [Errno 104] Connection reset by peer

更新:このエラーをデバッグする方法についての答えはありませんが、後でこれが発生しなくなったため、S3の何かに関係している可能性があると思います。

22
jkeesh

tl; dr

バケットがデフォルトのリージョンにない場合は、接続するリージョンをbotoに指示する必要があります。バケットがus-west-2にある場合は、settings.pyに次の行を追加する必要があります。

 AWS_S3_Host = 's3-us-west-2.amazonaws.com'

長い説明:

これは権限の問題ではないため、バケットの権限を「認証されたユーザー」に設定しないでください。

この問題は、デフォルトではないリージョン(私の場合はus-west-2を使用していた)でバケットを作成した場合に発生します。

デフォルトのリージョンを使用せず、バケットが存在するリージョンをbotoに通知しない場合、botoはデフォルトのリージョンに接続し、S3はバケットが属するリージョンへの307リダイレクトで応答します。

残念ながら、botoのこのバグのために:

https://github.com/boto/boto/issues/2207

botoがファイルのアップロードを完了する前に307応答が到着した場合、botoはリダイレクトを認識せず、デフォルトのリージョンにアップロードを続けます。最終的にS3はソケットを閉じ、「ピアによる接続のリセット」が発生します。

これは、アップロードされるオブジェクトのサイズとインターネット接続の速度に依存する一種の競合状態であり、ランダムに発生する理由を説明しています。

OPがしばらくしてエラーの表示を停止した理由は2つ考えられます。

- he later created a new bucket in the default region and the problem went away by itself. 
- he started uploading only small files, which are fast enough to be fully uploaded by the time S3 replies with 307
16
Luca Gibelli

これは、新しいバケットを初めて作成するときに発生する問題です。アップロードを開始する前に、数時間または数分待つ必要があります。なぜs3がそのように動作するのかわかりません。新しいバケットを作成してみることを証明するには、Djangoストレージをそのバケットにポイントすると、Djangoプロジェクトから何かをアップロードしようとすると、接続ピアがリセットされたことが表示されますが、しばらく待ちます数時間または数分、もう一度試してみてください。同じ手順を繰り返して、を参照してください。

4
pitaside

テスト/開発に使用する2番目のS3バケットをセットアップしようとしてこの問題が発生しました古いバージョンのアプリケーションをデプロイするのに役立ちました

なぜそれが役立つのか私にはわかりませんが、事後にこのように読んでいる人(数時間前の私のように)にとっては、別のアプリケーションバージョンをデプロイすることを試みる価値があります。

0
Brendan