Arbeiten mit S3 und Cloud-Speichern in Rust: Die Bibliothek aws-sdk-s3

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit S3 und Cloud-Speichern in Rust: aws-sdk-s3



Cloud-Objektspeicher, die mit Amazon S3 kompatibel sind, sind zum De-facto-Standard für die Speicherung von Dateien, Backups, statischen Inhalten und Daten geworden. Im Rust-Ökosystem wird für die Arbeit mit S3 das offizielle AWS SDK für Rust verwendet — aws-sdk-s3. Dieses Tool ermöglicht nicht nur die Verbindung zu Amazon S3, sondern auch zu beliebigen S3-kompatiblen Speichern: MinIO, Yandex Object Storage, DigitalOcean Spaces, Cloudflare R2 und anderen.



Installation und Konfiguration



Fügen Sie die folgenden Abhängigkeiten zu Cargo.toml hinzu:



[dependencies]aws-sdk-s3 = "1.15"aws-config = "1.1"tokio = { version = "1", features = ["full"] }anyhow = "1.0"


Für die Authentifizierung können Sie Umgebungsvariablen, die AWS-Konfigurationsdatei (~/.aws/credentials) oder die programmatische Übergabe von Schlüsseln verwenden. Eine minimale Client-Initialisierung sieht wie folgt aus:



use aws_sdk_s3::Client;use aws_config::meta::region::RegionProviderChain;

#[tokio::main]async fn main() -> Result<(), anyhow::Error> { let region_provider = RegionProviderChain::default_provider() .or_else("ru-central1"); let config = aws_config::from_env() .region(region_provider) .load() .await; let client = Client::new(&config); // Danach arbeiten wir mit client Ok(())}


Grundlegende Operationen mit S3



Bucket erstellen



use aws_sdk_s3::model::BucketLocationConstraint;

let bucket_name = "my-rust-bucket";let constraint = BucketLocationConstraint::from("ru-central1");let _ = client .create_bucket() .bucket(bucket_name) .create_bucket_configuration( aws_sdk_s3::model::CreateBucketConfiguration::builder() .location_constraint(constraint) .build() ) .send() .await?;


Datei hochladen (PutObject)



use aws_sdk_s3::primitives::ByteStream;use std::path::Path;

let file_path = "local_file.txt";let body = ByteStream::from_path(Path::new(file_path)).await?;

client .put_object() .bucket(bucket_name) .key("uploads/remote_file.txt") .body(body) .send() .await?;println!("Datei hochgeladen");


Datei herunterladen (GetObject)



use tokio::io::AsyncWriteExt;

let resp = client .get_object() .bucket(bucket_name) .key("uploads/remote_file.txt") .send() .await?;

let mut file = tokio::fs::File::create("downloaded.txt").await?;let mut stream = resp.body;while let Some(chunk) = stream.try_next().await? { file.write_all(&chunk).await?;}println!("Datei heruntergeladen");


Objekte im Bucket auflisten



let objects = client    .list_objects_v2()    .bucket(bucket_name)    .prefix("uploads/")    .send()    .await?;

for obj in objects.contents().unwrap_or_default() { println!("- {}", obj.key().unwrap_or("unknown"));}


Verbindung zu MinIO und anderen S3-kompatiblen Speichern



Für die Arbeit mit MinIO (oder einem anderen Nicht-AWS-Speicher) müssen Sie den Endpunkt überschreiben und die Regionssignaturprüfung deaktivieren (falls erforderlich). Hier ist ein vollständiges Beispiel:



use aws_sdk_s3::{Client, Config, Credentials, Region};use aws_smithy_client::erase::DynConnector;use aws_smithy_client::hyper_ext;use http::Uri;

let creds = Credentials::new( "minioadmin", "minioadmin", None, None, "minio",);

let endpoint = Uri::from_static("http://localhost:9000");let region = Region::new("us-east-1");

let config = Config::builder() .credentials_provider(creds) .region(region) .endpoint_resolver(endpoint) .force_path_style(true) // Wichtig für MinIO .build();

let client = Client::from_conf(config);// Alle Operationen mit client laufen jetzt über MinIO


Beachten Sie

Empfehlungen