AWS SDK S3
Instalación
cargo add aws-config aws-sdk-s3
- En versiones anteriores se utilizaba la flag
behavior-version-latestpara poder utilizaraws_config::load_from_env()que es una función que está deprecada, en su lugar se utilizaaws_config::load_defaults()que no requiere ninguna flag y es la que se recomienda.
Variables de entorno
AWS_ENDPOINT_URL=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=
BUCKET=
AWS_REGION=autopara Cloudflare R2BUCKETno es necesario por los crates instalados, pero es recomendable utilizar una variable de entorno por privacidad para no exponer el nombre del bucket en el código
Uso
use std::{env, fs};
use aws_config::BehaviorVersion;
use aws_sdk_s3::{self as s3, primitives::ByteStream};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenvy::dotenv().map_err(|_| "Error al leer o parsear el archivo .env")?;
// Crear cliente (no requiere ninguna flag)
let config = aws_config::load_defaults(BehaviorVersion::latest()).await;
let client = s3::Client::new(&config);
let bucket = env::var("BUCKET").map_err(|_| "BUCKET no definida")?;
// Descargar archivos
let get_object = client
.get_object()
.bucket(&bucket)
.key("images/example.avif")
.send()
.await?;
let bytes = get_object.body.collect().await?.into_bytes();
fs::write("resources/img.avif", bytes)?;
// Subir archivos
let file = ByteStream::from_path("resources/test.json").await?;
client
.put_object()
.bucket(&bucket)
.key("test.json")
.body(file)
.content_type("application/json")
.send()
.await?;
Ok(())
}
- Tip: si se espera subir diferentes tipos de archivos se puede utilizar el crate
inferpara conocer fácilmente elcontent type. - Tip: para archivos pequeños puede ser util usar
body.collect()pero para archivos grandes es mejor utilizar o consumir el stream.