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 на сервере.