files cloudfront django amazon-s3 static-files django-storage

cloudfront - Restablecimiento de la conexión entre pares cuando se usa s3, boto, django-storage para archivos estáticos



django boto3 (4)

Estoy intentando cambiar para usar amazon s3 para alojar nuestros archivos estáticos para nuestro proyecto django. Estoy usando django, boto, django-storage y django-compressor. Cuando ejecuto la recopilación estática en mi servidor dev, aparece el error

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

El tamaño de todos mis archivos estáticos es de 74 MB, lo que no parece demasiado grande. ¿Alguien ha visto esto antes, o tiene algún consejo de depuración?

Aquí está la huella completa.

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

ACTUALIZACIÓN: No tengo la respuesta sobre cómo depurar este error, pero luego esto simplemente dejó de suceder, lo que me hace pensar que puede tener que ver con algo en S3.


Acabo de tener este problema al intentar configurar un segundo cubo S3 para usarlo en pruebas / desarrollo y lo que ayudó fue implementar una versión anterior de la aplicación .

No tengo idea de por qué eso ayudaría, pero para aquellos de ustedes que leen de esta manera después del hecho (como yo, hace un par de horas), vale la pena intentar implementar una versión de aplicación diferente.


Este es un problema que a veces ocurre cuando crea un nuevo grupo la primera vez, tiene que esperar algunas horas o minutos antes de comenzar a cargar. No sé por qué s3 se comporta así. Para probar que intenta crear un nuevo grupo, apunta tu almacenamiento de django hacia él y verás que se ve restablecido el par de conexión cuando intentas cargar cualquier cosa desde tu proyecto de django, pero espera un par de horas o minutos. Inténtalo de nuevo. Funcionará. Repite el mismo paso y verás.


Tienes que configurar tus permisos de cubo a Lista de Authenticated Users + Subir / Eliminar o puede crear un usuario específico en la sección IAM de amazon y configurar los derechos de acceso solo para ese usuario específico

Esto me ayudó hace algunas veces: Configurar S3 para Django


tl; dr

Si su depósito no está en la región predeterminada, debe indicar a boto a qué región conectarse, por ejemplo, si su depósito está en us-west-2, debe agregar la siguiente línea a settings.py:

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

Explicación larga:

No es un problema de permisos y no debe establecer sus permisos de depósito en ''Usuarios autenticados''.

Este problema ocurre si crea su grupo en una región que no es la predeterminada (en mi caso, estaba usando us-west-2).

Si no usa la región predeterminada y no le dice a boto en qué región reside su grupo, boto se conectará a la región predeterminada y S3 responderá con un redireccionamiento 307 a la región a la que pertenece el grupo.

Desafortunadamente, debido a este error en boto:

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

Si llega la respuesta 307 antes de que boto haya terminado de cargar el archivo, boto no verá la redirección y seguirá subiendo a la región predeterminada. Finalmente, S3 cierra el socket que resulta en un ''Restablecimiento de la conexión por par''.

Es un tipo de condición de carrera que depende del tamaño del objeto que se está cargando y la velocidad de su conexión a Internet, lo que explica por qué sucede de forma aleatoria.

Hay dos razones posibles por las que el OP dejó de ver el error después de un tiempo:

- 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