Ответ
Изображения хранились в Amazon S3 (Simple Storage Service) с использованием Amazon CloudFront в качестве CDN для быстрой глобальной доставки.
Архитектура хранения:
- Исходные файлы загружались в S3-бакет с уникальными ключами (например,
users/{userId}/avatar/{timestamp}.jpg). - CloudFront распределял контент по edge-локациям, уменьшая задержку.
- Для безопасного доступа генерировались подписанные URL (Signed URLs) с ограниченным временем действия (TTL).
Преимущества такого подхода:
- Масштабируемость: S3 автоматически масштабируется под нагрузку.
- Долговечность: Высокая доступность (99.99%) и резервирование данных.
- Интеграция: Прямая совместимость с другими AWS-сервисами (Lambda, Rekognition).
- Экономия: Оплата только за фактически использованный объем хранилища и трафик.
Пример кода загрузки (Java SDK v2):
S3Client s3Client = S3Client.builder()
.region(Region.EU_WEST_1)
.build();
PutObjectRequest request = PutObjectRequest.builder()
.bucket("my-app-images")
.key("uploads/2023/profile_123.jpg")
.contentType("image/jpeg")
.build();
s3Client.putObject(request, RequestBody.fromFile(new File("/local/path/image.jpg")));
Безопасность: Доступ к бакету был ограничен политиками IAM, а публичный доступ отключен. Все запросы из приложения использовали временные подписанные URL от CloudFront.