Добавить в корзинуПозвонить
Найти в Дзене
Один Rust не п...Rust

Rust и Amazon S3

t.me/oneRustnoqRust ✅ Загружает файлы в S3 (AWS) и MinIO (альтернативное S3-хранилище).
✅ Поддерживает асинхронную загрузку файлов с высокой производительностью.
✅ Оптимизировано с tokio и rayon для конкурентного выполнения.
✅ Работает с AWS SDK и прямыми HTTP-запросами для максимальной гибкости.
✅ Реализует кастомную систему подписей для прямых S3-запросов. Для чего нужна данная статья? : Amazon предлагает официальный SDK для Rust – aws-sdk-s3, который поддерживает все возможности S3, включая загрузку, скачивание, управление объектами и ведение версий. use aws_sdk_s3::{Client, Config, Region}; use aws_types::credentials::Credentials; use tokio; #[tokio::main] async fn main() -> Result<(), aws_sdk_s3::Error> { let config = Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::from_keys( "ACCESS_KEY", "SECRET_KEY", None, )) .build(); let client = Client::from_conf(config); let resp = client.list_buckets().send().await?; for bucket in resp.buckets().unwra
Оглавление
GitHub - nicktretyakov/s3-ml-uploader
ML на RUST без заморочек

t.me/oneRustnoqRust

Зачем Вам это уметь? :

🔥 Написать приложение которое:

✅ Загружает файлы в S3 (AWS) и MinIO (альтернативное S3-хранилище).
✅ Поддерживает асинхронную загрузку файлов с высокой производительностью.
✅ Оптимизировано с tokio и rayon для конкурентного выполнения.
✅ Работает с AWS SDK и прямыми HTTP-запросами для максимальной гибкости.
✅ Реализует кастомную систему подписей для прямых S3-запросов.

Для чего нужна данная статья? :

Выбрать компромиссы между:

1. Официальный AWS SDK для Rust

Amazon предлагает официальный SDK для Rust – aws-sdk-s3, который поддерживает все возможности S3, включая загрузку, скачивание, управление объектами и ведение версий.

Использование:

use aws_sdk_s3::{Client, Config, Region};

use aws_types::credentials::Credentials;

use tokio;

#[tokio::main]

async fn main() -> Result<(), aws_sdk_s3::Error> {

let config = Config::builder()

.region(Region::new("us-east-1"))

.credentials_provider(Credentials::from_keys(

"ACCESS_KEY",

"SECRET_KEY",

None,

))

.build();

let client = Client::from_conf(config);

let resp = client.list_buckets().send().await?;

for bucket in resp.buckets().unwrap_or_default() {

println!("Bucket: {}", bucket.name().unwrap());

}

Ok(())

}

Плюсы:

  • Официальная поддержка от Amazon.
  • Полная совместимость со всеми возможностями S3.

Минусы:

  • SDK пока ещё в бета-версии.
  • Может быть избыточным для простых задач.

2. S3-Compatible API (minio, wasabi, etc.) через s3

Если нужен более лёгкий вариант или совместимость с S3-совместимыми сервисами (MinIO, Wasabi, DigitalOcean Spaces), можно использовать s3.

Использование:

use s3::bucket::Bucket;

use s3::credentials::Credentials;

use s3::region::Region;

#[tokio::main]

async fn main() {

let credentials = Credentials::new(Some("ACCESS_KEY"), Some("SECRET_KEY"), None, None, None).unwrap();

let region = Region::Custom {

region: "us-east-1".to_string(),

endpoint: "https://s3.amazonaws.com".to_string(),

};

let bucket = Bucket::new("my-bucket", region, credentials).unwrap();

let (data, code) = bucket.get_object("/path/to/file.txt").await.unwrap();

println!("Response Code: {}, Data: {:?}", code, String::from_utf8_lossy(&data));

}

Плюсы:

  • Простота в использовании.
  • Лёгкость и поддержка альтернативных S3-хранилищ.

Минусы:

  • Меньше возможностей, чем у официального SDK.
  • Требуется вручную указывать URL для кастомных хранилищ.

3. Прямой HTTP-запрос через reqwest

Если нужна максимальная кастомизация без зависимостей на сторонние библиотеки, можно делать запросы напрямую через reqwest.

Использование:

use reqwest::Client;

use std::env;

#[tokio::main]

async fn main() -> Result<(), reqwest::Error> {

let client = Client::new();

let url = "https://s3.amazonaws.com/my-bucket/my-file.txt";

let response = client.get(url)

.header("Authorization", "Bearer YOUR_TOKEN")

.send()

.await?;

let body = response.text().await?;

println!("{}", body);

Ok(())

}

Плюсы:

  • Полный контроль над запросами.
  • Можно использовать любые хранилища без привязки к AWS SDK.

Минусы:

  • Нужно вручную подписывать запросы (AWS использует сложный механизм подписи AWS4-HMAC-SHA256).
  • Неудобно для работы с большими файлами.

4. Через rusoto_s3 (Устарело, но рабочий)

Библиотека rusoto_s3 была популярным вариантом, но устарела в пользу официального AWS SDK.

use rusoto_core::{Region, credential::StaticProvider};

use rusoto_s3::{S3, S3Client, ListBucketsRequest};

#[tokio::main]

async fn main() {

let credentials = StaticProvider::new_minimal("ACCESS_KEY".to_string(), "SECRET_KEY".to_string());

let client = S3Client::new_with(rusoto_core::request::HttpClient::new().unwrap(), credentials, Region::UsEast1);

let result = client.list_buckets(ListBucketsRequest {}).await.unwrap();

for bucket in result.buckets.unwrap() {

println!("{:?}", bucket.name.unwrap());

}

}

Плюсы:

  • Поддерживает старый код.

Минусы:

  • Библиотека устарела и больше не поддерживается.

5. Через FUSE (S3FS)

Если хочется монтировать S3 как файловую систему, можно использовать s3fs через libfuse.

s3fs my-bucket-name /mnt/s3 -o use_cache=/tmp,iam_role=auto

Плюсы:

  • Доступ к S3 как к обычной папке в ОС.
  • Работает с любым языком, включая Rust.

Минусы:

  • Сложнее настраивать на сервере.
  • Производительность ниже, чем у API.