Objetivos de aprendizaje
Después de leer este artículo podrás:
- Entender qué es Amazon S3 y cómo funcionan buckets, objetos y claves
- Saber qué significa que un servicio sea compatible con S3 y dónde hay diferencias
- Conectar una aplicación a un almacenamiento compatible con S3 con boto3
Casi todo proyecto termina necesitando guardar archivos: fotos de perfil, adjuntos, exportaciones, logs. Dejarlos en el disco del servidor funciona hasta la primera vez que necesitas cambiar de máquina, tener más de una instancia o servirlo todo rápido. Ahí entra el almacenamiento de objetos, y casi siempre alguien dice "usa S3".
S3 se volvió tan común que el nombre dejó de significar un solo producto. "S3" también es una forma de hablar con el almacenamiento: una API que decenas de servicios implementan. Entender esa diferencia evita que quedes atado a un proveedor y explica por qué el mismo código funciona en lugares tan distintos.
¿Qué es Amazon S3?#
Amazon S3 (Simple Storage Service) es el servicio de almacenamiento de objetos de AWS. Guarda datos como objetos dentro de buckets. Un objeto es un archivo más sus metadatos (como Content-Type). Un bucket es el contenedor de los objetos. Para la base del concepto, lee qué es el almacenamiento de objetos.
Cada objeto tiene una clave, su identificador único dentro del bucket. Una clave como fotos/2026/gato.jpg parece una ruta de carpetas, pero el almacenamiento es plano: fotos/2026/ es solo parte del nombre (un prefijo). Para ver la diferencia con discos y carpetas compartidas, lee almacenamiento de objetos, de bloques y de archivos.
Cada objeto tiene una URL formada por el endpoint, el nombre del bucket y la clave, por ejemplo https://mi-bucket.s3.us-west-2.amazonaws.com/fotos/gato.jpg. Por defecto, buckets y objetos son privados: solo accede quien recibe permiso.
Algunos números de la documentación oficial, que conviene revisar antes de depender de ellos:
- Durabilidad diseñada de 99,999999999% (11 nueves) y disponibilidad de 99,99% al año en S3 Standard, con copias en al menos tres zonas de disponibilidad.
- Objetos de hasta 48,8 TiB, con subida multipart en hasta 10.000 partes de 5 MiB a 5 GiB.
- Consistencia fuerte de lectura tras escritura: después de un PUT exitoso, cualquier lectura o listado ya ve el dato nuevo.
¿Qué significa "compatible con S3"?#
S3 se usa mediante una API REST sobre HTTP. Todo SDK, el aws-cli y herramientas como rclone solo arman solicitudes con ese formato y las firman con un par de claves. Si otro servicio entiende las mismas solicitudes, es compatible con S3.
En la práctica, cambiar de proveedor se vuelve configuración:
- Cambia el endpoint: en vez de
s3.amazonaws.com, la dirección del otro servicio. - Las claves de acceso (access key y secret key) pasan a ser las del nuevo servicio.
- El código de subida, descarga, listado y borrado sigue igual.
Por eso las herramientas de respaldo, los CMS, las librerías de subida y los frameworks soportan S3 y, sin esfuerzo extra, cualquier servicio compatible. Lo inverso también vale: si escribes tu código para la API de S3, puedes cambiar de proveedor sin reescribir la aplicación.
¿Qué cambia entre S3 y un servicio compatible?#
"Compatible" no es "idéntico". La API de S3 es enorme y cada proveedor implementa un subconjunto. El núcleo suele existir en todos: crear bucket, PutObject, GetObject, ListObjectsV2, DeleteObject, subida multipart y URLs prefirmadas. Estos puntos varían, así que revisa la documentación del proveedor:
- Control de acceso: las políticas de bucket, IAM y ACL de S3 pueden no existir o comportarse distinto.
- Funciones avanzadas: versionado, Object Lock, replicación, notificaciones de eventos y reglas de ciclo de vida.
- Regiones y clases de almacenamiento: un proveedor pequeño puede tener una sola región y una sola clase.
- Límites: tamaño máximo de objeto, tamaño mínimo de parte en multipart, cantidad de buckets.
- Direccionamiento: algunos servicios aceptan el bucket en el host (
bucket.endpoint), otros solo en la ruta (endpoint/bucket). - Checksums: las versiones recientes de los SDK de AWS empezaron a calcular checksums por defecto, y algunos servicios compatibles aún no lo aceptan (mira el ejemplo más abajo).
¿Cómo conectas una aplicación a un almacenamiento compatible con S3?#
El ejemplo usa boto3, el SDK de AWS para Python. Instálalo con pip install boto3. El endpoint y las claves vienen de variables de entorno, nunca del código.
import os
import boto3
from botocore.config import Config
s3 = boto3.client(
"s3",
endpoint_url=os.environ["S3_ENDPOINT"],
aws_access_key_id=os.environ["S3_ACCESS_KEY"],
aws_secret_access_key=os.environ["S3_SECRET_KEY"],
region_name=os.environ.get("S3_REGION", "us-east-1"),
config=Config(
# "path" pone el bucket en la ruta de la URL; "virtual" lo pone en el host.
s3={"addressing_style": "path"},
# Firma SigV4, la versión actual, también en las URLs prefirmadas.
signature_version="s3v4",
# Desactiva los checksums automáticos de boto3 1.36+ para servicios
# que aún no los aceptan.
request_checksum_calculation="when_required",
response_checksum_validation="when_required",
),
)
bucket = os.environ["S3_BUCKET"]
s3.upload_file("informe.pdf", bucket, "informes/2026/informe.pdf") # subir
resp = s3.list_objects_v2(Bucket=bucket, Prefix="informes/") # listar
for obj in resp.get("Contents", []):
print(obj["Key"], obj["Size"])
url = s3.generate_presigned_url( # enlace temporal de descarga, 15 minutos
"get_object",
Params={"Bucket": bucket, "Key": "informes/2026/informe.pdf"},
ExpiresIn=900,
)
print(url)Cuatro puntos suelen dar problemas:
addressing_style: el valor por defecto (auto) deja que boto3 elija. Con AWS suele usar el estilo virtual; con unendpoint_urlpropio, las versiones actuales usan el de ruta. Dejarpathexplícito, como en el ejemplo, evita sorpresas; si el proveedor exige el bucket en el host, usavirtual. La documentación de boto3 describe los valoresauto,pathyvirtual.- Firma: en varios casos boto3 todavía genera URLs prefirmadas en el formato antiguo (SigV2).
signature_version="s3v4"fuerza SigV4, la versión actual, y muchos servicios compatibles solo aceptan esa. - Checksums: boto3 1.36 empezó a calcular checksums en las subidas por defecto. Si tu proveedor devuelve error en
PutObject,when_requiredrestaura el comportamiento anterior. Si acepta el nuevo, puedes quitar esas dos líneas. - Región: los servicios compatibles suelen ignorar la región, pero el SDK exige algún valor.
us-east-1es un valor habitual.
Lo mismo vale para el aws-cli, que acepta --endpoint-url, y para rclone, que tiene un tipo de remoto S3 con campo de endpoint. Para enlaces temporales, mira qué es una URL prefirmada. Para archivos grandes, mira cómo subir archivos grandes.
¿Cuándo usar S3 o un servicio compatible?#
El almacenamiento compatible con S3 sirve para imágenes y videos subidos por usuarios, adjuntos, exportaciones, copias de datos y archivos estáticos de un sitio. Sirve mal donde necesitas acceso de archivo común, como una base de datos corriendo sobre el disco, o escrituras pequeñas y frecuentes en el mismo archivo: ahí usa una base de datos o un volumen de bloques. Recuerda también que los objetos se reemplazan enteros, no se editan en el lugar, y que la latencia es la de una solicitud HTTP, no la de un disco local.
Al elegir entre Amazon y un servicio compatible, compara el precio de almacenamiento, solicitudes y salida de datos (mira tarifas de salida o egress), la región y las funciones que de verdad usas. Si tu código solo usa el núcleo de la API, cambiar después es barato.
Cómo hacerlo en Square Cloud#
El Blob Storage de Square Cloud es un servicio compatible con S3, y el código de este artículo funciona con él cambiando solo la configuración, como viste en la sección sobre compatibilidad: S3_ENDPOINT=https://s3-blob.squarecloud.app, S3_REGION=auto y las claves S3 que generas a partir de una API key en la pestaña "Acceso S3" del panel. Lo mismo vale para aws-cli con --endpoint-url, para rclone y para los SDK de AWS.
Antes de migrar, compara el Blob con la lista de lo que cambia entre proveedores. El endpoint admite List, Head, Get con Range, Put, Copy, Delete, multipart y URL prefirmadas SigV4 de hasta 7 días. Hay tres buckets fijos por cuenta: public, private y legacy (de solo lectura). Como no se crean buckets con nombre, usa S3_BUCKET=public o private y organiza los archivos por prefijo. Cada objeto puede pesar hasta 10 GB, y la subida multipart solo es obligatoria por encima de 100 MB. Además de la API S3, hay API REST y panel, con reglas por carpeta para visibilidad, expiración y caché.
En costo, no hay tarifa de salida ni de entrada, y cada plan incluye una cuota de 5 GB a 250 GB; las peticiones S3 tienen un límite de tasa por plan. La durabilidad es de 99,999999999% (11 nueves) con replicación triple, y los archivos públicos se sirven desde una CDN global en el edge. Conoce el Blob Storage y compara las cuotas en Precios.
Blob Storage
Object storage compatible con S3, sin tarifas de salida
Preguntas frecuentes
¿S3 es lo mismo que almacenamiento de objetos?
No. El almacenamiento de objetos es el tipo de tecnología. S3 es el servicio de Amazon que lo popularizó y, por extensión, su API HTTP, que muchos otros servicios copiaron.
¿Puedo usar el SDK de AWS con un servicio que no es de AWS?
Sí, si el servicio es compatible con S3. Apuntas el SDK a la dirección del servicio (endpoint_url) y usas sus claves. El resto del código sigue igual.
¿Compatible con S3 significa que tiene todas las funciones de S3?
No. Casi todo servicio compatible cubre lo básico (subir, descargar, listar, borrar, subida multipart, URLs prefirmadas). Funciones avanzadas como políticas de bucket, Object Lock o notificaciones de eventos varían según el proveedor.
¿Cuál es el tamaño máximo de un objeto en Amazon S3?
48,8 TiB, subido en hasta 10.000 partes de 5 MiB a 5 GiB cada una. Los servicios compatibles tienen límites propios, así que revisa la documentación del proveedor.
Más en Storage
Ver los 15 artículos- Qué es una URL prefirmada (presigned URL)Una URL prefirmada (presigned URL) es un enlace temporal a un archivo privado que funciona sin login. Mira cómo funciona, sus límites y cuándo usarla.
- Qué es el almacenamiento de objetosEl almacenamiento de objetos guarda archivos como objetos con clave y metadatos, accesibles por una API HTTP. Mira cómo funciona, para qué sirve y sus límites.
- Reglas de ciclo de vida: expirar y limpiar archivos automáticamenteUna regla de ciclo de vida borra archivos sola después de un plazo. Aprende a crear reglas de caducidad por carpeta en S3 con boto3 y a comprobar que funcionan.
- Archivos públicos o privados: cómo controlar quién accedeUn archivo público abre para quien tenga la URL; uno privado, solo con un enlace autorizado. Aprende a elegir, probar el acceso y compartir con seguridad.