Saltar al contenido

lección 2

Setup: AWS CLI + LocalStack + credenciales

Instalación paso a paso de AWS CLI y LocalStack en Windows y Mac. Configurar credenciales, verificar conexión y tu primer comando contra AWS local.

55 min

Esta es una lección de setup — y como toda lección de setup en este track, la tomamos MUY en serio. No hay nada más frustrante que llegar a una lección emocionante sobre S3 o Lambda y no poder hacer los ejercicios porque algo no está bien configurado. Vamos a instalar tres cosas: AWS CLI (la herramienta de línea de comandos para hablar con AWS), boto3 (la librería de Python para programar contra AWS), y LocalStack (el emulador de AWS que nos permite practicar gratis sin riesgo de facturación).

LocalStack es tu mejor amigo en esta skill. Es un proyecto open source que emula los servicios de AWS en tu propia máquina usando Docker. Cuando ejecutas un comando contra LocalStack, es como hablar con AWS pero todo se queda en tu portátil. Puedes crear buckets S3, funciones Lambda, tablas de DynamoDB, políticas IAM — todo sin gastar un céntimo ni arriesgar una cuenta real.

### Paso 1: Verificar que Docker está corriendo

LocalStack corre dentro de Docker (que instalaste en la Skill 6). Verifica que Docker Desktop está activo:

1# 🟦 Windows (PowerShell) y 🍎 Mac (Terminal) — mismo comando
2docker --version
3# Docker version 24.x.x o superior
4
5docker ps
6# Debería mostrar la lista de contenedores (puede estar vacía)

Si docker ps da error, abre Docker Desktop y espera a que inicie

### Paso 2: Instalar AWS CLI v2

AWS CLI es la navaja suiza para interactuar con AWS desde la terminal. Incluso cuando usamos boto3 en Python, muchas veces necesitas CLI para operaciones rápidas, debugging o scripts de automatización.

1# 🟦 Windows (PowerShell) — ejecutar como administrador
2msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
3
4# Verificar instalación (cerrar y reabrir PowerShell):
5aws --version
6# aws-cli/2.x.x Python/3.x.x Windows/10 ...

Instalación en Windows — descarga e instala el MSI oficial

1# 🍎 Mac (Terminal) — con Homebrew
2brew install awscli
3
4# Verificar instalación:
5aws --version
6# aws-cli/2.x.x Python/3.x.x Darwin/23.x.x ...

Instalación en Mac — Homebrew es el método más limpio

### Paso 3: Instalar boto3 en tu entorno virtual

1# 🟦 Windows y 🍎 Mac — dentro de tu venv
2pip install boto3
3
4# Verificar
5python -c "import boto3; print(boto3.__version__)"
6# 1.34.x

boto3 es el SDK oficial de AWS para Python

### Paso 4: Levantar LocalStack con Docker

LocalStack se ejecuta como un contenedor Docker. Vamos a usar docker-compose para tenerlo siempre listo:

1# Crea un archivo docker-compose.yml en tu directorio de trabajo
2# 🟦 Windows y 🍎 Mac — mismo contenido

Prepara el directorio del proyecto

1# docker-compose.yml
2services:
3 localstack:
4 image: localstack/localstack:3.5
5 ports:
6 - "127.0.0.1:4566:4566"
7 environment:
8 - AWS_DEFAULT_REGION=eu-west-1
9 - DEBUG=0
10 volumes:
11 # Necesario para Lambda EN LOS TRES SISTEMAS.
12 # Docker Desktop expone el socket también en Windows (WSL2).
13 - "/var/run/docker.sock:/var/run/docker.sock"

docker-compose.yml — LocalStack con la imagen 3.5 (la última sin cuenta obligatoria)

IMPORTANTE: clava la versión de la imagen. No pongas :latest. Desde la versión 2026.03.0 (23 de marzo de 2026) LocalStack no arranca sin una cuenta y un token (LOCALSTACK_AUTH_TOKEN). El token del plan Hobby es gratuito para uso no comercial, pero exige registrarse, y ese registro no es parte de este curso. Por eso aquí usamos localstack/localstack:3.5, la última versión que arranca sin cuenta. Es una imagen de junio de 2024, así que no tiene los arreglos posteriores.

Ojo: LocalStack olvida todo al reiniciarse. Guardar el estado entre arranques es una función de los planes de pago, así que cada docker compose up te da un AWS recién estrenado. No es un problema, es una costumbre: cada lección empieza creando lo que necesita. Para apagar LocalStack: docker compose down. Mientras esté levantado consume RAM (~512MB).

1# 🟦 Windows y 🍎 Mac — levantar LocalStack
2docker-compose up -d
3
4# Verificar que está corriendo:
5docker ps
6# Deberías ver localstack/localstack:3.5 corriendo
7
8# Verificar que responde:
9curl http://localhost:4566/_localstack/health
10# {"services": {"s3": "running", "iam": "running", ...}}

En Windows PowerShell usa Invoke-WebRequest en vez de curl si no lo tienes

### Paso 5: Configurar credenciales para LocalStack

Aunque LocalStack no necesita credenciales reales (acepta cualquier cosa), necesitamos configurar AWS CLI con credenciales ficticias para que los comandos funcionen sin errores:

1# 🟦 Windows y 🍎 Mac — configurar un perfil "localstack"
2aws configure --profile localstack
3# AWS Access Key ID: test
4# AWS Secret Access Key: test
5# Default region name: eu-west-1
6# Default output format: json

Las credenciales son ficticias — LocalStack acepta cualquier valor

Consejo de senior: NUNCA pongas credenciales reales de AWS en tu código fuente ni en archivos que suban a Git. Usa perfiles de AWS CLI (~/.aws/credentials) y variables de entorno. He visto empresas perder miles de euros porque alguien subió un access key a un repo público y bots de mining de crypto lo detectaron en minutos.

### Paso 6: Tu primer comando — crear un bucket S3 en local

1# 🟦 Windows y 🍎 Mac — crear un bucket S3 en LocalStack
2aws --endpoint-url=http://localhost:4566 --profile localstack \
3 s3 mb s3://mi-primer-bucket
4
5# Listar buckets
6aws --endpoint-url=http://localhost:4566 --profile localstack \
7 s3 ls
8# 2024-01-15 10:30:00 mi-primer-bucket

El --endpoint-url apunta a LocalStack en vez de a AWS real

### Paso 7: Verificar con boto3 (Python)

1import boto3
2
3# Crear cliente S3 apuntando a LocalStack
4s3 = boto3.client(
5 's3',
6 endpoint_url='http://localhost:4566',
7 aws_access_key_id='test',
8 aws_secret_access_key='test',
9 region_name='eu-west-1'
10)
11
12# Listar buckets
13response = s3.list_buckets()
14for bucket in response['Buckets']:
15 print(f"Bucket: {bucket['Name']}")
16# Bucket: mi-primer-bucket

boto3 hablando con LocalStack — idéntico a AWS real excepto el endpoint_url

Fíjate en algo importante: el código Python para hablar con LocalStack es IDÉNTICO al que usarías contra AWS real. La única diferencia es el endpoint_url. Cuando el día de mañana trabajes con una cuenta AWS real, solo tendrás que quitar ese parámetro y todo funcionará igual. Esta es la belleza de LocalStack como herramienta de aprendizaje.

Consejo de senior: crea una función helper que construya el cliente boto3 con o sin LocalStack según una variable de entorno. Así tu código funciona en local y en producción sin cambios. Algo como: endpoint = os.getenv("AWS_ENDPOINT_URL") y pasarlo solo si existe.

Si LocalStack no arranca, los motivos más comunes son: 1) Docker Desktop no está corriendo, 2) el puerto 4566 está ocupado por otro servicio, 3) no tienes suficiente RAM libre (LocalStack necesita ~512MB). Revisa con docker logs localstack.

### Función helper reutilizable para todo el curso

1import os
2import boto3
3
4def get_aws_client(service_name: str):
5 """
6 Crea un cliente boto3 contra LocalStack si AWS_ENDPOINT_URL
7 está definida; contra AWS real si no.
8 """
9 kwargs = {'region_name': os.getenv('AWS_DEFAULT_REGION', 'eu-west-1')}
10 endpoint = os.getenv('AWS_ENDPOINT_URL')
11 if endpoint:
12 kwargs.update(
13 endpoint_url=endpoint,
14 aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID', 'test'),
15 aws_secret_access_key=os.getenv('AWS_SECRET_ACCESS_KEY', 'test')
16 )
17 return boto3.client(service_name, **kwargs)
18
19# Uso:
20s3 = get_aws_client('s3')
21iam = get_aws_client('iam')
22lambda_client = get_aws_client('lambda')

Guarda esto en un archivo aws_helper.py — lo usarás en TODOS los ejercicios

## ejercicios

[01]

Verificar que LocalStack responde

Escribe un script que verifique que LocalStack está corriendo y muestre el estado de cada servicio configurado.

Cargando editor...
[02]

Crear estructura de buckets para data lake

Tu empresa necesita una estructura de data lake en S3. Crea programáticamente los buckets: raw-data, processed-data, y analytics-output usando boto3. Tiene que ser idempotente: ejecútalo dos veces y la segunda no debe fallar.

Cargando editor...
[03]

Crea tu módulo aws_helper.py

Construye un módulo reutilizable con funciones helper que usarás en todos los ejercicios de esta skill. Debe crear clientes para s3, iam, lambda y glue.

Cargando editor...
[04]

Crear alias para no escribir --endpoint-url cada vez

Configura un alias awslocal que añada automáticamente el endpoint de LocalStack. Muestra cómo hacerlo tanto en PowerShell como en zsh.

Cargando editor...

Regístrate para guardar tu progreso.

## comentarios

Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.

Inicia sesión para comentar y responder.

cargando comentarios...