S3
Amazon S3 es el almacén de objetos predeterminado para servicios de Python en AWS. boto3 maneja subidas, descargas, streaming y URLs pre-firmadas para acceso desde el navegador o socios sin necesidad de reenviar bytes a través de tu API.
Receta
import boto3
s3 = boto3.client("s3")
s3.upload_file("report.csv", "my-bucket", "exports/report.csv")
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": "my-bucket", "Key": "exports/report.csv"},
ExpiresIn=3600,
)Cuándo usar esto:
- Almacenamiento duradero de archivos para exportaciones, subidas, artefactos de ML
- URLs pre-firmadas para subida/descarga directa desde el navegador
- Streaming de objetos grandes sin cargarlos en memoria
- Políticas de ciclo de vida gestionadas en IaC; el código de la aplicación lee/escribe objetos
Ejemplo de Trabajo
Subir con argumentos adicionales, descargar a una ruta y transmitir el cuerpo con un gestor de contexto.
import boto3
from pathlib import Path
BUCKET = "demo-app-data"
KEY = "incoming/data.json"
LOCAL = Path("data.json")
s3 = boto3.client("s3")
s3.upload_file(
str(LOCAL),
BUCKET,
KEY,
ExtraArgs={"ContentType": "application/json", "ServerSideEncryption": "AES256"},
)
s3.download_file(BUCKET, KEY, "downloaded.json")
resp = s3.get_object(Bucket=BUCKET, Key=KEY)
body = resp["Body"].read()
print(len(body))
presigned = s3.generate_presigned_url(
"put_object",
Params={"Bucket": BUCKET, "Key": "incoming/upload.bin"},
ExpiresIn=900,
)
print(presigned[:80], "...")Lo que esto demuestra:
ExtraArgsestablece el tipo de contenido y la SSE en la subidaget_objectdevuelve unBodyde streaming; usa.read()o itera sobre los fragmentosput_objectpre-firmado permite subidas desde el cliente sin compartir claves IAM
Profundización
Cómo Funciona
- Los objetos residen en buckets bajo claves (las rutas son convencionales, no carpetas reales)
upload_file/download_fileusan transferencias multipartes para archivos grandes automáticamentegenerate_presigned_urlfirma las solicitudes con las credenciales del llamador; limita el alcance de IAM de forma estricta- El versionado y la eliminación con MFA son configuraciones del bucket; manéjalas en IaC
Operaciones Comunes
| Tarea | API |
|---|---|
| Subir archivo | upload_file, put_object |
| Descargar | download_file, get_object |
| Listar prefijo | list_objects_v2 + paginador |
| Eliminar | delete_object, delete_objects |
Notas de Python
from boto3.s3.transfer import TransferConfig
config = TransferConfig(multipart_threshold=8 * 1024 * 1024, max_concurrency=10)
s3.upload_file("big.bin", "bucket", "big.bin", Config=config)Errores Comunes
- Buckets públicos por error - ACL
public-readexpone datos. Solución: bloquea el acceso público a nivel de cuenta; usa URLs pre-firmadas. - Cargar objetos de varios GB con
.read()- Agota la memoria (OOM). Solución:iter_chunks()odownload_filea disco. - URLs pre-firmadas con caducidad excesiva - la URL filtrada funciona durante días. Solución: TTL corto (15-60 min) y prefijo de clave de mínimo privilegio.
- Asumir que
list_objectsestá completo - truncado sin paginación. Solución: paginador. - Cliente de región incorrecta - errores de redirección permanente. Solución: búsqueda de la región del bucket o sesión con ámbito de región.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| EFS/EBS | Se necesitan semánticas de sistema de archivos POSIX | Entrega global de objetos duraderos |
| CloudFront + S3 | Entrega pública o firmada por CDN | Artefactos internos solo privados |
| MinIO / on-prem | Requisito no AWS | Ya en AWS con cumplimiento para S3 |
Preguntas Frecuentes
¿upload_file vs put_object?
upload_file maneja multipartes y reintentos desde una ruta. put_object envía bytes que ya tienes en memoria.
¿Cómo subo desde FastAPI?
Acepta la subida, transmite a un archivo temporal o upload_fileobj; nunca almacenes en el disco de la aplicación en producción sin límites de tamaño.
¿Puedo forzar el cifrado?
Sí: la política del bucket deniega las subidas no cifradas; establece ServerSideEncryption en ExtraArgs.
¿Cómo elimino muchas claves?
delete_objects con lotes de hasta 1000 claves por llamada.
¿Qué tipo de contenido debo establecer?
Coincide con los bytes reales (application/json, image/png) para que los navegadores y las herramientas manejen los objetos correctamente.
¿Cómo funcionan las subidas PUT pre-firmadas?
Tu API devuelve una URL pre-firmada; el cliente realiza una PUT HTTP del archivo directamente a S3, lo que ahorra ancho de banda de la API.
¿Cómo pruebo sin AWS?
moto o LocalStack para pruebas unitarias; bucket de sandbox para pruebas de integración.
¿S3 garantiza la consistencia de lectura después de escritura?
Las nuevas subidas de objetos tienen consistencia de lectura después de escritura; las semánticas de LIST y sobrescritura tienen matices; consulta la documentación de AWS para tu caso de uso.
¿Cómo copio entre buckets?
copy_object con un diccionario CopySource; las copias dentro de la misma región son eficientes.
¿Cuáles son los permisos IAM mínimos?
Limita el alcance a arn:aws:s3:::bucket/prefix/* con s3:GetObject, PutObject, DeleteObject según sea necesario; no uses s3:* sobre *.
Relacionado
- Conceptos básicos de boto3 - sesiones y clientes
- Reintentos, Paginación y Limitación - paginación de listas
- Lambda - disparadores de eventos S3
- Patrones de Credenciales y Sesiones - IAM con ámbito limitado
- Mejores Prácticas de SDK en la Nube - acceso seguro a S3
Versiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.