← Назад к вопросам
Что такое S3 бакеты и как они используются?
2.4 Senior🔥 301 комментариев
#DevOps и инфраструктура#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
S3 бакеты: облачное хранилище объектов
S3 (Simple Storage Service) — это облачный сервис хранения объектов от Amazon Web Services (AWS). S3 бакеты — это контейнеры (хранилища) для организации и управления файлами в облаке.
Основные характеристики S3
- Масштабируемость — неограниченное количество файлов
- Надёжность — 99.99% доступности и 11 девяток долговечности
- Стоимость — платишь только за использованное хранилище
- Управление версиями — ведение истории изменений файлов
- Контроль доступа — гибкая система прав и ACL
- CDN интеграция — распределение контента через CloudFront
Структура и терминология
Бакет — это как папка верхнего уровня:
mybucket/
├── images/
│ ├── photo1.jpg
│ └── photo2.jpg
├── documents/
│ ├── report.pdf
│ └── whitepaper.docx
└── videos/
└── intro.mp4
Объект (Object) — это файл с метаданными. Каждый объект имеет:
- Key — путь/имя файла (например:
images/photo1.jpg) - Value — содержимое файла (данные)
- Metadata — таги и другие метаданные
- Version ID — если включено управление версиями
Работа с S3 в Python
Установка:
pip install boto3
Базовые операции:
import boto3
from botocore.exceptions import ClientError
from typing import Optional
class S3Manager:
def __init__(self, bucket_name: str, region: str = 'us-east-1'):
self.s3_client = boto3.client('s3', region_name=region)
self.bucket_name = bucket_name
def upload_file(self, file_path: str, s3_key: str) -> bool:
"""Загрузить файл в S3"""
try:
self.s3_client.upload_file(file_path, self.bucket_name, s3_key)
print(f'Файл {file_path} загружен как {s3_key}')
return True
except ClientError as e:
print(f'Ошибка загрузки: {e}')
return False
def download_file(self, s3_key: str, file_path: str) -> bool:
"""Скачать файл из S3"""
try:
self.s3_client.download_file(self.bucket_name, s3_key, file_path)
print(f'Файл {s3_key} скачан в {file_path}')
return True
except ClientError as e:
print(f'Ошибка скачивания: {e}')
return False
def list_files(self, prefix: str = '') -> list:
"""Список файлов в бакете"""
try:
response = self.s3_client.list_objects_v2(
Bucket=self.bucket_name,
Prefix=prefix
)
return [obj['Key'] for obj in response.get('Contents', [])]
except ClientError as e:
print(f'Ошибка списания: {e}')
return []
def delete_file(self, s3_key: str) -> bool:
"""Удалить файл из S3"""
try:
self.s3_client.delete_object(Bucket=self.bucket_name, Key=s3_key)
print(f'Файл {s3_key} удален')
return True
except ClientError as e:
print(f'Ошибка удаления: {e}')
return False
def get_presigned_url(self, s3_key: str, expiration: int = 3600) -> Optional[str]:
"""Получить временную ссылку для доступа"""
try:
url = self.s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': self.bucket_name, 'Key': s3_key},
ExpiresIn=expiration
)
return url
except ClientError as e:
print(f'Ошибка создания URL: {e}')
return None
Использование:
# Создаём менеджер
s3 = S3Manager('my-app-bucket')
# Загружаем файл
s3.upload_file('/local/path/image.jpg', 'images/photo.jpg')
# Список файлов
files = s3.list_files('images/')
print(f'Изображений: {len(files)}')
# Получаем временную ссылку (действительна 1 час)
url = s3.get_presigned_url('images/photo.jpg')
print(f'Скачать по ссылке: {url}')
# Удаляем файл
s3.delete_file('images/old-photo.jpg')
Использование S3 в Django приложении
from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage
# settings.py
if USE_S3:
AWS_STORAGE_BUCKET_NAME = 'my-django-bucket'
AWS_S3_REGION_NAME = 'eu-west-1'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
# Для статических файлов
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'
STATIC_LOCATION = 'static'
# Для медиа файлов (загрузки пользователей)
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
MEDIA_LOCATION = 'media'
# models.py
from django.db import models
class UserAvatar(models.Model):
user = models.OneToOneField('User', on_delete=models.CASCADE)
image = models.ImageField(upload_to='avatars/') # Загружается в S3
uploaded_at = models.DateTimeField(auto_now_add=True)
Типичные use-cases
- Статические файлы — CSS, JavaScript, изображения для веб-сайта
- Пользовательский контент — загрузки файлов (аватары, документы)
- Бэкапы — автоматическое резервное копирование БД
- Медиа-контент — видео, музыка, огромные файлы
- Data Lake — хранение больших объёмов данных для аналитики
- Логирование — архивирование логов приложения
Преимущества S3
- Надёжность — данные реплицируются в разные центры
- Производительность — оптимизировано для быстрого доступа
- Контроль стоимости — платишь только за необходимое
- Интеграция — работает с другими AWS сервисами
- Безопасность — шифрование в покое и при передаче
S3 бакеты — это стандарт для облачного хранения объектов, используется почти в каждом современном приложении.