AWS S3 с Java

AWS S3 с Java

1. Вступление

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

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

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

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

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


    com.amazonaws
    aws-java-sdk
    1.11.163

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

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

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

  1. AWS Account: нам нужна учетная запись Amazon Web Services. Если у вас их все еще нет, продолжайте иcreate an account

  2. AWS Security Credentials:. Это наши ключи доступа, которые позволяют нам программно вызывать действия AWS API. Мы можем получить эти учетные данные двумя способами: либо с помощью учетных данных корневой учетной записи AWS из раздела ключей доступаhttps://console.aws.amazon.com/iam/home?security_credential[Security Credentials] page or by using IAM user credentials from https://console.aws.amazon.com/iam/home? [консоль IAM]

  3. Choosing AWS Region: Мы должны выбрать регион (ы) AWS, где мы хотим хранить наши данные Amazon S3. Имейте в виду, что цены на хранилище S3 варьируются в зависимости от региона. Для получения более подробной информации перейдите кofficial documentation. В этом руководстве мы будем использовать Восток США (Огайо) (регионus-east-2)

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

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

AWSCredentials credentials = new BasicAWSCredentials(
  "",
  ""
);

А затем настройте клиент:

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

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

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

Важно отметить, что пространство имен корзины используется всеми пользователями системы. So our bucket name must be unique across all existing bucket names in Amazon S3 (скоро мы узнаем, как это проверить).

Более того, как указано вthe official documentation, имена сегментов должны соответствовать следующим требованиям:

  • имена не должны содержать подчеркивания

  • имена должны быть длиной от 3 до 63 символов

  • имена не должны заканчиваться тире

  • имена не могут содержать соседние периоды

  • имена не могут содержать тире рядом с точками (например, «my-.bucket.com» и «my.-bucket» недопустимы)

  • имена не могут содержать заглавные буквы

Давайте создадим корзину:

String bucketName = "example-bucket";

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

s3client.createBucket(bucketName);

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

5.2. Список сегментов

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

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

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

example-bucket
example-bucket-test2
elasticbeanstalk-us-east-2

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

It’s important to ensure that our bucket is empty before we can delete it. В противном случае будет выдано исключение. Также обратите внимание, что только владелец группы может удалить ее независимо от ее разрешений (Политики контроля доступа):

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

6. Amazon S3 Object Operations

Файл или набор данных внутри корзины 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, который ведет себя как обычный JavaInputStream.

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. Вы также можете посетитьthis example article, чтобы изучить другие способы преобразованияInputStream вFile.

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

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

  1. имя источника

  2. ключ объекта в исходной корзине

  3. имя целевого сегмента (может совпадать с именем источника)

  4. ключ объекта в контейнере назначения

s3client.copyObject(
  "example-bucket",
  "picture/pic.png",
  "example-bucket2",
  "document/picture.png"
);

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

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

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

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

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

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

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

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

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

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

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

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