ОБНОВЛЕНО: АПРЕЛЬ 2017 г.

Amazon S3 Buckets - это дешевый способ хранения статических и мультимедийных файлов. Это также кажется самым простым способом при обслуживании приложения Django. Мы собираемся пройти основные шаги по их настройке. Они были заимствованы в основном из этой замечательной статьи с небольшими изменениями, чтобы упростить процесс после обновления консоли AWS и немного лучше понять процесс.

После регистрации на aws.amazon.com первым шагом будет создание пользователя с помощью службы IAM. Таким образом вы можете ограничить доступ к ведру. У каждого пользователя будет свой идентификатор доступа и ключ. Сделать это :

  • В раскрывающемся списке «Службы» выберите «IAM».
  • Нажмите «Пользователи» и выберите «Добавить пользователя».
  • Введите имя пользователя и убедитесь, что в разделе «Тип доступа» выбран «Программный доступ», так как он понадобится вам для предоставления доступа к загрузке для вашей корзины S3. Нажмите «Далее: Разрешения».
  • Выберите «Присоединить существующие политики напрямую».
  • В появившемся списке выберите «AmazonS3FullAccess» и снова нажмите «Далее: Обзор».
  • Нажмите «Создать пользователя».
  • Это создаст пользователя и сгенерирует идентификатор доступа и ключ для пользователя. Пару id-key можно загрузить только на этом этапе, поэтому сделайте это, нажав «Загрузить .csv». Держи это в секрете. Держать его в безопасности. Нажмите «Закрыть».
  • На панели управления пользователями щелкните только что созданного пользователя. Запишите «User ARN». Вы будете использовать это позже.

Если вы проделали это так, великая работа. Ваш пользователь настроен. Следующее поле, которое мы должны проверить, - это создание S3 Bucket.

  • В раскрывающемся списке Службы выберите s3. Это открывает панель инструментов для сегментов S3.
  • Нажмите «Создать сегмент».
  • Выберите нужный регион.
  • Дайте своему ведру имя и нажмите «Далее», чтобы перейти на вкладку «Установить свойства». Нажмите «Далее» еще пару раз, а затем нажмите «Создать сегмент», чтобы создать свой сегмент.

Затем вам нужно будет определить политику, разрешающую ограниченный доступ к вашей корзине. Здесь я отклонился от упомянутой ранее статьи, так как хотел больше понять процесс, а не просто скопировать и вставить упомянутые там правила политики.

  • Щелкните имя только что созданной корзины.
  • Перейдите на вкладку Разрешения, расположенную вверху.
  • Поскольку вам необходимо установить разрешения для доступа, нажмите «Политика сегмента».
  • В левом нижнем углу появившегося модального окна нажмите «AWS Policy Generator», чтобы открыть инструмент, который Amazon предоставляет для быстрого создания политик.

Теперь вам нужно сгенерировать два правила политики. Первый - разрешить нашему размещенному веб-сайту доступ к вашим файлам из корзины. Это будет так:

Select Type of Policy : S3 Bucket Policy
Effect : Allow
Principal : *      //This gives everybody access
AWS Service : Amazon S3
Actions : GetObject
Amazon Resource Name : arn:aws:s3:::<your bucket name>/* //The * at    the end siginifies that access is being given to all the files

После установки значений, как указано выше, нажмите «Добавить отчет». Пока не нажимайте «Создать политику», поскольку вам нужно создать политику, позволяющую приложению Django помещать файлы в корзину при развертывании. Политика будет следующей:

Select Type of Policy : S3 Bucket Policy
Effect : Allow
Principal : <User ARN> //This is the user arn that you kept a note of earlier.
AWS Service : Amazon S3
Actions : * //I gave full access, though I think GetObject,PutObject will be better. Will try it out soon. 
Amazon Resource Name : arn:aws:s3:::<your bucket name>/*,arn:aws:s3:::<your bucket name>  // Gives full access to buckets and its contents.

После установки значений, упомянутых выше, нажмите «Добавить заявление», а затем «Создать политику». Это покажет вам политику, которую вы можете скопировать, вставить в диалоговое окно на панели управления S3 и нажмите Сохранить.

Последний шаг для настройки доступа к корзине - это предоставление приложению, размещенному на Heroku, в моем случае доступа к содержимому корзины. Это можно сделать, настроив конфигурацию CORS. Для этого перейдите на вкладку «Конфигурация CORS» и нажмите «Сохранить». Конфигурации по умолчанию будет достаточно.

У вас настроен доступ к корзине. Теперь все, что вам нужно сделать, это настроить приложение Django для доступа к корзине, что довольно просто. Первым шагом к достижению цели будет установка Boto3 и DjangoStorages. Изящные API-интерфейсы, упрощающие работу с корзинами S3. Это легко сделать с помощью pip.

pip install django-storages boto3
pip freeze >> requirements.txt

и добавьте «хранилища» в список INSTALLED_APPS в файле settings.py.

INSTALLED_APPS = (
          ...,
          'storages',
     )

Затем вам необходимо добавить следующие настройки в файл settings.py вашего приложения.

//set S3 as the place to store your files.
DEFAULT_FILE_STORAGE = “storages.backends.s3boto3.S3Boto3Storage”
STATICFILES_STORAGE = “storages.backends.s3boto3.S3Boto3Storage”
AWS_ACCESS_KEY_ID = os.environ.get(“AWS_ACCESS_KEY_ID”, “”)
AWS_SECRET_ACCESS_KEY = os.environ.get(“AWS_SECRET_ACCESS_KEY”, “”)
AWS_STORAGE_BUCKET_NAME = os.environ.get(“AWS_STORAGE_BUCKET_NAME”, “”)
AWS_QUERYSTRING_AUTH = False //This will make sure that the file URL does not have unnecessary parameters like your access key.
AWS_S3_CUSTOM_DOMAIN = AWS_STORAGE_BUCKET_NAME + ‘.s3.amazonaws.com’
#static media settings
STATIC_URL = ‘https://' + AWS_STORAGE_BUCKET_NAME + ‘.s3.amazonaws.com/’
MEDIA_URL = STATIC_URL + ‘media/’
STATICFILES_DIRS = ( os.path.join(BASE_DIR, “static”), )
STATIC_ROOT = ‘staticfiles’
ADMIN_MEDIA_PREFIX = STATIC_URL + ‘admin/’
STATICFILES_FINDERS = (
‘django.contrib.staticfiles.finders.FileSystemFinder’,
‘django.contrib.staticfiles.finders.AppDirectoriesFinder’,
)

Рекомендуется хранить значения параметров в среде, а не записывать их непосредственно в файл параметров.

Мы почти на месте. Убедитесь, что ваш основной файл urls.py содержит конфигурацию URL для ваших медиафайлов.

from django.conf import settings
urlpatterns = [
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

И в качестве последнего шага в корне вашего приложения должна быть папка с именем static (на том же уровне, что и файл manage.py). Git не позволяет фиксировать пустые папки, поэтому вы можете включить туда файл readme, чтобы зафиксировать папку.

Также, если вы используете Heroku перед тем, как продвигать свой код, используйте

heroku config:set DISABLE_COLLECTSTATIC=1

чтобы отключить автоматический запуск collectstatic, поскольку ваша статическая папка еще не присутствует на сервере, и в этом случае будет выдана ошибка. Вы можете запустить его вручную, используя

heroku run python manage.py collectstatic --noinput

Один важный момент, прежде чем вы отправитесь в это приключение. На данный момент для всех медиафайлов (файлов, загружаемых пользователем), используемых в наших моделях, установлено свойство upload_to, и в результате статические файлы не перезаписываются. В противном случае я бы посоветовал прочитать упомянутую выше статью и рассмотреть стратегии, упомянутые автором, чтобы смягчить проблему. Мы, вероятно, внедрим его в будущем, если и когда у нас будет товар, соответствующий рынку, и у нас будет время для беспокойства по этому поводу.

Итак, долгий, трудный (?) И увлекательный процесс завершен, и вы готовы обслуживать статические и мультимедийные файлы из корзины S3. Если у вас есть какие-либо советы, как сделать это лучше / обнаружить ошибку, напишите мне сообщение, и я буду более чем счастлив накричать вам кофе!

Если хотите, посмотрите некоторые из моих приложений:







Lookie - Dictionary Made Easy
Lookie - это словарь, который вы« искали
(да, мы глупые), если вам нравится печатное слово. Lookie приносит… itunes.apple.com »