python - aws - Usando Cloudfront con Django S3Boto
django storages (2)
He configurado con éxito mi aplicación para usar S3 para almacenar todos los archivos estáticos y multimedia. Sin embargo, me gustaría subir a S3 (operación actual), pero servir desde una instancia de cloudfront que he configurado. He intentado ajustar la configuración a la URL de cloudfront pero no funciona. ¿Cómo puedo subir a S3 y servir desde Cloudfront por favor?
Ajustes
AWS_S3_CUSTOM_DOMAIN = ''%s.s3.amazonaws.com'' % AWS_STORAGE_BUCKET_NAME
DEFAULT_FILE_STORAGE = ''app.custom_storages.MediaStorage''
STATICFILES_STORAGE = ''app.custom_storages.StaticStorage''
STATICFILES_LOCATION = ''static''
MEDIAFILES_LOCATION = ''media''
STATIC_URL = "https://s3-eu-west-1.amazonaws.com/app/%s/" % (STATICFILES_LOCATION)
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
custom_storages.py
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class StaticStorage(S3BotoStorage):
location = settings.STATICFILES_LOCATION
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION
Su código está casi completo, excepto que no está agregando su dominio de cloudfront a STATIC_URL / MEDIA_URL y sus almacenamientos personalizados.
En detalle, primero debe instalar las dependencias.
pip install django-storages-redux boto
Agregue la configuración requerida a su archivo de configuración de django
INSTALLED_APPS = (
...
''storages'',
...
)
AWS_STORAGE_BUCKET_NAME = ''mybucketname''
AWS_CLOUDFRONT_DOMAIN = ''xxxxxxxx.cloudfront.net''
AWS_ACCESS_KEY_ID = get_secret("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = get_secret("AWS_SECRET_ACCESS_KEY")
MEDIAFILES_LOCATION = ''media''
MEDIA_ROOT = ''/%s/'' % MEDIAFILES_LOCATION
MEDIA_URL = ''//%s/%s/'' % (AWS_CLOUDFRONT_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = ''app.custom_storages.MediaStorage''
STATICFILES_LOCATION = ''static''
STATIC_ROOT = ''/%s/'' % STATICFILES_LOCATION
STATIC_URL = ''//%s/%s/'' % (AWS_CLOUDFRONT_DOMAIN, STATICFILES_LOCATION)
STATICFILES_STORAGE = ''app.custom_storages.StaticStorage''
Sus almacenamientos personalizados necesitan algunas modificaciones para presentar el dominio de cloudfront para los recursos, en lugar del dominio S3:
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class StaticStorage(S3BotoStorage):
"""uploads to ''mybucket/static/'', serves from ''cloudfront.net/static/''"""
location = settings.STATICFILES_LOCATION
def __init__(self, *args, **kwargs):
kwargs[''custom_domain''] = settings.AWS_CLOUDFRONT_DOMAIN
super(StaticStorage, self).__init__(*args, **kwargs)
class MediaStorage(S3BotoStorage):
"""uploads to ''mybucket/media/'', serves from ''cloudfront.net/media/''"""
location = settings.MEDIAFILES_LOCATION
def __init__(self, *args, **kwargs):
kwargs[''custom_domain''] = settings.AWS_CLOUDFRONT_DOMAIN
super(MediaStorage, self).__init__(*args, **kwargs)
Y eso es todo lo que necesita, suponiendo que su depósito y el dominio de Cloudfront estén correctamente vinculados y que el usuario AWS_ACCESS_KEY tenga permisos de acceso a su depósito. Además, en función de su caso de uso, es posible que desee que todos los usuarios puedan acceder a sus elementos del cubo s3.
Tuve un problema similar y solo configuré AWS_S3_CUSTOM_DOMAIN
a la URL de Cloudfront en la settings.py
Django.py funcionó para mí. Puedes consultar el código here .