Ya tenemos nuestra cuenta asegurada, un usuario IAM listo y entendemos cómo funcionan las policies y los roles. Es hora de ensuciarnos las manos con nuestro primer servicio real de AWS: Amazon S3 (Simple Storage Service). S3 es el servicio de almacenamiento más utilizado de AWS y uno de los primeros que todo el mundo debería conocer.
¿Qué es Amazon S3?
Amazon S3 es un servicio de almacenamiento de objetos. Pensalo como un disco duro infinito en la nube donde podés guardar cualquier tipo de archivo: imágenes, videos, backups, documentos, código, logs, lo que sea. La diferencia con un disco duro tradicional es que S3 está diseñado para ser altamente disponible (tus archivos siempre están accesibles), durable (AWS garantiza un 99.999999999% de durabilidad, lo que se conoce como “11 nueves”) y escalable (no tenés que preocuparte por el espacio).
Antes de empezar, hay dos conceptos clave:
- Bucket: es el contenedor principal donde se almacenan los archivos. Pensalo como una carpeta raíz. Cada bucket tiene un nombre que es único a nivel global en todo AWS (nadie más en el mundo puede tener un bucket con el mismo nombre).
- Objeto: es cada archivo que subimos a un bucket. Cada objeto tiene una key (su nombre/ruta dentro del bucket) y el contenido del archivo en sí.
Tip: Aunque S3 muestra “carpetas” en la consola, técnicamente no existen carpetas. Son simplemente prefijos en el nombre del objeto. Por ejemplo,
fotos/vacaciones/playa.jpges un objeto cuya key incluye el prefijofotos/vacaciones/.
Paso 1: Ingresar al servicio S3
Desde la consola de AWS, buscamos S3 en la barra superior y hacemos clic en el resultado.

Paso 2: Crear un bucket
En la pantalla principal de S3 vemos la lista de buckets (si es la primera vez, estará vacía). Hacemos clic en Create bucket.

Paso 3: Configurar el bucket
AWS nos pide los datos del bucket. Vamos a ver cada sección:
- AWS Region: la región donde se va a almacenar el bucket. En nuestro caso ya está seleccionada
US East (N. Virginia) us-east-1. - Bucket type: elegimos General purpose, que es el tipo recomendado para la mayoría de los casos de uso. La otra opción (Directory) es para casos específicos de baja latencia con S3 Express One Zone.
- Bucket namespace: dejamos Global namespace, que es la opción por defecto. Esto significa que el nombre del bucket tiene que ser único en todo AWS a nivel mundial.
- Bucket name: un nombre único (por ejemplo,
mi-bucket-010791). Como el namespace es global, probablemente tengas que agregarle un identificador único, como números aleatorios o tus iniciales con algún número, para que esté disponible.

Paso 4: Configuración de acceso público
Más abajo, vemos la sección Block Public Access settings for this bucket. Por defecto, AWS bloquea todo el acceso público y esto está perfecto. Es una medida de seguridad muy importante: ningún bucket debería ser público a menos que tengamos un motivo muy específico (como servir un sitio web estático).
Dejamos todas las opciones tildadas tal como están.

Importante: Uno de los errores de seguridad más comunes en AWS es dejar buckets públicos accidentalmente. Esto ha causado filtraciones de datos reales en empresas. Siempre dejá el bloqueo de acceso público activado salvo que sepas exactamente lo que estás haciendo.
Paso 5: Opciones adicionales
Más abajo encontramos varias opciones que dejamos con los valores por defecto por ahora:
- Bucket Versioning: lo dejamos en Disable. El versionado permite mantener múltiples versiones de un mismo objeto, pero para empezar no es necesario.
- Tags: son etiquetas opcionales para organizar y controlar costos. Las dejamos vacías.
- Default encryption: AWS encripta los objetos automáticamente con SSE-S3 (Server-Side Encryption con claves de Amazon S3). Lo dejamos así, es la opción recomendada.
- Bucket Key: lo dejamos en Enable, que ayuda a reducir costos de encriptación.

Paso 6: Crear el bucket
En la sección de Advanced settings, dejamos Object Lock en Disable (es para casos donde necesitás que los objetos no puedan ser borrados ni sobreescritos, como cumplimiento normativo).
Hacemos clic en Create bucket.

Ya tenemos nuestro primer bucket creado. AWS nos muestra el mensaje de confirmación y nos lleva directamente al interior del bucket, que por ahora está vacío.

Paso 7: Subir un archivo al bucket
Dentro del bucket vemos que no tiene objetos. Para subir nuestro primer archivo, hacemos clic en el botón Upload.

En la pantalla de Upload, hacemos clic en Add files para seleccionar un archivo desde nuestra computadora.

Se abre el selector de archivos del sistema operativo. Elegimos el archivo que queremos subir (en nuestro caso, una imagen llamada mi-primer-archivo.png) y hacemos clic en Cargar (o Open según el idioma de tu sistema).

Una vez seleccionado, vemos el archivo en la lista con su nombre, tipo y tamaño. Confirmamos que todo esté bien y hacemos clic en Upload.

AWS nos muestra el resultado del upload. Si todo salió bien, vemos el banner verde de Upload succeeded con el resumen: destino, cantidad de archivos subidos y el estado de cada uno.

Paso 8: Ver el objeto y acceder a él
Cerramos la pantalla de upload y volvemos al bucket. Ahora vemos nuestro archivo mi-primer-archivo.png en la lista de objetos con su tipo, fecha de última modificación, tamaño y clase de almacenamiento (Standard).
Si seleccionamos el archivo (checkbox), se habilitan los botones de acción en la barra superior: Open, Download, Delete, Actions, etc.

Si intentamos copiar la URL del objeto y abrirla directamente en el navegador, vamos a recibir un error de Access Denied. Esto es correcto y esperado: nuestro bucket es privado, así que nadie puede acceder a los objetos por URL pública.
¿Y si necesito compartir el archivo? S3 permite generar presigned URLs: URLs temporales con un tiempo de expiración que permiten acceder a un objeto sin necesidad de hacerlo público. Lo vemos en el siguiente paso.
Paso 9: Acceder al objeto con una URL prefirmada (Presigned URL)
Para acceder al archivo de forma segura sin hacer el bucket público, podemos usar el botón Open directamente desde la consola. Al hacer clic, AWS genera automáticamente una presigned URL temporal y abre el archivo en el navegador.

Como podés ver, la URL en la barra del navegador apunta a mi-bucket-010791.s3.us-east-1.amazonaws.com con parámetros adicionales que incluyen credenciales temporales y una firma. Esta URL funciona solo por un tiempo limitado — después expira y deja de funcionar.
Tip: Las presigned URLs son ideales para compartir archivos temporalmente sin comprometer la seguridad del bucket. También se pueden generar desde el menú Actions → Share with a presigned URL, donde podés elegir el tiempo de expiración.
¿Cuánto cuesta S3?
Una de las ventajas de S3 es que se paga solo por lo que usás. No hay costo mínimo ni tarifa fija. Los costos se calculan por:
- Almacenamiento: por GB almacenado por mes.
- Solicitudes: por cantidad de solicitudes (PUT, GET, LIST, etc.).
- Transferencia de datos: la transferencia de datos hacia afuera de AWS tiene costo (la transferencia hacia adentro es gratuita).
Para darte una idea, almacenar 1 GB durante un mes en la clase estándar de S3 cuesta aproximadamente $0.023 USD (en us-east-1). Y dentro del Free Tier, tenés 5 GB de almacenamiento gratuito durante los primeros 12 meses.
Tip: Para este tipo de pruebas con archivos pequeños, el costo va a ser prácticamente cero. Pero siempre es buena práctica revisar el apartado de costos antes de usar cualquier servicio.
Conexión con lo que aprendimos: Policies y S3
¿Recordás la policy personalizada que creamos en el post anterior? Era justamente una policy para leer objetos de un bucket S3 específico:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mi-bucket-010791",
"arn:aws:s3:::mi-bucket-010791/*"
]
}
]
}
Ahora que creamos el bucket de verdad, esa policy ya tiene un recurso real sobre el que actuar. Si le adjuntáramos esta policy a un usuario o a un role, ese usuario/role podría listar y leer los archivos de nuestro bucket, pero no podría subirlos, modificarlos ni eliminarlos. Eso es el principio de menor privilegio en acción.
Conclusiones
En este post dimos el primer paso práctico con AWS: creamos un bucket en Amazon S3, subimos nuestro primer archivo y aprendimos cómo acceder a los objetos de forma segura con presigned URLs. También conectamos lo que aprendimos sobre policies con un caso de uso real.
En el próximo post vamos a ver cómo configurar AWS Budgets para crear alertas de costos y tener todo bajo control antes de seguir experimentando con más servicios.