Cómo subir archivos a S3 con URLs firmadas

Resumen

Subir imágenes, videos o PDFs en una aplicación serverless requiere una estrategia distinta a guardar datos en una base de datos. Aquí te explico cómo usar URLs firmadas de S3 junto con Lambda y API Gateway para que tus usuarios puedan cargar archivos de forma segura, sin exponer tu bucket al mundo.

Por qué no debes guardar objetos en una base de datos

Cuando hablamos de objetos nos referimos a archivos como imágenes, videos o PDFs. Y aquí viene lo interesante: estos archivos casi nunca deberían ir a una base de datos. Existen servicios diseñados específicamente para almacenarlos.

En AWS, ese servicio es Amazon S3, y es el que vamos a usar en la aplicación del curso [00:32].

¿Qué es Amazon S3? Es el servicio de almacenamiento de objetos de AWS, pensado para guardar archivos de cualquier tamaño como imágenes, videos o documentos, separándolos de tu base de datos.

Por qué no conviene exponer un bucket público en S3

La forma más simple sería crear un bucket de acceso público y dejar que cualquiera escriba en él. Funciona, sí, pero es una muy mala práctica de seguridad. No quieres que tu bucket sea accesible públicamente ni para lectura ni para escritura.

Entonces, ¿cómo logramos que el usuario suba un archivo directamente al bucket sin abrirlo al mundo? Con una técnica llamada URL firmada.

Cómo funcionan las URLs firmadas de S3 en una arquitectura serverless

El flujo se apoya en tres piezas: el usuario, API Gateway y una Lambda que llamaremos upload S3. La Lambda le pide al bucket que firme una URL, y el bucket devuelve esa URL con un token adjunto.

Ese token tiene un tiempo de vida definido por ti: pueden ser 5 minutos, 10 minutos o lo que especifiques [02:10]. Pasado ese tiempo, la URL deja de servir.

Cuál es el paso a paso del flujo de carga

  1. El usuario llama a API Gateway pidiendo subir un archivo.
  2. API Gateway invoca la Lambda upload S3.
  3. La Lambda le pide al bucket que firme una URL temporal.
  4. El bucket devuelve la URL firmada a la Lambda.
  5. La Lambda retorna esa URL al usuario.
  6. El usuario sube el archivo directamente al bucket usando la URL firmada.

De esta manera, el bucket nunca queda abierto. Solo entrega accesos puntuales, bajo condiciones controladas, y el usuario carga el objeto directamente sin pasar por toda la cadena.

¿Qué es una URL firmada en S3? Es una URL temporal con un token adjunto que autoriza una operación específica sobre el bucket, como subir un archivo, durante un tiempo limitado.

Por qué no pasar archivos por API Gateway y Lambda

Una alternativa que muchos intentan es codificar la imagen en base 64 y enviarla por API Gateway hasta la Lambda, para que esta la guarde en S3. Funciona en algunos casos, pero tiene limitaciones serias de tamaño.

  • API Gateway no está diseñada para recibir cargas pesadas.
  • Lambda tampoco está pensada para procesar archivos muy grandes.
  • Un video puede pesar muchísimas megas y romper el flujo.
  • S3, en cambio, sí está preparado para recibir archivos de gran tamaño.

Por eso, la URL firmada es la mejor manera de subir archivos a S3 en una arquitectura serverless: combinas seguridad, eficiencia y la capacidad nativa del bucket para manejar objetos grandes.

¿Por qué no subir archivos grandes por Lambda? Porque Lambda y API Gateway tienen límites de tamaño en las peticiones, mientras que S3 está optimizado para recibir objetos pesados directamente.

Qué viene después en el diseño de la aplicación

El diagrama del curso muestra una línea curva que va desde el usuario hasta el bucket de S3. Esa línea representa exactamente esta carga directa habilitada por la URL firmada [01:15]. En la siguiente clase vamos a implementar esta funcionalidad paso a paso, creando la Lambda upload S3 y configurando la firma de URLs.

¿Ya habías usado URLs firmadas en algún proyecto? Cuéntame en los comentarios cómo resolviste la carga de archivos en tu aplicación.