Весеннее облако: AWS S3

Введение Amazon Web Services [https://aws.amazon.com] (AWS) предлагает широкий спектр надежных вычислительных услуг по запросу. Он делает это, скрывая управление инфраструктурой и его сложности, тем самым упрощая процесс предоставления и запуска облачной инфраструктуры. AWS позволяет ИТ-компаниям и разработчикам сосредоточиться на создании лучших решений для своих продуктов с помощью масштабируемых веб-сервисов и веб-сервисов по запросу, которые упрощают увеличение или уменьшение любого ресурса как приложения.

Вступление

Amazon Web Services (AWS) предлагает широкий спектр надежных вычислительных услуг по запросу. Он делает это, скрывая управление инфраструктурой и его сложности, тем самым упрощая процесс предоставления и запуска облачной инфраструктуры.

AWS позволяет ИТ-компаниям и разработчикам сосредоточиться на создании лучших решений для своих продуктов с помощью масштабируемых веб-сервисов и веб-сервисов по запросу, которые упрощают увеличение или уменьшение любого ресурса по мере развития приложения.

Одним из таких продуктов является Simple Storage Service, или S3, который позволяет дешево хранить файлы в любом масштабе.

Ковш S3

Сервис Amazon Simple Storage позволяет пользователям надежно и эффективно управлять своими статическими данными, храня их на серверах Amazon. К сохраненным данным можно получить доступ в любое время из любого места через Интернет.

Данные, хранящиеся в корзине S3, доступны через Amazon Management Console, которая представляет собой интерфейс пользовательского интерфейса, а также через интерфейс командной строки AWS и S3 REST API для разработчиков.

Spring Cloud AWS

Сервисы AWS можно интегрировать в приложения Java с помощью Spring , которая является хорошо известной и наиболее часто используемой веб-платформой Java. Spring Cloud для Amazon Web Services позволяет разработчикам получать доступ к сервисам AWS с меньшим объемом кода и простой интеграцией.

Клиент Spring Amazon S3

Корзина S3, в которой хранятся наши данные, доступна через клиент Spring Amazon S3, предлагающий общие операции для управления данными на сервере. В этом разделе мы покажем, как включить эту клиентскую библиотеку в ваш проект, а позже мы рассмотрим некоторые общие операции S3, доступные через клиента.

Зависимости Maven

Первым шагом к интеграции AWS в проект Spring, конечно же, является импорт необходимых зависимостей. В этом случае мы будем использовать speing-cloud-starter-aws , который содержит зависимости spring-cloud-aws-context и spring-cloud-aws-autoconfigure

 <dependency> 
 <groupId>org.springframework.cloud</groupId> 
 <artifactId>spring-cloud-starter-aws</artifactId> 
 </dependency> 

Конфигурация Spring Cloud AWS

Поскольку мы используем Spring Boot, естественно, большая часть настройки выполняется самим фреймворком. Однако конфигурации, относящиеся к AWS, должны быть указаны в файле application.yaml

 cloud: 
 aws: 
 region.static: "[S3 Bucket region]" 
 credentials: 
 accessKey: "xxxxxxx" 
 secretKey: "xxxxxxx" 

Помните, что имена и структуры свойств строго отформатированы и будут использоваться Spring Boot для установки допустимого соединения с сервисами AWS.

Объект "наблюдения" для управления запросами к AmazonS3 S3 с использованием клиента Amazon S3 является экземпляром класса AmazonS3:

 @Autowired 
 private AmazonS3 amazonS3Client; 

Мы будем автоматически подключать его как стандартный компонент Spring, а свойства из нашего .yaml будут использоваться для его привязки и подготовки к работе.

Загрузка файлов в S3

В S3 Bucket можно загружать файлы любого типа, хотя один из наиболее распространенных вариантов использования - хранение изображений. Хранение файлов / изображений, хранящихся в облаке, упрощает доступ к ним и обеспечивает их безопасность в стабильном и быстром сервисе, который может масштабировать ресурсы, необходимые для обслуживания ваших файлов.

Прямая загрузка файла / составного файла

Когда клиент Amazon S3 заработает, вы можете загрузить новый файл, просто вызвав метод putObject() :

 amazonS3Client.putObject(new PutObjectRequest("bucketName", "fileKey", file)); 

Где bucketName - это имя корзины S3, в которую вы хотите загрузить файл. fileKey - это строковое значение, которое однозначно идентифицирует загружаемый file и файл является допустимым объектом File

Если у вас есть файл, состоящий из нескольких частей, который поступает в ваше приложение или микросервис через открытую конечную точку REST, его также можно загрузить. Это требует небольшого дополнительного кода, и мы просто конвертируем MultipartFile в File :

 File file = new File("FileName"); 
 try { 
 FileOutputStream fileOutputStream = new FileOutputStream(file) 
 fileOutputStream.write(multipartFile.getBytes()); 
 } catch (IOException e) { 
 /* Handle Exception */ 
 } 

Мы просто преобразовали FileOutputStream File с помощью FileOutputStream. После преобразования его можно загрузить в putObject() который использовался ранее.

Загрузка файлов как метаданных

При обработке запросов и данных, полученных через конечные точки API, хранение копии данных на нашем собственном сервере перед загрузкой в нашу корзину S3 неэффективно с точки зрения затрат и просто увеличивает размер нашего приложения без необходимости, поскольку основным ресурсом для хранения файлов будет Ковш S3.

Чтобы избежать необходимости хранить копию, мы можем использовать PutObjectRequest из API Amazon для загрузки файла InputStream и предоставив сведения о файле в виде метаданных:

 ObjectMetadata objectMetaData = new ObjectMetadata(); 
 objectMetaData.setContentType(multipartFile.getContentType()); 
 objectMetaData.setContentLength(multipartFile.getSize()); 
 
 try { 
 PutObjectRequest putObjectRequest = new PutObjectRequest("bucketName", "fileName", multipartFile.getInputStream(), objectMetaData); 
 amazonS3Client.putObject(putObjectRequest); 
 } catch (IOException e) { 
 /* Handle Exception */ 
 } 

Размер и тип содержимого файла указываются через объект ObjectMetaData Входной поток файла добавляется в PutObjectRequest вместе с именем корзины S3, в которую мы загружаем, а также именем файла, с которым нужно связать.

После PutObjectRequest объекта PutObjectRequest его можно отправить в S3 Bucket с помощью putObject() , как и раньше.

Отправка файлов в режиме общего просмотра

Иногда мы можем пожелать, чтобы загруженные файлы были общедоступными. Читателю не требуется авторизация, например, для просмотра изображений в сообщении в блоге. На данный момент мы загрузили файлы, для просмотра которых требуется наше разрешение.

AWS 'S3 предоставляет нам возможность устанавливать уровень доступа для каждого загружаемого файла во время их загрузки.

Чтобы изменить уровень доступа и предоставить публичный доступ, немного изменим запрос на загрузку данных:

 new PutObjectRequest("bucketName", "fileName", multipartFile.getInputStream(), objectMetaData) 
 .withCannedAcl(CannedAccessControlList.PublicRead) 

Добавление свойства CannedAccessControlList.PublicRead PutObjectRequest дает общий доступ только для чтения к загружаемому файлу, что позволяет любому, у кого есть правильный URL-адрес, получить доступ к файлу или просмотреть его.

После PutObjectRequest объекта PutObjectRequest его можно загрузить в корзину S3, используя тот же putObject() что и раньше.

Загрузка файлов с S3

После загрузки вы можете легко загружать файлы из своей корзины с помощью метода getObject() AmazonS3 класса AmazonS3.

S3Object объект упаковывается в экземпляр S3Object, который затем может быть передан в обычный Object :

 S3Object s3Object = amazonS3Client.getObject("bucketName", "fileName"); 
 S3ObjectInputStream inputStream = s3Object.getObjectContent(); 
 byte[] bytes = StreamUtils.copyToByteArray(inputStream); 
 File file = new File("File_Name"); 
 try { 
 FileOutputStream fileOutputStream = new FileOutputStream(file) 
 fileOutputStream.write(bytes); 
 } catch (IOException e) { 
 /* Handle Exception */ 
 } 

Если запрос на загрузку файла выполняется через конечную точку REST, мы можем вернуть данные файла вызывающей сущности без создания File с помощью Spring ResponseEntity :

 S3Object s3Object = amazonS3Client.getObject("bucketName", "fileName"); 
 S3ObjectInputStream inputStream = s3Object.getObjectContent(); 
 byte[] bytes = StreamUtils.copyToByteArray(inputStream); 
 String contentType = s3Object.getObjectMetadata().getContentType(); 
 return ResponseEntity.ok().contentType(contentType).body(bytes); 

Таким образом, нам не нужно создавать файл на нашем сервере при загрузке из корзины S3, файл просто возвращается вызывающей стороне в ответе API.

Удалить файл из S3 Bucket

Удаление файлов из корзины S3 - самая простая задача, и все, что вам нужно знать, - это абсолютный путь к файлу.

Вызов deleteObject() с именем сегмента и полным именем файла удаляет файл с сервера, если он существует:

 amazonS3Client.deleteObject("bucketName", "fileName"); 

Заключение

Amazon S3 обеспечивает удобный способ хранения файловых данных в облаке и предоставляет надежный носитель для доступа к данным, когда это необходимо.

Благодаря Spring Cloud AWS разработчики могут легко получить доступ к сервисам Amazon S3 из своего приложения для выполнения необходимых операций.

Для приложений Spring Boot все управление подключением к серверу Amazon осуществляется самим Spring, что упрощает работу по сравнению с использованием обычного aws-java-sdk с простыми приложениями Java.

Как видно из приведенных выше фрагментов кода, доступ к корзине S3 с помощью Spring Cloud AWS довольно прост, и объем кода также очень мал.

Исходный код проекта доступен на GitHub .

comments powered by Disqus