Django AWS S3 — 400 «Плохой запрос» — не удается получить доступ к изображению из корзины

#django #amazon-web-services #amazon-s3

#джанго #amazon-web-services #amazon-s3

Вопрос:

Недавно я решил объединить изображения, используемые в моем приложении, из статической папки в моем корневом каталоге в корзину AWS S3.

К сожалению, я получаю эту ошибку, когда открываю свое приложение в браузере: localhost/:65 GET https://django-plantin-bugtracker-files.s3.amazonaws.com/profile_pics/aragorn_SztKYs6.jpg?AWSAccessKeyId=AKIA3KFS7YZNOMSRYG3Oamp;Signature=fYWSQFdzTvtOF9OXAfw9yqfGyQc=amp;E

Это странно, потому что я могу получить прямой доступ к URL-адресу изображения (например https://django-plantin-bugtracker-files.s3.us-east-2.amazonaws.com/default.jpg ), что наводит меня на мысль, что мое приложение просто не получает к нему должного доступа.

Я разблокировал весь общедоступный доступ к моей корзине S3 и добавил эти строки кодов в следующие файлы:

В моем приложении settings.py я добавил:

 AWS_STORAGE_BUCKET_NAME=config('AWS_S3_BUCKET_NAME')
AWS_ACCESS_KEY_ID = config('AWS_S3_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_S3_SECRET_ACCESS_KEY')

AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
 

В моем ведре S3 Bucket Policy :

 {
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::django-plantin-bugtracker-files/*"
        }
    ]
}
 

В моем ведре S3 CORS :

 [
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]
 

Кто-нибудь знает, почему мои изображения не отображаются? Веб-страница загружается нормально, и ошибки от Django нет.

Изображения выглядят следующим образом:

Пример изображения, которое не загружено

Комментарии:

1. «разблокирован весь общедоступный доступ в моей корзине S3» — как насчет настроек общедоступного доступа на уровне учетной записи?

2. Вот что у меня есть на данный момент: заблокировать весь общедоступный доступ Отключить Блокировать общедоступный доступ к сегментам и объектам, предоставленным через новые списки управления доступом (ACL) Отключить блокировать общедоступный доступ к сегментам и объектам, предоставленным через любые списки управления доступом (ACL) Отключить блокировать общедоступный доступ к сегментам и объектам, предоставленным через новый общедоступный сегмент или политики точек доступа отключены Блокировка общего и межаккаунтного доступа к корзинам и объектам через любую общедоступную корзину или политики точек доступа Отключены

3. Использует ли корзина шифрование KMS?

4. Я отключил Default Encryption его при создании корзины.

Ответ №1:

Я понял, что было не так. Мне не хватало этой строки кода в settings.py файле моей папки приложения. Добавление этого решило проблему, и теперь появляются изображения.

 AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
 

Ответ №2:

Я проверил, и ваш файл доступен для публикации, как и ожидалось:

 curl https://django-plantin-bugtracker-files.s3.amazonaws.com/profile_pics/aragorn_SztKYs6.jpg
 
 Accept-Ranges: bytes
Content-Type: image/jpeg
Content-Length: 17532
 

Так что это не проблема с политикой корзины или S3. Это должно быть что-то специфичное для вашего приложения.