| Crates.io | s3 |
| lib.rs | s3 |
| version | 0.1.8 |
| created_at | 2026-01-05 16:46:53.051431+00 |
| updated_at | 2026-01-12 06:47:50.986779+00 |
| description | A lean, modern, unofficial S3-compatible client for Rust. |
| homepage | https://github.com/lvillis/s3-rs |
| repository | https://github.com/lvillis/s3-rs |
| max_upload_size | |
| id | 2024217 |
| size | 607,464 |
Lean, modern, unofficial S3-compatible client for Rust.
# async + rustls (default)
cargo add s3
# blocking (disable defaults, pick one TLS backend)
cargo add s3 --no-default-features --features blocking,rustls
# async + native-tls
cargo add s3 --no-default-features --features async,native-tls
MSRV: Rust 1.92.
use s3::{Auth, Client};
# async fn demo() -> Result<(), s3::Error> {
let client = Client::builder("https://s3.example.com")?
.region("us-east-1")
.auth(Auth::from_env()?)
.build()?;
let obj = client.objects().get("my-bucket", "path/to/object.txt").send().await?;
let bytes = obj.bytes().await?;
println!("{} bytes", bytes.len());
# Ok(())
# }
Auth::from_env() reads AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and optionally AWS_SESSION_TOKEN.
use s3::{Auth, BlockingClient};
fn demo() -> Result<(), s3::Error> {
let client = BlockingClient::builder("https://s3.example.com")?
.region("us-east-1")
.auth(Auth::from_env()?)
.build()?;
let obj = client.objects().get("my-bucket", "path/to/object.txt").send()?;
let bytes = obj.bytes()?;
println!("{} bytes", bytes.len());
Ok(())
}
use std::time::Duration;
use s3::{AddressingStyle, Auth, Client};
# async fn demo() -> Result<(), s3::Error> {
let client = Client::builder("https://s3.example.com")?
.region("us-east-1")
.auth(Auth::from_env()?)
.addressing_style(AddressingStyle::Auto)
.timeout(Duration::from_secs(30))
.max_attempts(3)
.build()?;
# Ok(())
# }
use s3::{Auth, Client};
# async fn demo() -> Result<(), s3::Error> {
let client = Client::builder("https://s3.example.com")?
.region("us-east-1")
.auth(Auth::from_env()?)
.build()?;
let presigned = client
.objects()
.presign_get("my-bucket", "path/to/object.txt")
.build()?;
println!("GET {}", presigned.url);
# Ok(())
# }
providers)use s3::{Auth, providers};
# async fn demo() -> Result<(), s3::Error> {
let preset = providers::minio_local();
let client = preset
.async_client_builder()?
.auth(Auth::from_env()?)
.build()?;
# Ok(())
# }
Auth::Anonymous: unsigned requests (for public buckets / anonymous endpoints)Auth::from_env(): static credentials from env varsAuth::provider(...): plug in your own refreshable provider (cached/singleflight refresh)credentials-profile: shared config/profile loadercredentials-imds: IMDS credentials (async/blocking APIs)credentials-sts: web identity / STS flowsAddressingStyle::Auto (default), Path, VirtualHostedasync (default), blockingrustls (default), native-tlsmultipart, checksums, providers, credentials-profile, credentials-imds, credentials-sts, tracing, metricsexamples/async_put_get_delete.rsexamples/async_put_stream.rsexamples/async_list_objects.rsmultipart): examples/async_multipart_upload.rsexamples/presign_get.rs, examples/async_presign_build_async.rsexamples/blocking_put_get_delete.rsexamples/README.md