S3 клиент
Экспериментальный модуль
Эксперементальный модуль является полностью рабочим и протестированным, но не гарантирует полностью стабилизированный API и может притерпеть какие либо незначительные изменения перед полной готовностью.
Модуль предоставляет тонкий слой абстракции для создания S3-клиентов с помощью аннотаций в декларативном стиле, либо использование клиентов в императивном стиле для работы с хранилищем S3.
AWS¶
Реализация S3-клиента основанная на библиотеке AWS.
Для работы и внедрения доступны компоненты:
- Императивные Kora S3 клиенты
S3Client
синхронный AWS S3 клиентS3AsyncClient
асинхронный AWS S3 клиентS3AsyncClient
с тегом@Tag(MultipartUpload.class)
асинхронный AWS S3 клиент для пакетной загрузки
Подключение¶
Зависимость build.gradle
:
Модуль:
Зависимость build.gradle.kts
:
Модуль:
Требуется подключить любой модуль HTTP-клиента.
Конфигурация¶
Пример полной конфигурации, описанной в классе AwsS3ClientConfig
и S3Config
(указаны примеры значений или значения по умолчанию):
s3client {
aws {
addressStyle = "PATH" //(1)!
requestTimeout = "45s" //(2)!
checksumValidationEnabled = false //(3)!
chunkedEncodingEnabled = true //(4)!
upload {
bufferSize = "32MiB" //(5)!
partSize = "8MiB" //(6)!
}
}
url = "http://localhost:9000" //(7)!
accessKey = "someKey" //(8)!
secretKey = "someSecret" //(9)!
region = "aws-global" //(10)!
telemetry {
logging {
enabled = false //(11)!
}
metrics {
enabled = true //(12)!
slo = [ 1, 10, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000, 60000, 90000 ] //(13)!
}
tracing {
enabled = true //(14)!
}
}
}
- Какой тип доступа к файлам использовать, может иметь значения
PATH
илиVIRTUAL_HOSTED
- Максимальное время выполнения операции
- Проверять ли контрольную суммы MD5 файлов перед загрузкой и при получении из AWS
- Кодировать ли в виде кусков при подписании данных файла при загрузке в AWS
- Максимальный размер буфера при загрузке файлов (указывается как число в байтах / либо как
4MiB
/4MB
/1000Kb
и тп) - Максимальный размер кусочка файла при единовременной загрузке файла (указывается как число в байтах / либо как
4MiB
/4MB
/1000Kb
и тп) - URL хранилища S3
- Ключ доступа к S3
- Секрет доступа к S3
- Регион хранилища S3
- Включает логгирование модуля (по умолчанию
false
) - Включает метрики модуля (по умолчанию
true
) - Настройка SLO для DistributionSummary метрики
- Включает трассировку модуля (по умолчанию
true
)
s3client:
aws:
addressStyle: "PATH" #(1)!
requestTimeout: "45s" #(2)!
checksumValidationEnabled: false #(3)!
chunkedEncodingEnabled: true #(4)!
upload:
bufferSize: "32MiB" #(5)!
partSize: "8MiB" #(6)!
url: "http://localhost:9000" #(7)!
accessKey: "someKey" #(8)!
secretKey: "someSecret" #(9)!
region: "aws-global" #(10)!
telemetry:
logging:
enabled: false #(11)!
metrics:
enabled: true #(12)!
slo: [ 1, 10, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000, 60000, 90000 ] #(13)!
telemetry:
enabled: true #(14)!
- Какой тип доступа к файлам использовать, может иметь значения
PATH
илиVIRTUAL_HOSTED
- Максимальное время выполнения операции
- Проверять ли контрольную суммы MD5 файлов перед загрузкой и при получении из AWS
- Кодировать ли в виде кусков при подписании данных файла при загрузке в AWS
- Максимальный размер буфера при загрузке файлов (указывается как число в байтах / либо как
4MiB
/4MB
/1000Kb
и тп) - Максимальный размер кусочка файла при единовременной загрузке файла (указывается как число в байтах / либо как
4MiB
/4MB
/1000Kb
и тп) - URL хранилища S3
- Ключ доступа к S3
- Секрет доступа к S3
- Регион хранилища S3
- Включает логгирование модуля (по умолчанию
false
) - Включает метрики модуля (по умолчанию
true
) - Настройка SLO для DistributionSummary метрики
- Включает трассировку модуля (по умолчанию
true
)
Формат ответа¶
В случае использование AWS модуля, есть возможность получать специальные форматы ответа специфичные только AWS библиотеке:
Minio¶
Реализация S3-клиента основанная на библиотеке Minio. Учитывайте что реализация использует OkHttp написанный на Kotlin и использует соответствующие зависимости.
Для работы и внедрения доступны компоненты:
- Императивные Kora S3 клиенты
MinioClient
синхронный Minio S3 клиентMinioAsyncClient
асинхронный Minio S3 клиент
Подключение¶
Зависимость build.gradle
:
Модуль:
Зависимость build.gradle.kts
:
Модуль:
Можно подключить OkHttp модуль либо будет создан стандартный HTTP-клиент.
Конфигурация¶
Пример полной конфигурации, описанной в классе MinioS3ClientConfig
и S3Config
(указаны примеры значений или значения по умолчанию):
s3client {
minio {
addressStyle = "PATH" //(1)!
requestTimeout = "45s" //(2)!
upload {
partSize = "8MiB" //(3)!
}
}
url = "http://localhost:9000" //(4)!
accessKey = "someKey" //(5)!
secretKey = "someSecret" //(6)!
region = "aws-global" //(7)!
telemetry {
logging {
enabled = false //(8)!
}
metrics {
enabled = true //(9)!
slo = [ 1, 10, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000, 60000, 90000 ] //(10)!
}
tracing {
enabled = true //(11)!
}
}
}
- Какой тип доступа к файлам использовать, может иметь значения
PATH
илиVIRTUAL_HOSTED
- Максимальное время выполнения операции
- Максимальный размер кусочка файла при единовременной загрузке файла (указывается как число в байтах / либо как
4MiB
/4MB
/1000Kb
и тп) - URL хранилища S3
- Ключ доступа к S3
- Секрет доступа к S3
- Регион хранилища S3
- Включает логгирование модуля (по умолчанию
false
) - Включает метрики модуля (по умолчанию
true
) - Настройка SLO для DistributionSummary метрики
- Включает трассировку модуля (по умолчанию
true
)
s3client:
minio:
addressStyle: "PATH" #(1)!
requestTimeout: "45s" #(1)!
upload:
partSize: "8MiB" #(2)!
url: "http://localhost:9000" #(3)!
accessKey: "someKey" #(4)!
secretKey: "someSecret" #(5)!
region: "aws-global" #(6)!
telemetry:
logging:
enabled: false #(7)!
metrics:
enabled: true #(8)!
slo: [ 1, 10, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000, 60000, 90000 ] #(9)!
telemetry:
enabled: true #(10)!
- Какой тип доступа к файлам использовать, может иметь значения
PATH
илиVIRTUAL_HOSTED
- Максимальное время выполнения операции
- Максимальный размер кусочка файла при единовременной загрузке файла (указывается как число в байтах / либо как
4MiB
/4MB
/1000Kb
и тп) - URL хранилища S3
- Ключ доступа к S3
- Секрет доступа к S3
- Регион хранилища S3
- Включает логгирование модуля (по умолчанию
false
) - Включает метрики модуля (по умолчанию
true
) - Настройка SLO для DistributionSummary метрики
- Включает трассировку модуля (по умолчанию
true
)
Клиент декларативный¶
Предлагается использовать специальные аннотации для создания декларативного клиента:
@S3.Client
— указывает что интерфейс является декларативным S3-клиентом@S3.Get
— указывает что метод выполняет операцию получения файла/метаданных@S3.List
— указывает что метод выполняет операцию получения списка файлов/метаданных@S3.Put
— указывает что метод выполняет операцию добавления файла@S3.Delete
— указывает что метод выполняет операцию удаления файла
Конфигурация клиента¶
Конфигурация конкретной реализации @S3.Client
:
Пример конфигурации в случае пути s3client.someClient
описанной в классе S3ClientConfig
:
Получение файла¶
Секция описывает операцию получения файла/метаданных с помощью декларативного S3-клиента.
Предлагается использовать аннотацию @S3.Get
для указания операции.
Метаданные¶
Операция получения файла по ключу может возвращать как полный файл вместе с данными S3Object
,
так и облегченный вариант в виде метаданных файла без данных S3ObjectMeta
,
такой метод значительно выполняется быстрее тк не возвращает данные файла.
Шаблон ключа¶
Ключ можно указывать также как шаблон и подставлять туда аргументы метода как части шаблона, все аргументы метода должны быть частью составного ключа.
@S3.Client("s3client.someClient")
public interface SomeClient {
@S3.Get("prefix-{key1}-{key2}-suffix") //(1)!
S3Object operation(String key1, int key2); //(2)!
}
- Шаблон по которому собирать шаблон ключа, каждый аргумент шаблона будет подставлен через
toString()
, аргументы в шаблоне указывается как имена аргументов метода в{ковычках}
- Все аргументы метода должны быть частью шаблона ключа
@S3.Client("s3client.someClient")
interface SomeClient {
@S3.Get("prefix-{key1}-{key2}-suffix") //(1)!
fun operation(key1: String, key2: Int): S3Object //(2)!
}
- Шаблон по которому собирать шаблон ключа, каждый аргумент шаблона будет подставлен через
toString()
, аргументы в шаблоне указывается как имена аргументов метода в{ковычках}
- Все аргументы метода должны быть частью шаблона ключа
Множество ключей¶
Можно также получать сразу множество файлов по ключам как полный файл вместе с данными S3Object
,
так и облегченный вариант в виде множества метаданных файлов без данных S3ObjectMeta
.
Перечисление файлов¶
Секция описывает операцию получения списка файлов/метаданных с помощью декларативного S3-клиента.
Предлагается использовать аннотацию @S3.List
для указания операции.
Можно указывать префикс ключа, чтобы делать выборку по нужным ключам подходящим под префикс,
также можно указывать ограничение по выборке файлов, максимальное количество файлов для операции 1000
:
@S3.Client("s3client.someClient")
public interface SomeClient {
@S3.List
S3ObjectList operation1(String prefix); //(1)!
@S3.List("some-prefix-") //(2)!
S3ObjectList operation2();
@S3.List(limit = 100) //(3)!
S3ObjectList operation3();
}
- Префикс можно передать как аргумент метода, если он не указан в аннотации
- Префикс можно указать в аннотации
- Можно указывать ограничение по выборке файлов для операции перечисления, максимальное количество файлов для операции
1000
:
@S3.Client("s3client.someClient")
interface SomeClient {
@S3.List
fun operation1(prefix: String): S3ObjectList //(1)!
@S3.List("some-prefix-") //(2)!
fun operation2(): S3ObjectList
@S3.List(limit = 100) //(3)!
fun operation3(): S3ObjectList
}
- Префикс можно передать как аргумент метода, если он не указан в аннотации
- Префикс можно указать в аннотации
- Можно указывать ограничение по выборке файлов для операции перечисления, максимальное количество файлов для операции
1000
:
Метаданные¶
Операция получения файла по ключу может возвращать как полный файл вместе с данными S3ObjectList
,
так и облегченный вариант в виде метаданных файла без данных S3ObjectMetaList
,
такой метод значительно выполняется быстрее тк не возвращает данные файла.
Шаблон префикса¶
Префикс можно указывать также как шаблон и подставлять туда аргументы метода как части шаблона, все аргументы метода должны быть частью составного ключа.
@S3.Client("s3client.someClient")
public interface SomeClient {
@S3.List("prefix-{key1}-{key2}-") //(1)!
S3ObjectList operation(String key1, int key2);
}
- Шаблон по которому собирать шаблон префикса, каждый аргумент шаблона будет подставлен через
toString()
, аргументы в шаблоне указывается как имена аргументов метода в{ковычках}
@S3.Client("s3client.someClient")
interface SomeClient {
@S3.List("prefix-{key1}-{key2}-") //(1)!
fun operation(key1: String, key2: Int): S3ObjectList
}
- Шаблон по которому собирать шаблон префикса, каждый аргумент шаблона будет подставлен через
toString()
, аргументы в шаблоне указывается как имена аргументов метода в{ковычках}
Разделитель¶
Можно указывать разделитель для префикса ключа, исключать нужные файлы из выборки:
Добавление файла¶
Секция описывает операцию добавления файла с помощью декларативного S3-клиента.
Предлагается использовать аннотацию @S3.Put
для операции.
Требуется указать ключ и тело файла для добавления:
@S3.Client("s3client.someClient")
public interface SomeClient {
@S3.Put
void operation1(String key, //(1)!
S3Body body); //(2)!
@S3.Put("some-key") //(3)!
S3ObjectUpload operation2(S3Body body);
}
- Ключ файла по которому он будет добавлен в хранилище
- Само тело файла которое будет добавлено в хранилище
- Ключ также можно указать в аннотации если он статичен
@S3.Client("s3client.someClient")
interface SomeClient {
@S3.Put
fun operation(key: String, body: S3Body)
@S3.Put("some-key")
fun operation(body: S3Body): S3ObjectUpload
}
- Ключ файла по которому он будет добавлен в хранилище
- Само тело файла которое будет добавлено в хранилище
- Ключ также можно указать в аннотации если он статичен
Тело файла¶
Тело файла (S3Body
) может быть создано из byte[]
/ ByteBuffer
/ InputStream
/ Flow.Publisher<ByteBuffer>
через соответсвующее статические методы конструкторы.
Если файл очень большой либо не известна его длина и требуется потоковая загрузка, то рекомендуется создавать тело с помощь S3Body.ofPublisher()
либо S3Body.ofInputStreamUnbound()
.
В случае если не будет указан тип файла, он будет проставлен как application/octet-stream
.
Шаблон ключа¶
Ключ можно указывать также как шаблон и подставлять туда аргументы метода как части шаблона, все аргументы метода должны быть частью составного ключа.
@S3.Client("s3client.someClient")
public interface SomeClient {
@S3.Put("prefix-{key1}-{key2}-suffix") //(1)!
void operation(String key1, int key2, S3Body body); //(2)!
}
- Шаблон по которому собирать шаблон ключа, каждый аргумент шаблона будет подставлен через
toString()
, аргументы в шаблоне указывается как имена аргументов метода в{ковычках}
- Все аргументы метода должны быть частью шаблона ключа либо
S3Body
@S3.Client("s3client.someClient")
interface SomeClient {
@S3.Put("prefix-{key1}-{key2}-suffix") //(1)!
fun operation(key1: String, key2: Int, body: S3Body) //(2)!
}
- Шаблон по которому собирать шаблон ключа, каждый аргумент шаблона будет подставлен через
toString()
, аргументы в шаблоне указывается как имена аргументов метода в{ковычках}
- Все аргументы метода должны быть частью шаблона ключа либо
S3Body
Удаление файла¶
Секция описывает операцию удаление файла с помощью декларативного S3-клиента.
Предлагается использовать аннотацию @S3.Delete
для операции.
Шаблон ключа¶
Ключ можно указывать также как шаблон и подставлять туда аргументы метода как части шаблона, все аргументы метода должны быть частью составного ключа.
@S3.Client("s3client.someClient")
public interface SomeClient {
@S3.Delete("prefix-{key1}-{key2}-suffix") //(1)!
void operation(String key1, int key2); //(2)!
}
- Шаблон по которому собирать шаблон ключа, каждый аргумент шаблона будет подставлен через
toString()
, аргументы в шаблоне указывается как имена аргументов метода в{ковычках}
- Все аргументы метода должны быть частью шаблона ключа
@S3.Client("s3client.someClient")
interface SomeClient {
@S3.Delete("prefix-{key1}-{key2}-suffix") //(1)!
fun operation(key1: String, key2: Int) //(2)!
}
- Шаблон по которому собирать шаблон ключа, каждый аргумент шаблона будет подставлен через
toString()
, аргументы в шаблоне указывается как имена аргументов метода в{ковычках}
- Все аргументы метода должны быть частью шаблона ключа
Множество ключей¶
Можно также получать сразу множество файлов по ключам как полный файл вместе с данными S3Object
,
так и облегченный вариант в виде множества метаданных файлов без данных S3ObjectMeta
.
Сигнатуры¶
Доступные сигнатуры для методов декларативного HTTP клиента из коробки:
Под T
подразумевается тип возвращаемого значения, либо Void
.
T myMethod()
CompletionStage<T> myMethod()
CompletionStageMono<T> myMethod()
Project Reactor (надо подключить зависимость)
Под T
подразумевается тип возвращаемого значения, либо Unit
.
myMethod(): T
suspend myMethod(): T
Kotlin Coroutine (надо подключить зависимость какimplementation
)
Клиент императивный¶
Можно внедрить императивный Kora клиента для работы с S3, предоставляется как клиент для синхронной так и асинхронной работы:
S3KoraClient
- клиент для синхронной работыS3KoraAsyncClient
- клиент для асинхронной работы
Ошибки¶
В случае ошибки работы клиента будут брошены специальные ошибки:
S3NotFoundException
- в случае если не найдет файл по указанному ключуS3DeleteException
- в случае ошибки удаления файлаS3Exception
- в любом другом случае