AWS S3 Bucket Django 3.0 Профиль пользователя Загрузка изображения Ошибка доступа - PullRequest
4 голосов
/ 20 апреля 2020

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!

1 Ответ

3 голосов
/ 26 апреля 2020

В консоли AWS перейдите на вкладку «Разрешения», затем на

  1. разрешите publi c доступ к вашей корзине -> Сохранить -> Подтвердите ее
  2. Кнопка «Bucket policy». Появится окно редактирования. Замените «arn: aws: s3 :::» в поле редактирования на часть, начинающуюся с «arn:», показанной над окном редактирования, но будьте осторожны, чтобы сохранить «/ *» в конце. Используйте следующий код ниже. Вставьте следующее:
 {
  "Version":"2012-10-17",
  "Statement":[{
    "Sid":"PublicReadGetObject",
        "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::your-buckt-arn/*"
      ]
    }
  ]
}
...