intermediate
Object storage
Object storage для blobов, статики, бэкапов, signed upload, lifecycle rules и неизменяемых долговечных данных.
Object storage (S3, GCS, Azure Blob, R2) хранит immutable blobs по path — user uploads, static assets, logs, backups и CI artifacts. FullStack JS обычно грузит через presigned URLs: браузер шлёт файлы напрямую в storage, API проверяет metadata и permissions.
// API выдаёт presigned PUT; клиент грузит прямо в bucket
const url = await s3.getSignedUrl('putObject', {
Bucket: 'uploads',
Key: `${userId}/${uuid()}.webp`,
Expires: 300,
ContentType: 'image/webp',
});
| Контроль | Назначение | |----------|------------| | Bucket policy / IAM | Кто read/write | | Lifecycle | Expire temp prefix, tier старых logs | | CORS | Правила direct upload из браузера | | Encryption | SSE-S3, SSE-KMS или client-side |
Не открывайте listing на чувствительных buckets. Ограничивайте content-type и size на edge или в Lambda validation. Versioning помогает при случайной перезаписи.
На интервью: flow presigned URL, public vs private buckets, модель consistency, CDN перед static buckets и стоимость egress плюс request charges.
Типовые ошибки: public `ListBucket`; предсказуемые keys и enumeration; долгоживущие presigned URLs; секреты или DB dumps без encryption.
Компромисс — дешёкое durable storage в масштабе против eventual consistency listing, отсутствия POSIX и egress при global раздаче.
Чеклист:
- Presigned uploads с коротким TTL и typed content.
- Lifecycle для temp и log prefix.
- Public access off по умолчанию; CDN только нужные paths.
- Scan uploads и проверка size на сервере.