Full Stack AI AWS Bedrock en la práctica: el código y los comandos que realmente importan
Full Stack AI AWS Bedrock : lo esencial en un artículo — código real, diagramas y pasos concretos, extractos de un curso de 41 lecciones.
Ni teoría interminable aquí: abrimos la terminal y practicamos. Aquí tienes lo esencial de Full Stack AI AWS Bedrock, extraído directamente de un curso completo de 41 lecciones —con código real que puedes copiar y pegar ahora mismo.
- Crear una cuenta AWS y descubrir Bedrock
- Introducción a la IA generativa y AWS Bedrock
- API Bedrock y SDK Python Boto3
- Prompt Engineering para Bedrock
- Backend FastAPI con Bedrock
Instalar Boto3 y configurar las credenciales
Objetivos pedagógicos
¿Qué es Boto3?
Boto3 es el SDK oficial de Amazon Web Services para Python. Permite interactuar con todos los servicios AWS (S3, DynamoDB, Lambda, Bedrock, etc.) directamente desde código Python.
Boto3 – Cliente de bajo nivel
Acceso directo a las API de AWS. Cada método corresponde exactamente a una operación de la API REST. Manipulas diccionarios Python.
Boto3 – Resource de alto nivel
Abstracción orientada a objetos. Más intuitiva para ciertos servicios (S3, DynamoDB). Para Bedrock se utiliza principalmente el cliente.
Paso 1 – Instalar Python 3.8+
Boto3 requiere Python 3.8 o superior. Verifica primero si Python ya está instalado:
python --version
Si la versión mostrada es 3.8+, pasa al siguiente paso. En caso contrario, instala Python según tu sistema:
Windows
Descarga el instalador oficial desde https://www.python.org/downloads/. Marca obligatoriamente la casilla « Add Python to PATH » durante la instalación.
# Verificación después de la instalación python --version pip --version
macOS
# Via Homebrew (recomendado) brew install python@3.11 # Verificación python3 --version pip3 --version
Linux (Ubuntu / Debian)
sudo apt update sudo apt install python3 python3-pip python3-venv -y # Verificación python3 --version pip3 --version
python3 y pip3 en lugar de python y pip, ya que python puede apuntar a Python 2.x en algunos sistemas.Paso 2 – Crear un entorno virtual
Un entorno virtual aísla las dependencias de tu proyecto. Evita conflictos entre distintos proyectos Python en tu máquina.
Crear y activar el venv
Primera llamada a Bedrock mediante la consola
Objetivos pedagógicos
1 – Acceder a Amazon Bedrock
Paso 1: Conectarse a la consola AWS
Abre tu navegador y ve a:
https://console.aws.amazon.com
Inicia sesión con tus credenciales AWS. Si aún no tienes cuenta, créala (el Free Tier de AWS te da acceso a muchos servicios de forma gratuita).
Paso 2: Elegir la región correcta
Verifica la región en la parte superior derecha de la consola:
+----------------------------------------------------------+ | AWS Console [N. Virginia v] | | ^^^^^^^^^^^^ | | Barra de búsqueda : [ Amazon Bedrock ] | | | +----------------------------------------------------------+ Si ves otra región, haz clic en el menú desplegable y selecciona « US East (N. Virginia) ».
Paso 3: Encontrar Amazon Bedrock
En la barra de búsqueda superior de la consola, escribe « Bedrock » y haz clic en Amazon Bedrock en los resultados:
+----------------------------------------------------------+ | Búsqueda : [ Bedrock ] | | | | Resultados : | | +------------------------------------------------------+| | | Amazon Bedrock || | | Build with foundation models || | +------------------------------------------------------+| +----------------------------------------------------------+
Llegas al panel de control de Bedrock (Bedrock Dashboard).
2 – Activar el acceso a los modelos
Por defecto, ningún modelo está activado. Debes solicitar explícitamente el acceso antes de poder utilizarlos.
Paso 1: Ir a Model Access
En el menú lateral izquierdo de Bedrock, haz clic en « Model access » (al final):
+----------------------------+------------------------------+ | Amazon Bedrock | | | | Bedrock Dashboard | | Playgrounds | | | Chat | | | Text | Bienvenido a Amazon | | Image | Bedrock. Accede a modelos | | | fundacionales de vanguardia | | | mediante una API única. | | Orchestration | | | Agents | | | Knowledge bases | | | | | | Foundation models | | | Base models | | | Custom models | | | | | | Bedrock configurations | | | > Model access <-- | | +----------------------------+------------------------------+
Paso 2: Solicitar el acceso
Haz clic en el botón « Manage model access » (arriba a la derecha).
Verás la lista de todos los modelos disponibles. Marca los siguientes modelos para este curso:
+----------------------------------------------------------+ | Manage model access | | | | Provider Model Access Status | | -------------------------------------------------------+| | [x] Anthropic Claude 3 Haiku Available || | [x] Anthropic Claude 3.5 Sonnet Available || | [ ] Anthropic Claude 3 Opus Available || | [x] Amazon Titan Text Express Available || | [x] Meta Llama 3 8B Instruct Available || | [x] Mistral AI Mistral 7B Instruct Available || | [x] Mistral AI Mixtral 8x7B Instruct Available || | | | [ Save changes ] | +----------------------------------------------------------+
Haz clic en « Save changes ». El acceso suele activarse en unos segundos.
Crear una API FastAPI + Bedrock
Full Stack AI con AWS Bedrock • Backend FastAPI con Bedrock
/chat funcional, testable mediante Swagger UI, curl y PowerShell.Lo que aprenderás
1. Instalación de las dependencias
Asegúrate de que tu entorno virtual esté activado e instala las bibliotecas:
# Activar el entorno virtual (Windows PowerShell) .\venv\Scripts\Activate.ps1 # Instalar las bibliotecas principales pip install fastapi uvicorn boto3 pydantic python-dotenv python-multipart
Verifica que todo esté instalado correctamente:
pip list | findstr -i "fastapi uvicorn boto3"
Deberías ver las tres bibliotecas con sus números de versión.
2. Los modelos Pydantic
Pydantic permite definir la forma exacta de los datos que nuestra API acepta y devuelve. Es como un formulario con campos obligatorios: si los datos no coinciden, la API rechaza automáticamente la solicitud con un mensaje de error claro.
# backend/models/schemas.py
from pydantic import BaseModel, Field
from typing import Optional, List
class Message(BaseModel):
"""Representa un mensaje en la conversación."""
role: str = Field(
...,
description="Rol: 'user' o 'assistant'",
examples=["user"]
)
content: str = Field(
...,
description="Contenido del mensaje",
examples=["Explícame los bucles Python"]
)
class ChatRequest(BaseModel):
"""Solicitud enviada por el frontend para chatear con la IA."""
message: str = Field(
...,
min_length=1,
max_length=10000,
description="Mensaje del usuario"
)
history: Optional[List[Message]] = Field(
default=[],
description="Historial de la conversación"
)
model_id: Optional[str] = Field(
default=None,
description="ID del modelo Bedrock"
)
temperature: Optional[float] = Field(
default=0.7,
ge=0.0,
le=1.0,
description="Creatividad del modelo (0 = preciso, 1 = creativo)"
)
max_tokens: Optional[int] = Field(
default=4096,
ge=1,
le=8192,
description="Número máximo de tokens en la respuesta"
)
class ChatResponse(BaseModel):
"""Respuesta devuelta por la API tras la llamada a Bedrock."""
response: str = Field(
...,
description="Respuesta generada por la IA"
)
model_id: str = Field(
...,
description="ID del modelo utilizado"
)
input_tokens: int = Field(
default=0,
description="Tokens consumidos por el prompt"
)
output_tokens: int = Field(
default=0,
description="Tokens generados en la respuesta"
)
class HealthResponse(BaseModel):
"""Respuesta del endpoint de salud."""
status: str
message: strSi el frontend envía un campo temperature con valor 5.0 (fuera del rango 0-1), Pydantic devuelve:
{
"detail": [
{
"loc": ["body", "temperature"],
"msg": "Input should be less than or equal to 1",
"type": "less_than_equal"
}
]
}3. El servicio Bedrock
El servicio Bedrock encapsula toda la lógica de comunicación con AWS. Aquí es donde ocurre la «magia»: tu mensaje de texto se transforma en una solicitud AWS, se envía a Claude y la respuesta se devuelve.
# backend/services/bedrock_service.py
import json
import boto3
from config import AWS_REGION, BEDROCK_MODEL_ID, MAX_TOKENS, TEMPERATURE
def get_bedrock_client():
"""Crea y devuelve un cliente Bedrock Runtime."""
return boto3.client(
service_name="bedrock-runtime",
region_name=AWS_REGION
)
def build_messages(message: str, history: list = None) -> list:
"""Construye la lista de mensajes para la API Bedrock."""
messages = []
if history:
for msg in history:
messages.append({
"role": msg.role,
"content": [{"type": "text", "text": msg.content}]
})
messages.append({
"role": "user",
"content": [{"type": "text", "text": message}]
})
return messages
def invoke_bedrock(
message: str,
history: list = None,
model_id: str = None,
temperature: float = None,
max_tokens: int = None
) -> dict:
"""
Llama a AWS Bedrock con el mensaje y devuelve la respuesta.
Args:
message: El mensaje del usuario
history: El historial de la conversación
model_id: El identificador del modelo Bedrock
temperature: La creatividad (0.0 a 1.0)
max_tokens: El número máximo de tokens de salida
Returns:
dict con la respuesta, el modelo utilizado y los tokens
"""
client = get_bedrock_client()
model = model_id or BEDROCK_MODEL_ID
temp = temperature if temperature is not None else TEMPERATURE
tokens = max_tokens or MAX_TOKENS
messages = build_messages(message, history)
body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": tokens,
"temperature": temp,
"messages": messages
})
response = client.invoke_model(
modelId=model,
contentType="application/json",
accept="application/json",
body=body
)
response_body = json.loads(response["body"].read())
return {
"response": response_body["content"][0]["text"],
"model_id": model,
"input_tokens": response_body.get("usage", {}).get(
"input_tokens", 0
),
"output_tokens": response_body.get("usage", {}).get(
"output_tokens", 0
),
}Detalles del parámetro body
| Parámetro | Tipo | Descripción |
|---|---|---|
anthropic_version |
string | Versión de la API Anthropic utilizada por Bedrock |
max_tokens |
int | Limita la longitud de la respuesta (1 token ≈ 0.75 palabra) |
temperature |
float | 0.0 = respuestas precisas, 1.0 = respuestas creativas |
messages |
list | La conversación completa (historial + nuevo mensaje) |
4. El archivo main.py completo
Es el punto de entrada de la aplicación. Ensambla todos los componentes: configuración, CORS, rutas y gestión de errores.
# backend/main.py
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from dotenv import load_dotenv
from config import CORS_ORIGINS
from models.schemas import (
ChatRequest,
ChatResponse,
HealthResponse,
)
from services.bedrock_service import invoke_bedrock
load_dotenv()
app = FastAPI(
title="Full Stack AI - Backend Bedrock",
description="API para interactuar con AWS Bedrock (Claude)",
version="1.0.0",
)
# --- Middleware CORS ---
app.add_middleware(
CORSMiddleware,
allow_origins=CORS_ORIGINS,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# --- Endpoints ---
@app.get("/health", response_model=HealthResponse)
def health_check():
"""Verifica que el servidor está operativo."""
return HealthResponse(
status="ok",
message="El servidor funciona correctamente"
)
@app.post("/chat", response_model=ChatResponse)
def chat(request: ChatRequest):
"""
Envía un mensaje a AWS Bedrock y devuelve la respuesta de la IA.
- **message** : el texto enviado por el usuario
- **history** : el historial de conversación (opcional)
- **model_id** : el modelo Bedrock a utilizar (opcional)
- **temperature** : la creatividad de 0.0 a 1.0 (opcional)
- **max_tokens** : número máximo de tokens de salida (opcional)
"""
try:
result = invoke_bedrock(
message=request.message,
history=request.history,
model_id=request.model_id,
temperature=request.temperature,
max_tokens=request.max_tokens,
)
return ChatResponse(**result)
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Error al llamar a Bedrock : {str(e)}"
)
@app.get("/models")
def list_models():
"""Devuelve la lista de modelos disponibles."""
return {
"models": [
{
"id": "anthropic.claude-3-sonnet-20240229-v1:0",
"name": "Claude 3 Sonnet",
"description": "Buen equilibrio rendimiento/coste"
},
{
"id": "anthropic.claude-3-haiku-20240307-v1:0",
"name": "Claude 3 Haiku",
"description": "El más rápido y económico"
},
{
"id": "anthropic.claude-3-5-sonnet-20240620-v1:0",
"name": "Claude 3.5 Sonnet",
"description": "El más potente"
},
]
}Este artículo cubre los extractos más útiles —el curso completo Full Stack AI AWS Bedrock (12 capítulos, 41 lecciones, ejercicios corregidos y proyecto final) te lleva hasta el final.
./acceder-al-curso-completo curso gratuito : Dominar Claude CodeFAQ
¿Cuánto tiempo se tarda en aprender Full Stack AI AWS Bedrock?
¿Se necesitan requisitos previos?
¿Por dónde empezar concretamente?
📬 ¿Quieres recibir este tipo de guía cada semana? Suscríbete gratis —código real, cero palabrería.