Перейти к основному содержимому

AWS S3 с Java

· 6 мин. чтения

1. Введение

В этом руководстве мы узнаем, как программно взаимодействовать с системой хранения Amazon S3 (Simple Storage Service) из Java.

Помните, что S3 имеет очень простую структуру; в каждой корзине может храниться любое количество объектов, доступ к которым можно получить с помощью интерфейса SOAP или API в стиле REST.

В дальнейшем мы будем использовать AWS SDK для Java для создания, перечисления и удаления корзин S3. Мы также будем загружать, перечислять, скачивать, копировать, перемещать, переименовывать и удалять объекты в этих корзинах.

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

Прежде чем мы начнем, нам нужно объявить зависимость AWS SDK в нашем проекте:

<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.163</version>
</dependency>

Чтобы просмотреть последнюю версию, мы можем проверить Maven Central .

3. Предпосылки

Чтобы использовать AWS SDK, нам понадобится несколько вещей:

  1. Учетная запись AWS: нам нужна учетная запись Amazon Web Services. Если у нас его нет, мы можем пойти дальше и создать учетную запись .
  2. Учетные данные безопасности AWS: это наши ключи доступа, которые позволяют нам выполнять программные вызовы действий AWS API. Мы можем получить эти учетные данные двумя способами: либо с помощью учетных данных корневой учетной записи AWS из раздела ключей доступа на странице «Учетные данные безопасности », либо с помощью учетных данных пользователя IAM из консоли IAM .
  3. Выбор региона AWS. Нам также необходимо выбрать регионы AWS, в которых мы хотим хранить данные Amazon S3. Имейте в виду, что цены на хранилище S3 зависят от региона. Для получения более подробной информации перейдите к официальной документации . В этом уроке мы будем использовать восток США (Огайо, регион us-east-2 ).

4. Создание клиентского подключения

Во-первых, нам нужно создать клиентское соединение для доступа к веб-сервису Amazon S3. Для этой цели мы будем использовать интерфейс AmazonS3 :

AWSCredentials credentials = new BasicAWSCredentials(
"<AWS accesskey>",
"<AWS secretkey>"
);

Затем настроим клиент:

AmazonS3 s3client = AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(Regions.US_EAST_2)
.build();

5. Операции корзины Amazon S3

5.1. Создание ведра

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

Кроме того, как указано в официальной документации , имена Bucket должны соответствовать следующим требованиям:

  • имена не должны содержать подчеркивания
  • имена должны быть длиной от 3 до 63 символов
  • имена не должны заканчиваться тире
  • имена не могут содержать смежные периоды
  • имена не могут содержать дефисы рядом с точками (например, «my-.bucket.com» и «my.-bucket» недействительны)
  • имена не могут содержать символы верхнего регистра

Теперь давайте создадим ведро:

String bucketName = "foreach-bucket";

if(s3client.doesBucketExist(bucketName)) {
LOG.info("Bucket name is not available."
+ " Try again with a different Bucket name.");
return;
}

s3client.createBucket(bucketName);

Здесь мы используем s3client , созданный на предыдущем шаге. Прежде чем мы создадим корзину, мы должны проверить, доступно ли имя нашей корзины, используя метод doBucketExist() . Если имя доступно, мы будем использовать метод createBucket() .

5.2. Листинг сегментов

Теперь, когда мы создали несколько сегментов, давайте распечатаем список всех сегментов, доступных в нашей среде S3, используя метод listBuckets() . Этот метод вернет список всех Buckets:

List<Bucket> buckets = s3client.listBuckets();
for(Bucket bucket : buckets) {
System.out.println(bucket.getName());
}

Это перечислит все сегменты, которые присутствуют в нашей среде S3:

foreach-bucket
foreach-bucket-test2
elasticbeanstalk-us-east-2

5.3. Удаление корзины

Важно убедиться, что наше ведро пусто, прежде чем мы его удалим. В противном случае будет выброшено исключение. Также обратите внимание, что только владелец ведра может удалить его, независимо от его разрешений (политики контроля доступа):

try {
s3client.deleteBucket("foreach-bucket-test2");
} catch (AmazonServiceException e) {
System.err.println("e.getErrorMessage());
return;
}

6. Операции с объектами Amazon S3

Файл или набор данных внутри корзины Amazon S3 называется объектом. Мы можем выполнять несколько операций с объектами, таких как загрузка, перечисление, загрузка, копирование, перемещение, переименование и удаление.

6.1. Загрузка объектов

Загрузка объекта — довольно простой процесс. Мы будем использовать метод putObject() , который принимает три параметра:

  1. BucketName : имя корзины, в которую мы хотим загрузить объект.
  2. key : это полный путь к файлу
  3. file : Фактический файл, содержащий данные для загрузки
s3client.putObject(
bucketName,
"Document/hello.txt",
new File("/Users/user/Document/hello.txt")
);

6.2. Список объектов

Мы будем использовать метод listObjects() для вывода списка всех доступных объектов в нашей корзине S3:

ObjectListing objectListing = s3client.listObjects(bucketName);
for(S3ObjectSummary os : objectListing.getObjectSummaries()) {
LOG.info(os.getKey());
}

Вызов метода listObjects () объекта s3client даст объект ObjectListing , который можно использовать для получения списка всех сводок объектов в указанном сегменте. Здесь мы просто печатаем ключ, но также доступны несколько других параметров, таких как размер, владелец, последнее изменение, класс хранения и т. д.

Теперь это напечатает список всех объектов внутри нашего ведра:

Document/hello.txt

6.3. Загрузка объекта

Чтобы загрузить объект, мы сначала воспользуемся методом getObject() на s3client, который вернет объект S3Object . Как только мы получим это, мы вызовем для него getObjectContent() , чтобы получить объект S3ObjectInputStream , который ведет себя как обычный Java InputStream:

S3Object s3object = s3client.getObject(bucketName, "picture/pic.png");
S3ObjectInputStream inputStream = s3object.getObjectContent();
FileUtils.copyInputStreamToFile(inputStream, new File("/Users/user/Desktop/hello.txt"));

Здесь мы используем метод FileUtils.copyInputStreamToFile() от Apache Commons. Мы также можем посетить эту статью ForEach , чтобы изучить другие способы преобразования InputStream в файл.

6.4. Копирование, переименование и перемещение объекта

Мы можем скопировать объект, вызвав метод copyObject() в нашем s3client, который принимает четыре параметра:

  1. имя корзины источника
  2. ключ объекта в исходном сегменте
  3. имя корзины назначения (оно может совпадать с исходным)
  4. ключ объекта в сегменте назначения
s3client.copyObject(
"foreach-bucket",
"picture/pic.png",
"foreach-bucket2",
"document/picture.png"
);

Примечание. Мы можем использовать комбинацию методов copyObject() и deleteObject() для выполнения задач перемещения и переименования. Это потребует сначала скопировать объект, а затем удалить его из старого местоположения.

6.5. Удаление объекта

Чтобы удалить объект, мы вызовем метод deleteObject() на s3client и передадим имя корзины и ключ объекта:

s3client.deleteObject("foreach-bucket","picture/pic.png");

6.6. Удаление нескольких объектов

Чтобы удалить сразу несколько объектов, мы сначала создадим объект DeleteObjectsRequest и передадим имя корзины в его конструктор. Затем мы передадим массив всех ключей объектов, которые мы хотим удалить.

Получив этот объект DeleteObjectsRequest , мы можем передать его методу deleteObjects() нашего s3client в качестве аргумента. В случае успеха он удалит все объекты, которые мы предоставили:

String objkeyArr[] = {
"document/hello.txt",
"document/pic.png"
};

DeleteObjectsRequest delObjReq = new DeleteObjectsRequest("foreach-bucket")
.withKeys(objkeyArr);
s3client.deleteObjects(delObjReq);

7. Заключение

В этой статье мы сосредоточились на основах взаимодействия с веб-сервисом Amazon S3 как на уровне корзины, так и на уровне объекта.

Как всегда, полную реализацию этой статьи можно найти на Github .