Я пытался настроить S3 для обслуживания моих статических файлов. Файлы, кажется, находятся в ведре, и ссылки на файлы, кажется, проходят через OK в моих шаблонах, но файлы фактически не применяются. Когда я смотрю на инспектора моего браузера, я вижу теги скрипта, подобные этим
<script src="https://mybucket.s3.amazonaws.com/static/js/jquery.js?AWSAccessKeyId=REDACTED&Signature=REDACTED&Expires=00000000"></script>
Примечание: я изменил значения в ссылках на УДАЛЕНО и 00000000
Когда я иду на
https://mybucket.s3.amazonaws.com/static/js/jquery.js
Я действительно вижу код. Но когда я иду на
https://mybucket.s3.amazonaws.com/static/js/jquery.js?AWSAccessKeyId=REDACTED&Signature=REDACTED&Expires=00000000
Я получаю следующее сообщение
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>InvalidRequest</Code>
<Message>
The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.
</Message>
<RequestId>REDACTED</RequestId>
<HostId>
REDACTED
</HostId>
</Error>
Редактировать: Согласно предложению Майкла Дж. Робертса, похоже, что проблема связана с подписью. Доки хранилищ django говорят, что вы должны добавить
S3_USE_SIGV4 = True
в settings.py. Я сделал это, но это не решает мою проблему. Возможно, я делаю это неправильно или некоторые другие мои настройки мешают работе?
Я создал папку aws внутри той же папки, что и настройки, в которой есть файл utils.py
from storages.backends.s3boto3 import S3Boto3Storage
StaticRootS3BotoStorage = lambda: S3Boto3Storage(location='static')
MediaRootS3BotoStorage = lambda: S3Boto3Storage(location='media')
а потом в мои settings.py я ставлю
import datetime
AWS_ACCESS_KEY_ID = 'REDACTED'
AWS_SECRET_ACCESS_KEY = 'REDACTED'
AWS_FILE_EXPIRE = 200
S3_USE_SIGV4 = True
AWS_PRELOAD_METADATA = True
AWS_QUERYSTRING_AUTH = True
DEFAULT_FILE_STORAGE = 'MyProject.aws.utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'MyProject.aws.utils.StaticRootS3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'mybucket'
S3DIRECT_REGION = 'eu-central-1'
AWS_S3_HOST = 's3.eu-central-1.amazonaws.com'
S3_URL = '//%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
MEDIA_URL = '//%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME
MEDIA_ROOT = MEDIA_URL
STATIC_URL = S3_URL + 'static/'
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
two_months = datetime.timedelta(days=61)
date_two_months_later = datetime.date.today() + two_months
expires = date_two_months_later.strftime("%A, %d %B %Y 20:00:00 GMT")
AWS_HEADERS = {
'Expires': expires,
'Cache-Control': 'max-age=%d' % (int(two_months.total_seconds()), ),
}
Здесь что-то не так?
Может ли это быть связано с тем, что я еще не настроил свой проект для SSL? Или это действительно вещь AWS.
В моих журналах при загрузке страницы написано "Расчет подписи с использованием аутентификации hmacv1". Эта версия должна быть v4? Или это ничего не говорит?