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, нам понадобится несколько вещей:
- Учетная запись AWS: нам нужна учетная запись Amazon Web Services. Если у нас его нет, мы можем пойти дальше и создать учетную запись .
- Учетные данные безопасности AWS: это наши ключи доступа, которые позволяют нам выполнять программные вызовы действий AWS API. Мы можем получить эти учетные данные двумя способами: либо с помощью учетных данных корневой учетной записи AWS из раздела ключей доступа на странице «Учетные данные безопасности », либо с помощью учетных данных пользователя IAM из консоли IAM .
- Выбор региона 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()
, который принимает три параметра:
BucketName
: имя корзины, в которую мы хотим загрузить объект.key
: это полный путь к файлу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,
который принимает четыре параметра:
- имя корзины источника
- ключ объекта в исходном сегменте
- имя корзины назначения (оно может совпадать с исходным)
- ключ объекта в сегменте назначения
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 .