[Answered ]-AWS Elastic Beanstalk & Django 1.5: Collectstatic to S3 fails

2👍

@barrigaj, yes, I’ve found a solution. I simply had to change the order (MEDIA_ROOT and STATIC_ROOT need to be above DEFAULT_FILE_STORAGE and STATICFILES_STORAGE).

MEDIA_ROOT = '/media/' 
STATIC_ROOT = '/static/'
DEFAULT_FILE_STORAGE = 'myapp.s3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'myapp.s3utils.StaticRootS3BotoStorage'
S3_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
MEDIA_URL = S3_URL + MEDIA_ROOT
STATIC_URL = S3_URL + STATIC_ROOT
👤Simon

0👍

I think the answer is much simpler than that. This is working for me on AWS Elastic Beanstalk:

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_KEY']

The AWS keys are passed in from the container config file and I have no STATIC_ROOT or STATIC_URL set at all. Also no need for the myapp.s3utils file. These details are handled by the storage system. The trick here is that I need to reference this unknown path in my templates correctly and dynamically. For example:

<link rel="icon" href="{% static "img/favicon.ico" %}">

That is how I address my favicon which lives locally (pre-deployment) in ~/Projects/my_app/project/my_app/static/img/.

Of course I have a separate local_settings.py file for accessing this stuff locally in dev environment. I had to do a lot of experimenting and reading to find this solution and it works consistently with no errors.

Leave a comment