Гид по технологиям

Django + AWS S3: хранение статических файлов и медиа — пошаговый гид

8 min read Django Обновлено 14 Dec 2025
Django + AWS S3: хранение статиков и медиа
Django + AWS S3: хранение статиков и медиа

логотипы Django и бакета AWS S3

Зачем использовать S3 для Django

  • S3 — объектное хранилище от AWS для статических и медиаконтентов. Оно масштабируется автоматически и интегрируется с CDN (CloudFront).
  • Вынос файлов в S3 снижает нагрузку на веб‑сервер, ускоряет доставку, упрощает бэкапы и работу с версиями.
  • Подходит для сайтов с растущим трафиком, хранения больших файлов (аудио, видео) и распределённой архитектуры.

Краткое определение: S3 — объектное хранилище, где каждый файл хранится как «объект» в «бакете» (bucket).

Перед началом

  • Нужно: аккаунт AWS, базовые права администратора для создания S3 и IAM, проект Django в виртуальном окружении.
  • Рекомендация: не храните ключи доступа в репозитории. Используйте переменные окружения или секретный менеджер.

Шаг 1: Создайте аккаунт AWS

Если у вас ещё нет аккаунта — зарегистрируйтесь на aws.amazon.com и активируйте учётную запись. Новые аккаунты обычно получают бесплатный доступ к 5 ГБ S3 Standard в течение года в рамках Free Tier.

Шаг 2: Создайте S3-бакет для проекта

  1. После входа в AWS Console найдите сервис S3 через строку поиска.

страница AWS с поиском S3

  1. На странице S3 нажмите кнопку Create bucket (Создать бакет).

страница AWS для создания S3-бакета

  1. Укажите уникальное имя бакета и регион. Советы по имени: должно быть глобально уникальным, использовать только допустимые символы, не начинаться с «xn–» и избегать точек, если планируете настроить HTTPS через виртуальные хосты.

форма создания S3-бакета

  1. Параметр “Block Public Access” по умолчанию блокирует весь публичный доступ — это безопасно для приватных данных. Если вы хотите публиковать статические файлы напрямую (без CloudFront или подписи), можно снять блокировку для конкретного бакета, но это повышает риск утечки данных. Чаще выбирают приватный бакет и раздачу через CloudFront или префиксы с публичным доступом только для статических ресурсов.

опция блокировки публичного доступа к бакету

  1. Завершите создание бакета — он появится в списке.

список созданных S3-бакетов

Важно: резервируйте имя бакета и продумывайте структуру префиксов (например: mysite-media/, mysite-static/).

Шаг 3: Создайте IAM-пользователя для приложения

Почему отдельный IAM‑пользователь: он позволяет разделить полномочия, дать минимально необходимые права и при необходимости отозвать доступ без затрагивания учётной записи владельца.

  1. В консоли AWS найдите IAM.

результаты поиска по IAM

  1. В разделе Users нажмите Add users.

интерфейс AWS создания IAM-пользователя

  1. Дайте имя пользователю, например mysite-deploy или mysite-app, и выберите тип доступа Programmatic access (только программный доступ — чтобы получить ключи).

форма для ввода имени IAM-пользователя

  1. Принцип наименьших привилегий: не давайте S3FullAccess если можно ограничить доступ конкретным бакетом. Ниже приведён пример IAM policy, разрешающей доступ только к конкретному бакету и его префиксам.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::your-bucket-name"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:PutObjectAcl"
      ],
      "Resource": [
        "arn:aws:s3:::your-bucket-name/*"
      ]
    }
  ]
}

Замените your-bucket-name на имя вашего бакета. Эта политика позволяет просматривать содержимое бакета и управлять объектами внутри него, но не управляет настройками самого бакета.

  1. Примените политику к пользователю и завершите создание.

страница с правами IAM-пользователя

  1. Подтвердите и создайте пользователя.

страница обзора настроек нового IAM-пользователя

Совет: для сред, размещённых в AWS (EC2, ECS, Lambda), используйте IAM роли вместо хранения ключей в окружении — это безопаснее.

Шаг 4: Создайте Access Key для IAM-пользователя

  1. В списке пользователей кликните по имени пользователя и перейдите на вкладку Security credentials.

список созданных IAM-пользователей

  1. В секции Access keys нажмите Create access key.

интерфейс создания access key в AWS

  1. Выберите use case (например, Local code) — это влияет только на подсказки AWS, а не на работу ключа.

страница рекомендаций по использованию access key

  1. Добавьте тег/описание при желании и создайте ключ.

ввод описания для access key

  1. Сохраните Access Key ID и Secret Access Key. Скачайте CSV или сохраните в безопасном месте — секретный ключ показывается только один раз.

учётные данные access key

Безопасность: не коммитьте ключи в репозиторий. Используйте переменные окружения или менеджеры секретов (AWS Secrets Manager, Parameter Store).

Шаг 5: Настройте Django для работы с S3

Установите необходимые пакеты в виртуальном окружении:

pip install django-storages boto3

Добавьте приложение django-storages в INSTALLED_APPS в settings.py:

INSTALLED_APPS = [
    # ...
    'storages',
]

Основные настройки для хранения медиа и статических файлов через S3:

# credentials — лучше хранить через переменные окружения
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 = 'your-bucket-name'
AWS_S3_REGION_NAME = 'your-region'  # например, 'eu-central-1'
AWS_S3_SIGNATURE_VERSION = 's3v4'
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
AWS_S3_ADDRESSING_STYLE = 'virtual'  # опция, по необходимости
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

Пояснения:

  • AWS_S3_FILE_OVERWRITE = False — предотвращает перезапись файлов с одинаковыми именами.
  • AWS_DEFAULT_ACL = None — делает объекты приватными по умолчанию, если хотите публичный доступ, задавайте ACL явным образом или используйте CloudFront.
  • DEFAULT_FILE_STORAGE отвечает за хранение пользовательских загрузок (media).

Лучше сохранять ключи как переменные окружения. Пример в Linux/macOS:

export AWS_ACCESS_KEY_ID='AKIA...'
export AWS_SECRET_ACCESS_KEY='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'

Альтернативы: используйте django-environ или python-decouple для загрузки переменных из .env-файла (не коммитить .env в репозиторий).

Дополнительно, для статических файлов добавьте:

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_LOCATION = 'static'
STATIC_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/{AWS_LOCATION}/'

Если вы используете CloudFront, STATIC_URL должен указывать на домен CloudFront.

Шаг 6: Тестирование конфигурации

Пример модели с ImageField в Django:

class Post(models.Model):
    title = models.CharField(max_length=225)
    content = models.TextField('Post Body')
    author = models.CharField(max_length=225)
    date_published = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='posts')

    def __str__(self):
        return self.title

Шаги теста:

  • Выполните миграции: python manage.py makemigrations && python manage.py migrate
  • Зарегистрируйте модель в admin.py и войдите в админку
  • Попробуйте загрузить изображение в форме модели

Если всё настроено правильно, при открытии изображения в новой вкладке URL будет указывать на S3‑бакет.

админка Django по умолчанию

изображение, загруженное в S3-бакет

И в консоли S3 вы увидите соответствующую папку и файл:

S3-бакет с созданной папкой

Тестовые кейсы для приёмки:

  • Загрузка файла через админку создаёт объект в бакете.
  • Доступ к файлу через браузер возвращает корректный контент и код 200 (или временная подписанная ссылка даёт доступ, если объект приватный).
  • Попытка загрузить файл с тем же именем не перезаписывает существующий файл (если AWS_S3_FILE_OVERWRITE=False).

Шаг 7: Развёртывание статических файлов (collectstatic)

Добавьте в settings.py конфигурацию для статических файлов (повтор):

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_LOCATION = 'static'

Запустите

python manage.py collectstatic --noinput

После выполнения в бакете появится префикс static с собранными файлами.

S3-бакет со статическими файлами

Безопасность и надёжность

Важные практики:

  • Least privilege: выдавайте права только на конкретный бакет/префиксы.
  • Не храните ключи в репозитории. Используйте переменные окружения, AWS IAM роли или Secrets Manager.
  • Включите шифрование на стороне сервера (SSE-S3 или SSE-KMS) для защищённого хранения данных.
  • Включите версионирование бакета, если хотите иметь возможность откатить удалённые или перезаписанные объекты.
  • Используйте lifecycle rules для автоматического перехода старых объектов в более дешёвые классы хранения или удаления.
  • Включите логирование доступа и аудит через S3 Access Logs или AWS CloudTrail.

Подписанные ссылки (presigned URLs)

Если ваши объекты приватны, выдавайте временные подписи для загрузки/скачивания. Boto3 умеет генерировать presigned_url для get_object и put_object.

Пример получения подписи в Python:

import boto3
s3 = boto3.client('s3')
url = s3.generate_presigned_url('get_object', Params={'Bucket': 'your-bucket-name','Key': 'path/to/object.jpg'}, ExpiresIn=3600)

Производительность и оптимизация

  • Используйте CloudFront перед S3 для снижения задержек и защиты происхождения.
  • Настройте заголовки Cache-Control и Expires в метаданных объектов для длительного кэширования статических ресурсов.
  • Минимизируйте количество запросов (спрайты, bundle), используйте gzip/brotli.
  • Для больших загрузок используйте multipart upload.

Управление затратами

  • S3 тарифицируется по объёму хранения, операциям (PUT, GET), и исходящему трафику. Оценивайте TCO по вашему трафику и объёмам.
  • Lifecycle rules и переход объектов в Glacier/IA помогают снизить затраты для редко читаемых данных.

Когда S3 — не лучшее решение

  • Если у вас небольшое приложение без масштабируемых требований и минимальным трафиком, проще хранить файлы на том же сервере и использовать встроенные возможности хостинга.
  • Когда нужно полностью управлять файловой системой POSIX или выполнять частые мелкие транзакции — S3 не подойдёт как замена файловой системе.

Альтернативы

  • Google Cloud Storage — сходная модель, интеграция с GCP.
  • DigitalOcean Spaces — проще и часто дешевле для небольших проектов.
  • Self‑hosted object storage (MinIO) — для локальных/частных облаков.

Частые ошибки и их исправления

  • Проблема: изображения не загружаются; при обращении к URL — 403. Решение: проверьте политику бакета, ACL объекта и правильность ключей доступа; если объекты приватны, убедитесь в корректной генерации presigned URL.

  • Проблема: collectstatic не отправляет файлы. Решение: проверьте STATICFILES_STORAGE, права на AWS и конфигурацию AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY.

  • Проблема: файлы перезаписываются. Решение: установите AWS_S3_FILE_OVERWRITE = False.

Ролевые чек‑листы (кто что делает)

  • Разработчик:

    • Добавляет и тестирует модель с ImageField/FileField
    • Проверяет генерацию URL и presigned links
    • Покрывает тестами загрузку/скачивание
  • DevOps/Инженер по инфраструктуре:

    • Создаёт бакет и IAM-пользователя
    • Настраивает lifecycle, версионирование, шифрование
    • Настраивает CloudFront и SSL
  • Администратор безопасности:

    • Проверяет политики доступа
    • Настраивает логирование и аудит
    • Ревьюит права IAM

Критерии приёмки

  • Файлы, загруженные через интерфейс, попадают в нужный префикс бакета.
  • STATIC и MEDIA доступны в продакшн через CDN или публичные URL согласно требованиям.
  • Секреты не хранятся в репозитории, права IAM ограничены.
  • Наличие мониторинга/логирования доступа к бакету.

Мини‑методология развёртывания

  1. Создать бакет и IAM пользователя в отдельном тестовом аккаунте.
  2. Настроить переменные окружения и локально протестировать загрузку.
  3. Настроить lifecycle, шифрование и политики безопасности.
  4. Подключить CloudFront (если требуется) и обновить STATIC_URL/DEFAULT_FILE_STORAGE.
  5. Перенести изменения в staging → smoke‑тесты → production.

Сводка

Использование AWS S3 с Django даёт масштабируемость и простоту управления статикой и медиа. Настройка сводится к созданию бакета, выделенного IAM‑пользователя, безопасному хранению ключей и правильной конфигурации django‑storages. Для продакшна обязательно применяйте практики безопасности (least privilege, шифрование, версии), настраивайте CDN для производительности и планируйте lifecycle‑политики для уменьшения затрат.

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

Краткие шаги чек‑листа для завершения проекта:

  • Создан S3-бакет и настроен регион
  • Создан IAM-пользователь с минимальными правами
  • Сгенерированы и безопасно сохранены ключи доступа
  • Установлены django-storages и boto3
  • Настроено DEFAULT_FILE_STORAGE и STATICFILES_STORAGE
  • Проверена загрузка файлов и collectstatic
  • Включены шифрование и версионирование (по необходимости)

Конечный вывод: S3 — надёжное и гибкое решение для хранения файлов в Django‑проектах при условии корректной настройки безопасности и учёта требуемой производительности.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как играть в RuneScape в браузере
Игры

Как играть в RuneScape в браузере

App Tracking Transparency в iOS 14.5 — как включить и отключить
Конфиденциальность

App Tracking Transparency в iOS 14.5 — как включить и отключить

Массовое переименование файлов на Windows, Mac и Linux
Инструменты

Массовое переименование файлов на Windows, Mac и Linux

Hulu + Live TV DVR: как записывать и управлять
Стриминг

Hulu + Live TV DVR: как записывать и управлять

Ошибка файловой системы Photos в Windows 10 и 11 — как исправить
Windows

Ошибка файловой системы Photos в Windows 10 и 11 — как исправить

Как включить Smart Invert на iPhone и iPad
Инструкции

Как включить Smart Invert на iPhone и iPad