Saltar al contenido principal

AWS SDK S3

Instalación​

cargo add aws-config aws-sdk-s3
  • En versiones anteriores se utilizaba la flag behavior-version-latest para poder utilizar aws_config::load_from_env() que es una función que está deprecada, en su lugar se utiliza aws_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=auto para Cloudflare R2
  • BUCKET no 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 infer para conocer fácilmente el content type.
  • Tip: para archivos pequeños puede ser util usar body.collect() pero para archivos grandes es mejor utilizar o consumir el stream.