INTRO
- Я следую этому руководству в соответствии с рекомендациями, вот репозиторий GitHub руководства .
- Я также создал для него AmazonS3FullAccess
- Я использую третий пример руководства " Смешивание публикуемых c активов и частных активов " со stati c , media publi c, media, private version.
- Если пользователь входит в систему (локальная среда разработки), он загружает файлы с веб-сайта, но не может получить к ним доступ с веб-сайта только с AWS S3. веб-сайт управления.
- В настоящее время я блокирую доступ к publi c в том виде, в каком он представлен в руководстве (AWS Настройки панели управления S3)
- Я добавил эти строки в свой Редактор конфигурации CORS из это другое руководство
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
- Включен центральный сервер ЕС, который является более локальным для меня. НЕ работал Я получил ту же ошибку.
storage_backends.py
from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage
class StaticStorage(S3Boto3Storage):
location = settings.AWS_STATIC_LOCATION
class PublicMediaStorage(S3Boto3Storage):
location = settings.AWS_PUBLIC_MEDIA_LOCATION
file_overwrite = False
class PrivateMediaStorage(S3Boto3Storage):
location = settings.AWS_PRIVATE_MEDIA_LOCATION
default_acl = 'private'
file_overwrite = False
custom_domain = False
settings.py
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'MYPROJECTS_MAIN_APP/static'),]
AWS_ACCESS_KEY_ID = 'DSHUGASGHLASF678FSHAFH'
AWS_SECRET_ACCESS_KEY = 'uhsdgahsfgskajgjkafgjkdfjkgkjdfgfg'
AWS_STORAGE_BUCKET_NAME = 'MYSTORAGE289377923'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_STATIC_LOCATION = 'static'
STATICFILES_STORAGE = 'mysite.storage_backends.StaticStorage'
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_STATIC_LOCATION)
AWS_PUBLIC_MEDIA_LOCATION = 'media/public'
DEFAULT_FILE_STORAGE = 'mysite.storage_backends.PublicMediaStorage'
AWS_PRIVATE_MEDIA_LOCATION = 'media/private'
PRIVATE_FILE_STORAGE = 'mysite.storage_backends.PrivateMediaStorage'
AWS_S3_HOST = "s3.eu-central-1.amazonaws.com"
S3_USE_SIGV4 = True
AWS_S3_REGION_NAME = "eu-central-1"
models.py
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from mysite.storage_backends import PrivateMediaStorage
class Document(models.Model):
uploaded_at = models.DateTimeField(auto_now_add=True)
upload = models.FileField()
class PrivateDocument(models.Model):
uploaded_at = models.DateTimeField(auto_now_add=True)
upload = models.FileField(storage=PrivateMediaStorage())
user = models.ForeignKey(User, related_name='documents')
views.py
from django.contrib.auth.decorators import login_required
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
from .models import Document, PrivateDocument
class DocumentCreateView(CreateView):
model = Document
fields = ['upload', ]
success_url = reverse_lazy('home')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
documents = Document.objects.all()
context['documents'] = documents
return context
@method_decorator(login_required, name='dispatch')
class PrivateDocumentCreateView(CreateView):
model = PrivateDocument
fields = ['upload', ]
success_url = reverse_lazy('profile')
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
return super().form_valid(form)
ОШИБКА
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>56fg67dfg56df7g67df</RequestId>
<HostId>
hsiugYIGYfhuieHF7weg68g678dsgds78g67dsg86sdg68ds7g68ds7yfsd8f8hd7
</HostId>
</Error>
Вещи, которые я до сих пор пробовал
- Был период между тем, когда он создал ссылку AWS, а также добавил файл в локальный файл. папка "media" Но так как я удалил «Папку мультимедиа», и она только создает URL-ссылки и фактически загружает их в корзину S3
- , я нашел тот же вопрос на форуме aws, но он не ответили
- Права доступа Django + AWS S3 Bucket: аутентифицированный доступ к S3 Bucket (я не понимаю этот ответ { ссылка } )
- "использование AWS4-HMA C -SHA256"
- Указание региона хоста S3 для правильного использования https://github.com/aws/aws-sdk-js/issues/829
- site для поиска вашего региона - https://docs.aws.amazon.com/general/latest/gr/rande.html
- Я также получил это как рекомендацию "Большинство новых регионов поддерживают только
AWS4-HMAC-SHA256
- если ваш код не поддерживает эту схему аутентификации и только создал "подписи v2" создайте свое ведро в одном из старых регионов, например, в Европе это, кажется, только Ирландия - проверьте это здесь: https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html " - Я нахожусь в Европейском Союзе с моей испытательной машиной - и я установил базовое ведро S3 в США - как я могу настроить приложение Django ИЛИ AWS S3 Bucket так, чтобы оно позволяло получать к нему доступ из любого места (было бы особенно важно, чтобы приложение было развернуто так, чтобы люди со всего мира могли получить к нему доступ) , Парень из того же видео комментария прокомментировал следующее
Steve D
Great video series, just to say I am using an S3 bucket in Europe and needed to add additional settings AWS_S3_HOST = "s3.eu-west-2.amazonaws.com" and AWS_S3_REGION_NAME="eu-west-2" to make it work
- Это был именно тот код, который я добавил в настройки на основе и в дополнение к оригинальному коду руководства. Когда я переключаю изображения, это работает, но когда я покидаю настройки профиля и go назад изображение исчезает и выдает исходную ошибку):
AWS_S3_HOST = "s3.eu-central-1.amazonaws.com"
S3_USE_SIGV4 = True
AWS_S3_REGION_NAME = "eu-central-1"
- ОТКЛЮЧЕНИЕ всех Ограничение доступа (временно) и добавление политик Bucket в AWS S3 Management consol
- 1 КОД:
{ "Version":"2012-10-17", "Statement":[{ "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal": "", "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::myprojectname_that_jsut_abow_this_field/*" ] } ] }
-> ОШИБКА - 2 КОД:
{ "Version":"2012-10-17", "Statement":[{ "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal": "", "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::myprojectname_that_jsut_abow_this_field/" ] } ] }/*
-> ОШИБКА - 3 КОД: Я изменил на
{ "Version":"2012-10-17", "Statement":[{ "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal": "*", "Action":["s3:GetObject"], "Resource":"arn:aws:s3:::myprojectname_that_jsut_abow_this_field/*" } ] }
и получил следующую ошибку: Error Access denied
- 4 КОД:
{ "Version":"2012-10-17", "Statement":[{ "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal": "", "Action":["s3:GetObject"], "Resource":"arn:aws:s3:::myprojectname_that_jsut_abow_this_field/*" } ] }
ОШИБКА: Error Missing required field Principal cannot be empty!