В современном цифровом ландшафте наличие надежной и масштабируемой инфраструктуры для размещения статических файлов имеет решающее значение для веб-приложений. Django, популярный веб-фреймворк Python, предлагает бесшовную интеграцию с Amazon Web Services (AWS) для выполнения этой задачи. В этом руководстве мы рассмотрим, как размещать статические файлы Django в AWS с помощью CloudFront, мощной службы сети доставки контента (CDN), чтобы обеспечить высокую доступность и быструю доставку контента.

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

Понимание статических файлов Django

Прежде чем углубляться в технические аспекты, важно понять статические файлы Django. Эти файлы включают таблицы стилей CSS, сценарии JavaScript, изображения и другие ресурсы, которые обслуживаются веб-сервером напрямую без какой-либо обработки. Эффективное управление статическими файлами повышает общую производительность и удобство использования вашего приложения Django.

Обычно, когда вы развертываете службу в рабочей среде с помощью Django, особенно когда вы устанавливаете переменную настроек DEBUG=False Django, за исключением того, что вы предоставляете способ обработки этих статических файлов, таких как облачная служба или CDN. Что происходит в этом потоке, так это то, что всякий раз, когда служба хочет получить доступ к этим файлам, они извлекаются из CDN или облачной службы вместо того, чтобы жить в той же кодовой базе, что и сам веб-сервис.

В этой статье мы будем использовать сервисы AWS под названием S3 и CloudFront.

  • Amazon S3 – это масштабируемая и надежная облачная служба хранения, предоставляемая Amazon Web Services (AWS). Он позволяет безопасно и надежно хранить и извлекать большие объемы данных, таких как изображения, видео, документы и резервные копии. S3 предоставляет модель хранения на основе объектов, в которой каждый объект хранится в корзине и доступен с использованием уникального ключа.
  • Amazon CloudFront — это сеть доставки контента (CDN), также предоставляемая Amazon Web Services. Он помогает доставлять контент, такой как веб-страницы, изображения, видео и другие статические или динамические файлы, пользователям с малой задержкой и высокой скоростью передачи. CloudFront кэширует контент в периферийных местоположениях, распределенных по всему миру, ближе к пользователям, что сокращает расстояние и задержку в сети. Это повышает производительность доставки контента пользователям в разных регионах.

Настройка пользователя IAM

Войдите под своим пользователем root, а затем продолжайте создавать нового пользователя, которого вы будете использовать в этом упражнении. Вам потребуется создать пользователя с доступом к
S3 и CloudFront:

  • Перейдите в раздел IAM > Пользователи > Добавить нового пользователя.
  • Введите имя пользователя, которое вы хотите для своего пользователя, и на следующем шаге выберите вкладку Прикрепить политики напрямую .
  • Прикрепите эти две политики: CloudFrontFullAccess и AmazonS3FullAccess

Или, если вы хотите пропустить эту часть (для простоты), просто используйте пользователя root (но это ни в коем случае не рекомендуется в целях безопасности)

Настройка S3 и CloudFront

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

  • Введите имя корзины и выберите регион
  • Держите ACL-списки отключенными
  • Установите флажок Блокировать весь общий доступ и оставьте все остальное по умолчанию.

Вы можете идти!

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

Перейдите к консоли CloudFront и нажмите Создать базу раздачи CloudFront. После этого вам может потребоваться заполнить некоторую информацию:

  • Исходный домен: выберите созданный вами сегмент S3.
  • Origin Access: выберите Устаревшие идентификаторы доступа, а затем нажмите Создать новый OAI.
  • В политике сегментов выберите: Да, обновить политику сегментов.
  • Разрешенные методы HTTP: GET, HEAD, OPTIONS.
  • Брандмауэр веб-приложений (WAF): не включайте средства защиты
  • Политика заголовков ответов SimpleCORS

Вот и все, оставьте все остальное по умолчанию. Теперь будет создана новая раздача CloudFront, которая вернет обратно имя домена раздачи, которое в моем случае выглядит примерно так:

https://d29u7vv9xp7q8y.cloudfront.net

Отлично, теперь давайте внесем необходимые изменения в наше приложение Django.

Настройка нашего приложения Django — загрузка статических файлов

Чтобы загрузить наши статические файлы в корзину AWS S3, нам нужно отключить режим DEBUG, а также обновить некоторые настройки и конфигурации в нашем приложении Django. Для начала сначала установите django-storageslibrary — библиотеку для лучшей обработки хранилищ в Django.

$ pip install django-storages

После этого создайте новый модуль Python с именем storage_backends.py и добавьте следующий код:

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage


class StaticStorage(S3Boto3Storage):
    location = 'static'
    custom_domain = settings.CLOUDFRONT_DOMAIN

Это говорит о том, что вы хотите загружать статические файлы в папку с именем static, а персональным доменом для обработки и перенаправления статических файлов будет CLOUDFRONT_DOMAIN, настроенный в settings.py.

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

DEBUG = False
AWS_ACCESS_KEY_ID = 'YOUR_AWS_ACCESS_KEY_ID'
AWS_SECRET_ACCESS_KEY = 'YOUR_AWS_SECRET_ACCESS_KEY'
AWS_STORAGE_BUCKET_NAME = 'NAME_OF_BUCKET'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_S3_REGION_NAME = "YOUR_LOCATION_IN_AWS"
AWS_S3_SIGNATURE_VERSION = "s3v4"
AWS_QUERYSTRING_EXPIRE = 604800
CLOUDFRONT_DOMAIN = 'YOUR_CLOUD_FRONT.cloudfront.net'

STATIC_LOCATION = "static"
STATIC_URL = f'{CLOUDFRONT_DOMAIN}/static/'
# Add your path in the STATICFILES_STORAGE
STATICFILES_STORAGE = 'django_static.storage_backends.StaticStorage'

Этого должно быть достаточно. Теперь, прежде чем запускать приложение Django, откройте новую консоль и соберите статические файлы:

python manage.py collectstatic

You have requested to collect static files at the destination
location as specified in your settings.

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes

125 static files copied.

Теперь перейдите в свою учетную запись AWS и перейдите в свою корзину и посмотрите, скопированы ли файлы в папку с именем static, если они все работают, как и ожидалось.

Тестирование интеграции с CloudFront:

Теперь пришло время проверить, правильно ли CloudFront обслуживает ваши статические файлы. Запустите сервер разработки Django и получите доступ к своему приложению. Проверьте сетевые запросы с помощью инструментов разработчика вашего браузера, чтобы убедиться, что статические файлы извлекаются с указанного вами URL-адреса CloudFront.

python manage.py runserver    
Performing system checks...

System check identified no issues (0 silenced).
July 30, 2023 - 16:58:13
Django version 4.2.3, using settings 'django_static.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Теперь посетите localhost:8000/admin или 127.0.0.1/admin и откройте инструменты разработчика, например в Google Chrome: CTRL+SHIFT+I и перейдите на вкладку сети. Нажмите на один из файлов .css и перейдите в раздел «Заголовки», чтобы увидеть запрошенный URL-адрес и посмотреть, указывает ли он на URL-адрес CloudFront, который вы определили в settings.py.

Включение инвалидации кэша CloudFront:

Чтобы ваши пользователи получали последние версии ваших статических файлов, настройте аннулирование кэша CloudFront. Есть два распространенных подхода к достижению этого. Вы можете вручную аннулировать кеш CloudFront при каждом обновлении статических файлов с помощью Консоли управления AWS или интерфейса командной строки AWS. В качестве альтернативы вы можете реализовать методы аннулирования кеша в своем приложении Django, такие как управление версиями статических файлов или добавление параметра строки запроса.

Подведение итогов

В этой статье мы настроили приложение Python с помощью Django & Deploy и обслуживаем статические файлы из CloudFront.

Вы можете найти полный исходный код статьи в репозитории GitHub вместе с инструкциями.

www.github.com/vjanz/django-static-files-s3-cloudfront

Если вы нашли это полезным, пожалуйста, не забудьте похлопать и поделиться им в своей социальной сети или с друзьями.

Если вы хотите поддержать мою работу, вы можете купить мне кофе, нажав на изображение ниже 😄

Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне.

Свяжитесь со мной в LinkedIn, GitHub