Рубрики
Без рубрики

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

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

Автор оригинала: Taimoor Choudhary.

Вступление

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

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

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

Ведро S3

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

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

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

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

Весенний клиент Amazon S3

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

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

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


    org.springframework.cloud
    spring-cloud-starter-aws

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

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

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

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

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

@Autowired
private AmazonS3 amazonS3Client;

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

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

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

Прямая Загрузка Файлов/Составных Файлов

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

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

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

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

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

То, что мы сделали, – это просто преобразовать составную часть в обычный объект Java File с помощью FileOutputStream . После преобразования его можно загрузить в корзину S3, используя тот же метод putObject () , что и раньше.

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

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

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

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 */
}

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

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

Загрузка файлов для общего просмотра

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

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

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

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

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

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

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

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

После загрузки вы можете легко загружать файлы из своего хранилища с помощью метода GetObject() через экземпляр класса Amazon S3 .

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

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, мы можем вернуть данные файла вызывающему объекту без создания Файла с помощью 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

Удаление файлов из корзины 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 .