Search code examples
djangopython-2.7amazon-s3boto3swisscomdev

Swisscom Appcloud S3 Connection reset by peer


We have a Django Webservice that uses Swisscom AppCloud's S3 solution. So far we had no problems, but without changing anything on the application we are experiencing ConnectionError: ('Connection aborted.', error(104, 'Connection reset by peer')) errors when we are trying to upload files. We are using boto3 1.4.4.

Edit:

The error occures after somwhere between 10 and 30s. When I try from my local development machine it works.

from django.conf import settings
from boto3 import session
from botocore.exceptions import ClientError

class S3Client(object):

    def __init__(self):
        s3_session = session.Session()

        self.s3_client = s3_session.client(
            service_name='s3',
            aws_access_key_id=settings.AWS_ACCESS_KEY,
            aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
            endpoint_url=settings.S3_ENDPOINT,
        )

    .
    .
    .

    def add_file(self, bucket, fileobj, file_name):
        self.s3_client.upload_fileobj(fileobj, bucket, file_name)

        url = self.s3_client.generate_presigned_url(
            ClientMethod='get_object',
            Params={
                'Bucket': bucket,
                'Key': file_name
            },
            ExpiresIn=60*24*356*10  # signed for 10 years. Should be enough..
        )

        url, signature = self._split_signed_url(url)

        return url, signature, file_name

Could this be a version problem or anything else on our side?

Edit: Made some tests with s3cmd: I can list the buckets I have access to but for all other commands like listing all objects or just listing the objects in a bucket I get a Retrying failed request: / ([Errno 54] Connection reset by peer)


Solution

  • After some investigation I found the error:

    Swisscom's implementation of S3 is somehow not up-to-date with Amazon's. To solve the problem I had to downgrade botocore from 1.5.78 to 1.5.62.