1. ¿Qué es Blocks?
Es un marco de trabajo de código abierto lanzado recientemente que facilita la implementación de proyectos en AWS; tú solamente te encargarás de desarrollar tu proyecto como lo haces normalmente en TypeScript. El marco de trabajo se encargará de convertir tu código en servicios de AWS.
2. Beneficios
- Desarrollo sin necesidad de una cuenta de AWS.
- Puedes probar tu código en local y tendrás la certeza de que el funcionamiento será igual en producción.
- Orientado a costo bajo utilizando la tecnología serverless.
- Experiencia de desarrollo con IA al incluir guías que permiten hacer uso de herramientas de IA para codificación, como Kiro, ya que el framework orienta al agente sobre cómo mejorar tus arquitecturas.
- Tendrás un ambiente de desarrollo aislado y totalmente funcional.
3. ¿Qué es un Block?
Un Block es una pieza de funcionalidad que encapsula lógica + infraestructura AWS en una sola abstracción que usas con una a tres líneas de código.
Analogía:
Piensa en un Block como un módulo de LEGO: cada pieza tiene una forma y función específica, y las combinas para construir lo que quieras. No te preocupas de cómo está hecha internamente.
4. ¿Qué Blocks puedo utilizar?
- Datos y almacenamiento
- Autenticación
- Cómputo y trabajos en segundo plano
- Inteligencia artificial
- Comunicación
- Configuración
- Observabilidad
- Alojamiento y despliegue
5. ¿Cómo inicio con mi proyecto?
Con un comando de npm podemos crear la estructura principal del proyecto. Para entender cómo funciona todo desde cero, creé un repositorio que cuenta con una plantilla en blanco la cual puedes utilizar para crear tu proyecto. Ejecuta lo siguiente:
npx @luisfdeleonramirez/create-aws-blocks-base chatbot-ia
cd chatbot-ia
npm install
npm run dev
Al ejecutar estos comandos tendremos un servicio local corriendo en http://localhost:3000 donde podrás realizar tus pruebas.
6. ¿Qué vamos a construir?
Desarrollé una app que funciona como un agente que usa Amazon Nova Lite (amazon.nova-lite-v1:0) y responde consultas de los usuarios. Luego de varias pruebas, considero que un flujo adecuado para organizar el desarrollo es el siguiente:
- "Primero defino qué hace mi app (index.ts)"
- "Luego defino dónde corre (index.cdk.ts)"
- "Finalmente defino cómo se ve para el usuario (app.tsx)"
7. ¿Qué Blocks utilicé?
Originalmente pensé que utilizaría los bloques únicamente del lado del backend, pero en la interfaz web terminé utilizando funciones propias de Blocks para el manejo de conversaciones.
Scope
Para la agrupación de recursos.
const scope = new Scope('chatbot');
AuthBasic
Para la configuración de autenticación utilizando correo y contraseña.
const auth = new AuthBasic(scope, 'auth');
Agent
Bloque para el agente de IA con Bedrock, que incluye configuración, streaming y tools. Algo sumamente interesante es que solamente en un par de líneas puedes configurar el comportamiento de tu agente para su interacción.
const agent = new Agent(scope, 'chat', {
model: { deployed: { provider: 'bedrock', modelId: 'amazon.nova-lite-v1:0' } },
systemPrompt: `Eres un agente amigable que se encargará de solucionar dudas a los usuarios sobre tecnología.
Debes responderles en el mismo idioma que te hagan las preguntas.
Cuando el usuario pregunte sobre la empresa, productos, precios o información específica,
usa la herramienta searchKnowledge para buscar en la base de conocimiento antes de responder.
Si no encuentras información relevante en la base de conocimiento, responde con tu conocimiento general.`,
tools: (tool) => ({
searchKnowledge: tool({
description: 'Busca información relevante en la base de conocimiento de la empresa. Usa esta herramienta cuando el usuario pregunte sobre productos, precios, servicios o información específica de la empresa.',
parameters: z.object({
query: z.string().describe('Consulta de búsqueda en lenguaje natural'),
}),
handler: async ({ input }) => {
const results = await kb.retrieve(input.query, { maxResults: 3 });
if (results.length === 0) {
return 'No se encontró información relevante en la base de conocimiento.';
}
return results.map(r => r.text).join('\n\n---\n\n');
},
}),
}),
});
KnowledgeBase
Base de conocimiento RAG con documentos propios que el agente usará para responder.
const kb = new KnowledgeBase(scope, 'docs', {
source: './knowledge',
description: "'Documentación y base de conocimiento del chatbot',"
});
ApiNamespace
Para la comunicación de la API mediante JSON-RPC.
export const api = new ApiNamespace(scope, 'api', (context) => ({}));
8. Desarrollo
Luego de ajustar el código para que fuera funcional, quise probar si funcionaba totalmente en local y la respuesta es que sí: tenía un funcionamiento básico que podía simular usando datos mock en el código. Sin embargo, la funcionalidad del agente sí requiere que al menos hagamos la prueba en el sandbox. Teniendo algo listo, pasé al sandbox.
9. Configuración de IAM
Para poder realizar esto bajo el principio del privilegio mínimo, hice pruebas con los permisos mínimos que debería tener el usuario que ejecutará los deploys. Te dejo a continuación la política:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSBlocksCloudFormationAndIAM",
"Effect": "Allow",
"Action": [
"cloudformation:*",
"iam:CreateRole",
"iam:DeleteRole",
"iam:GetRole",
"iam:GetRolePolicy",
"iam:ListRolePolicies",
"iam:ListAttachedRolePolicies",
"iam:PassRole",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:TagRole"
],
"Resource": "*"
},
{
"Sid": "AWSBlocksAllPossibleFrameworkServices",
"Effect": "Allow",
"Action": [
"lambda:*",
"dynamodb:*",
"apigateway:*",
"s3:*",
"bedrock:*",
"events:*",
"sqs:*",
"ecr:*",
"ssm:*",
"sts:AssumeRole"
],
"Resource": "*"
}
]
}
10. Bootstrap
Inicié con la prueba de sandbox, sin embargo, para esto necesitaba tener el bootstrap listo. El bootstrap es una preparación base para que las aplicaciones de Blocks puedan funcionar correctamente. Esta preparación se realiza una sola vez por cuenta y región. La realizas de esta forma:
npx cdk bootstrap aws://{id_de_tu_cuenta}/{region}
El resultado de esta ejecución es la creación de un CloudFormation y la pregunta más grande: ¿esto genera costos? La respuesta es no, únicamente crea un bucket de S3 vacío, los roles en IAM y un parámetro en SSM. El costo se genera cuando el CDK sube los assets del código estático durante los deploys. Toma en cuenta que para el sandbox el CDK no copia estos archivos, ya que la interfaz sigue corriendo en tu ambiente.
11. Sandbox
Durante la creación del sandbox, encontré diversos retos. Al ser una nueva tecnología, es posible encontrar detalles que puedan generar un funcionamiento inesperado. Puedes iniciar el sandbox ejecutando:
npm run sandbox
Opté por probar el sandbox en la región de us-west-2. La experiencia fue buena y fortalecí mis conocimientos sobre el framework. Te dejo algunos consejos:
1. Crea tags en tu proyecto
Para tener control sobre tus recursos, así como el monitoreo de tus costos.
index.cdk.ts:
import * as cdk from 'aws-cdk-lib';
cdk.Tags.of(blocksStack).add('Project', 'blocks-chatbot-ia');
cdk.Tags.of(blocksStack).add('Environment', sandboxMode ? 'sandbox' : 'production');
cdk.Tags.of(blocksStack).add('Team', 'dev');
cdk.Tags.of(blocksStack).add('CostCenter', 'chatbot-ia');
2. Nombres de stack cortos
En ocasiones los recursos no podrán crearse si el nombre de tu proyecto es muy largo, por lo cual puedes cambiar el nombre base de tu stack, ya que los recursos se crean con este prefijo. Para este caso hice cambios para que el stack fuera el nombre del proyecto definido en el package:
index.cdk.ts:
const stackName = sandboxMode ? pkg.name + `-sandbox` : pkg.name + 'prod';
export const blocksStack = await BlocksStack.create(app, stackName, {
backendHandlerPath: join(__dirname, 'index.handler.ts'),
backendCDKPath: join(__dirname, 'index.ts')
});
3. Cuotas de Bedrock en Organizations
Si tu cuenta forma parte de una organización, recuerda que debes establecer las cuotas en los modelos de Bedrock, de lo contrario no podrás verificar la respuesta de los modelos.
4. Bug de región en @strands-agents/sdk
El bloque @aws-blocks/bb-agent usa internamente el módulo @strands-agents/sdk en su última versión disponible hasta la fecha de la prueba (1.7.0), para guardar las conversaciones del agente en S3. Sin embargo, este módulo por defecto apunta a la región us-east-1, por lo que al intentar hacer uso del agente en otra región podrías tener problemas. Para eso únicamente debes hacer el siguiente cambio:
node_modules/@strands-agents/sdk/dist/src/session/s3-storage.js:
this._s3 = config.s3Client ?? new S3Client({ region: config.region ?? process.env.AWS_REGION ?? 'us-east-1' });
Con este cambio, por defecto ahora revisará la variable de ambiente de la región para que puedas ver el histórico de tus conversaciones. Esta solución es para esa versión. Hice el reporte #120 al equipo de mantenimiento del framework de AWS Blocks y fue resuelto, así que ya es poco probable que encuentres ese error. Te dejo detalles de la corrección que aplicaron:
https://github.com/aws-devtools-labs/aws-blocks/issues/120
Al finalizar las pruebas del sandbox, pude ver un CloudFormation con los diversos recursos creados. En este caso es posible darles un mejor seguimiento gracias a los tags, que identifican a qué proyecto pertenece cada recurso.
12. Despliegue
Al haber realizado las pruebas en el sandbox, solamente queda hacer el deploy para que la aplicación sea accesible para todo el mundo. Es una experiencia satisfactoria, ya que este framework permite llevar a producción aplicaciones estables y seguras utilizando arquitecturas serverless. Para este paso, la diferencia con el sandbox es que se genera el hosting estático almacenado en S3 y distribuido por CloudFront. El tiempo de despliegue fue de 12 minutos.
A continuación podemos ver el funcionamiento del chatbot en ambiente productivo.
13. Limpieza de recursos
Posterior a las pruebas y para no incurrir en gastos, destruí la infraestructura creada. Esto es tan sencillo como ejecutar los siguientes comandos:
Borrar Sandbox:
npm run sandbox:destroy
Borrar despliegue:
npm run destroy
Borrar el CDK (tomar en cuenta que no genera gasto mientras no se transfieran assets):
aws s3 rm s3://cdk-hnb659fds-assets-xxxxx-{region} --recursive --region {region}
aws cloudformation delete-stack --stack-name CDKToolkit --region {region}
Sobre el autor
Luis Fernando de León — AWS Community Builder 🇬🇹
📸 Instagram: instagram.com/luisenlanube
📝 DEV: dev.to/luisferdeleon
👤 Facebook: facebook.com/luisenlanube
💼 LinkedIn: linkedin.com/in/luisfdeleonramirez


Top comments (0)