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 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 Authenticated Users
+ Subir / Eliminar
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