<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Blog de CloudAcademy]]></title><description><![CDATA[Blog de CloudAcademy]]></description><link>https://blog.cloudacademy.ar</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1765633044762/689fa6e3-2c3b-436a-814c-6516f00113d6.png</url><title>Blog de CloudAcademy</title><link>https://blog.cloudacademy.ar</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 08:18:23 GMT</lastBuildDate><atom:link href="https://blog.cloudacademy.ar/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Prueba técnica Hashnode]]></title><description><![CDATA[Este es un solo título

Este es el contenido normal sin formato especial.]]></description><link>https://blog.cloudacademy.ar/prueba-tecnica-hashnode</link><guid isPermaLink="true">https://blog.cloudacademy.ar/prueba-tecnica-hashnode</guid><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Mon, 06 Apr 2026 12:41:42 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-este-es-un-solo-titulo">Este es un solo título</h1>
<p><img src="https://d1.awsstatic.com/logos/aws-logo-lockups/poweredbyaws/PB_AWS_logo_RGB_stacked.547f032d90171f5c4f3c0e2eaa9f0b0d7c5fd2d.png" alt="Imagen de prueba" /></p>
<p>Este es el contenido normal sin formato especial.</p>
]]></content:encoded></item><item><title><![CDATA[Adiós Ingress NGINX en EKS: Guía Práctica de Migración a Kubernetes Gateway API]]></title><description><![CDATA[Adiós Ingress NGINX en EKS: Guía Práctica de Migración a Kubernetes Gateway API
Palabras clave SEO: Ingress NGINX retirement, Kubernetes Gateway API, EKS migración, AWS Load Balancer Controller, HTTPR]]></description><link>https://blog.cloudacademy.ar/adios-ingress-nginx-en-eks-guia-practica-de-migracion-a-kubernetes-gateway-api</link><guid isPermaLink="true">https://blog.cloudacademy.ar/adios-ingress-nginx-en-eks-guia-practica-de-migracion-a-kubernetes-gateway-api</guid><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Sat, 28 Mar 2026 20:58:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/66103248e2358bdecc56e178/287a96a0-080c-4a4e-a6e9-29eeaf4a12f3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Adiós Ingress NGINX en EKS: Guía Práctica de Migración a Kubernetes Gateway API</h1>
<p><strong>Palabras clave SEO:</strong> Ingress NGINX retirement, Kubernetes Gateway API, EKS migración, AWS Load Balancer Controller, HTTPRoute, ingress2gateway</p>
<hr />
<h2>El fin de una era: Ingress NGINX se retira en marzo 2026</h2>
<p>Si tenés Kubernetes en producción, probablemente usás Ingress NGINX. Y si es así, tenés que leer esto.</p>
<p>La comunidad de Kubernetes anunció el retiro oficial del controlador Ingress NGINX en marzo de 2026. Esto significa <strong>no más releases, no más bug fixes, no más parches de seguridad</strong>. El proyecto está en modo de solo mantenimiento mínimo y se considera EOL (End of Life).</p>
<p>No es un cambio menor. Ingress NGINX es uno de los controladores de ingress más usados del ecosistema, especialmente en Amazon EKS. Pero la buena noticia es que su sucesor — <strong>Kubernetes Gateway API</strong> — es significativamente mejor, y AWS ya tiene soporte GA a través del AWS Load Balancer Controller.</p>
<p>En este artículo te explico por qué Gateway API es superior, y cómo migrar paso a paso en tu clúster EKS.</p>
<hr />
<h2>¿Por qué Gateway API es mejor que Ingress?</h2>
<p>La API de Ingress original fue diseñada para casos simples: enrutar tráfico HTTP/HTTPS. Con el tiempo, los equipos empezaron a meter toda la configuración en anotaciones, resultando en YAML como este:</p>
<pre><code class="language-yaml"># La forma vieja y dolorosa
annotations:
  alb.ingress.kubernetes.io/target-group-attributes: |
    deregistration_delay.timeout_seconds=30,
    stickiness.enabled=true,
    stickiness.type=lb_cookie
  alb.ingress.kubernetes.io/healthcheck-path: /health
  alb.ingress.kubernetes.io/scheme: internet-facing
</code></pre>
<p>Sin validación, sin IDE support, errores que explotan en runtime. Un desastre.</p>
<p>Gateway API resuelve esto con tres mejoras clave:</p>
<h3>1. Modelo orientado a roles</h3>
<p>Gateway API separa responsabilidades claramente:</p>
<table>
<thead>
<tr>
<th>Rol</th>
<th>Recurso</th>
<th>Quién lo gestiona</th>
</tr>
</thead>
<tbody><tr>
<td>Proveedor de infraestructura</td>
<td><code>GatewayClass</code></td>
<td>Equipo de plataforma / AWS</td>
</tr>
<tr>
<td>Operador del clúster</td>
<td><code>Gateway</code></td>
<td>DevOps / SRE</td>
</tr>
<tr>
<td>Desarrollador de la app</td>
<td><code>HTTPRoute</code></td>
<td>Dev teams</td>
</tr>
</tbody></table>
<p>Esto hace que el acceso sea más seguro y el modelo multi-tenant más manejable.</p>
<h3>2. CRDs tipadas con validación</h3>
<p>En vez de anotaciones como strings, usás CRDs con schema validation:</p>
<pre><code class="language-yaml"># La forma nueva con Gateway API
apiVersion: gateway.k8s.aws/v1beta1
kind: TargetGroupConfiguration
spec:
  targetGroupAttributes:
    - key: deregistration_delay.timeout_seconds
      value: "30"
    - key: stickiness.enabled
      value: "true"
</code></pre>
<p>Los errores se detectan en <code>kubectl apply</code>, no en producción.</p>
<h3>3. Soporte para más protocolos</h3>
<p>Ingress solo soporta HTTP/HTTPS. Gateway API soporta también:</p>
<ul>
<li><code>TCPRoute</code> — para bases de datos, gRPC, etc.</li>
<li><code>TLSRoute</code> — terminación TLS a nivel TCP</li>
<li><code>UDPRoute</code> — para casos de uso como DNS o gaming</li>
</ul>
<hr />
<h2>AWS Load Balancer Controller: soporte GA para Gateway API</h2>
<p>En marzo 2026, AWS anunció el soporte en disponibilidad general (GA) para Kubernetes Gateway API en el <strong>AWS Load Balancer Controller</strong>. Esto cubre:</p>
<ul>
<li><strong>ALB</strong> (Application Load Balancer) → tráfico HTTP/HTTPS layer 7</li>
<li><strong>NLB</strong> (Network Load Balancer) → tráfico TCP/UDP layer 4</li>
<li><strong>VPC Lattice</strong> → tráfico east-west entre servicios</li>
</ul>
<p>Es la solución nativa recomendada para EKS.</p>
<hr />
<h2>Guía de migración paso a paso</h2>
<h3>Prerrequisitos</h3>
<ul>
<li>Clúster EKS con Kubernetes 1.29 o posterior</li>
<li><code>kubectl</code> configurado</li>
<li>AWS Load Balancer Controller v2.13.0+</li>
<li>Permisos IAM apropiados para provisionar ALBs/NLBs</li>
</ul>
<h3>Paso 1: Verificar si usás Ingress NGINX</h3>
<pre><code class="language-bash">kubectl get pods --all-namespaces \
  --selector app.kubernetes.io/name=ingress-nginx
</code></pre>
<p>Si devuelve resultados, tenés trabajo por hacer.</p>
<h3>Paso 2: Instalar las CRDs de Gateway API</h3>
<pre><code class="language-bash">kubectl apply -k \
  "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.1.0"
</code></pre>
<p>Verificá que se instalaron:</p>
<pre><code class="language-bash">kubectl get crd | grep gateway
</code></pre>
<p>Deberías ver: <code>gateways.gateway.networking.k8s.io</code>, <code>httproutes.gateway.networking.k8s.io</code>, etc.</p>
<h3>Paso 3: Crear el GatewayClass</h3>
<p>El <code>GatewayClass</code> le dice a Kubernetes qué controlador va a gestionar los Gateways:</p>
<pre><code class="language-yaml">apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: aws-alb
spec:
  controllerName: ingress.k8s.aws/alb
</code></pre>
<pre><code class="language-bash">kubectl apply -f gatewayclass.yaml
</code></pre>
<h3>Paso 4: Crear el Gateway</h3>
<p>El <code>Gateway</code> representa el balanceador de carga real (el ALB en AWS):</p>
<pre><code class="language-yaml">apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: default
  annotations:
    alb.ingress.k8s.aws/scheme: internet-facing
    alb.ingress.k8s.aws/target-type: ip
spec:
  gatewayClassName: aws-alb
  listeners:
  - name: http
    port: 80
    protocol: HTTP
  - name: https
    port: 443
    protocol: HTTPS
    tls:
      mode: Terminate
      certificateRefs:
      - kind: Secret
        name: my-tls-cert
</code></pre>
<p>Verificá que el ALB se provisione:</p>
<pre><code class="language-bash">kubectl get gateway my-gateway -n default
# ADDRESS debería mostrar el DNS del ALB cuando esté listo
</code></pre>
<h3>Paso 5: Migrar los Ingress a HTTPRoutes</h3>
<p>Antes tenías un Ingress así:</p>
<pre><code class="language-yaml"># Ingress NGINX - la forma vieja
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: app.midominio.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 3000
</code></pre>
<p>El equivalente en Gateway API:</p>
<pre><code class="language-yaml"># HTTPRoute - la forma nueva
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-app-route
  namespace: default
spec:
  parentRefs:
  - name: my-gateway
  hostnames:
  - "app.midominio.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: api-service
      port: 80
  - matches:
    - path:
        type: PathPrefix
        value: /web
    backendRefs:
    - name: web-service
      port: 3000
</code></pre>
<h3>Paso 6: Usar ingress2gateway para automatizar la conversión</h3>
<p>Para clústeres con muchos Ingress, usá la herramienta oficial:</p>
<pre><code class="language-bash"># Instalar ingress2gateway
go install sigs.k8s.io/ingress2gateway@latest

# Convertir todos los Ingress NGINX del namespace default
ingress2gateway print \
  --providers=ingress-nginx \
  --namespace=default
</code></pre>
<p>Revisá la salida, ajustá lo necesario y aplicá.</p>
<h3>Paso 7: Estrategia de migración sin downtime</h3>
<p><strong>No apagues Ingress NGINX de golpe.</strong> La estrategia recomendada es correr ambos en paralelo:</p>
<ol>
<li>Desplegá el Gateway y los HTTPRoutes</li>
<li>El ALB nuevo tendrá su propio DNS</li>
<li>Testeá en staging apuntando al DNS nuevo</li>
<li>En producción, hacé el cambio de DNS con TTL bajo (60s)</li>
<li>Monitoreá por 24-48hs</li>
<li>Recién entonces desinstalá Ingress NGINX</li>
</ol>
<pre><code class="language-bash"># Verificar estado de HTTPRoutes
kubectl get httproute -A

# Ver si están Accepted y Programmed
kubectl describe httproute my-app-route
</code></pre>
<hr />
<h2>Consideraciones adicionales</h2>
<h3>cert-manager</h3>
<p>Si usás cert-manager para TLS, tiene soporte nativo para Gateway API desde v1.12. Solo actualizá tu <code>Issuer</code> o <code>ClusterIssuer</code> y usá <code>certificateRefs</code> en el listener del Gateway.</p>
<h3>Anotaciones sin equivalente directo</h3>
<p>Algunas anotaciones muy específicas de Ingress NGINX (como <code>nginx.ingress.kubernetes.io/lua-resty-waf</code>) no tienen equivalente en Gateway API. En esos casos, necesitás evaluar si el AWS Load Balancer Controller (con WAF nativo via AWS WAF) o Envoy Gateway cubren el caso de uso.</p>
<h3>Traffic splitting para canary deployments</h3>
<p>Una de las features más potentes de Gateway API que Ingress no soporta nativamente:</p>
<pre><code class="language-yaml">rules:
- backendRefs:
  - name: my-app-stable
    port: 80
    weight: 90
  - name: my-app-canary
    port: 80
    weight: 10
</code></pre>
<p>Con Ingress necesitabas anotaciones específicas de cada controlador. Con Gateway API es estándar.</p>
<hr />
<h2>Resumen</h2>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Ingress NGINX</th>
<th>Gateway API (AWS LBC)</th>
</tr>
</thead>
<tbody><tr>
<td>Estado</td>
<td>⚠️ EOL marzo 2026</td>
<td>✅ GA, activamente desarrollado</td>
</tr>
<tr>
<td>Validación de config</td>
<td>❌ Strings en anotaciones</td>
<td>✅ CRDs tipadas</td>
</tr>
<tr>
<td>Modelo de roles</td>
<td>❌ Todo mezclado</td>
<td>✅ Infraestructura / Operador / Dev</td>
</tr>
<tr>
<td>Traffic splitting</td>
<td>⚠️ Anotaciones propietarias</td>
<td>✅ Nativo en HTTPRoute</td>
</tr>
<tr>
<td>Soporte TCP/UDP</td>
<td>❌ Solo HTTP/HTTPS</td>
<td>✅ TCPRoute, UDPRoute</td>
</tr>
<tr>
<td>Integración AWS</td>
<td>⚠️ Vía anotaciones</td>
<td>✅ Nativa con ALB/NLB/VPC Lattice</td>
</tr>
</tbody></table>
<p>La migración no es opcional, y tampoco tiene que ser traumática. Con la herramienta <code>ingress2gateway</code> y una estrategia de migración progresiva, podés hacerlo con zero downtime.</p>
<hr />
<p><em>¿Tenés preguntas sobre la migración en tu stack específico? Dejame tu caso en los comentarios.</em></p>
<p><strong>Tags:</strong> Kubernetes, EKS, AWS, DevOps, Gateway API, Ingress, Migración</p>
]]></content:encoded></item><item><title><![CDATA[AWS Strands Agents:
el framework que hace simple lo que antes era complejo]]></title><description><![CDATA[Si trabajás con AWS y empezaste a explorar el mundo de los agentes de IA, probablemente ya te cruzaste con LangChain, CrewAI o AutoGen. Son frameworks que resuelven el problema, pero con un costo alto]]></description><link>https://blog.cloudacademy.ar/aws-strands-agents-el-framework-que-hace-simple-lo-que-antes-era-complejo</link><guid isPermaLink="true">https://blog.cloudacademy.ar/aws-strands-agents-el-framework-que-hace-simple-lo-que-antes-era-complejo</guid><category><![CDATA[Devops]]></category><category><![CDATA[AWS]]></category><category><![CDATA[AI]]></category><category><![CDATA[Amazon Bedrock]]></category><category><![CDATA[agentic AI]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Wed, 04 Mar 2026 21:15:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/66103248e2358bdecc56e178/9837d7f5-51fe-4363-bea5-11d3b3b36278.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Si trabajás con AWS y empezaste a explorar el mundo de los agentes de IA, probablemente ya te cruzaste con LangChain, CrewAI o AutoGen. Son frameworks que resuelven el problema, pero con un costo alto: te obligan a aprender abstracciones propias, manejar estados manualmente y escribir muchísimo código de orquestación que no tiene nada que ver con tu lógica de negocio. Y encima, ninguno de ellos fue diseñado pensando en AWS, lo cual se nota.</p>
<p>En mayo de 2025, AWS lanzó <strong>Strands Agents</strong>, un SDK open source construido desde adentro del ecosistema AWS, por el equipo que ya lo estaba usando en producción en Amazon Q Developer. La filosofía es diferente: en vez de definir flujos de trabajo paso a paso, le das herramientas al modelo y dejás que él decida cómo usarlas. Menos código de infraestructura, más foco en lo que el agente tiene que hacer.</p>
<p>En este artículo vamos a ver cómo funciona Strands desde adentro, cómo conectarlo con los servicios que ya usás en AWS, casos de uso concretos para equipos de DevOps y cómo compara con las alternativas más usadas hoy.</p>
<h2><strong>¿Qué es Strands y cuál es la diferencia?</strong></h2>
<p>Strands no es un framework de orquestación tradicional. La diferencia fundamental está en quién toma las decisiones sobre cómo resolver una tarea: en LangChain o LangGraph, esas decisiones las tomás vos, definiendo grafos de nodos y bordes. En Strands, las toma el modelo de lenguaje.</p>
<p>El concepto central se llama <strong>model-driven approach</strong>: le pasás al LLM un prompt con el objetivo, un conjunto de herramientas disponibles, y él determina por sí mismo qué herramientas invocar, en qué orden, y cómo encadenar los resultados hasta completar la tarea. Esto es el <em>agentic loop</em> de Strands.</p>
<img src="https://cdn.hashnode.com/uploads/covers/66103248e2358bdecc56e178/9fd2da25-0c4c-49b8-94bc-df11742db1bc.png" alt="" style="display:block;margin:0 auto" />

<p>Este enfoque pega muy bien con los modelos actuales, que tienen capacidades de razonamiento mucho más sofisticadas que hace dos años. El equipo de Amazon Q Developer, que es donde nació Strands internamente, reportó que pasó de tardar meses en llevar un agente a producción a hacerlo en días o semanas.</p>
<p>Hoy el SDK tiene más de <strong>14 millones de descargas</strong>, soporte para Python y TypeScript, y se usa en producción dentro de Amazon Q Developer, AWS Glue y el proyecto Kiro (el IDE con IA de AWS).</p>
<blockquote>
<p><strong>📌 Open Source</strong>  </p>
<p>Strands es 100% open source (Apache 2.0). El repositorio está en <code>github.com/strands-agents/sdk-python</code>. No estás atado a AWS para usarlo: soporta Anthropic, OpenAI, Gemini, Ollama, LiteLLM y más como proveedores de modelo.</p>
</blockquote>
<h2><strong>Instalación y primer agente en minutos</strong></h2>
<p>Empezar con Strands es inusualmente simple. No necesitás configurar grafos, definir estados ni registrar handlers. Veamos cómo se ve desde cero.</p>
<h3><strong>Instalación</strong></h3>
<pre><code class="language-plaintext"># Instalar el SDK y el paquete de herramientas pre-construidas
pip install strands-agents strands-agents-tools

# Asegurate de tener credenciales de AWS configuradas
aws configure
# O con variables de entorno:
export AWS_DEFAULT_REGION=us-west-2
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
</code></pre>
<p>Por defecto, Strands usa <strong>Amazon Bedrock</strong> como proveedor de modelo, específicamente Claude 4 Sonnet. Necesitás habilitar acceso al modelo en Bedrock antes de correr cualquier ejemplo.</p>
<h3><strong>El agente más simple posible</strong></h3>
<pre><code class="language-plaintext">from strands import Agent
from strands_tools import calculator, current_time

# Así de simple. Prompt + herramientas = agente funcional.
agent = Agent(
    system_prompt="Sos un asistente técnico para equipos de DevOps.",
    tools=[calculator, current_time]
)

response = agent("¿Cuántos segundos hay en 3 semanas y 2 días?")
print(response)
</code></pre>
<p>El agente va a razonar, elegir la herramienta <code>calculator</code>, calcular el resultado y devolver la respuesta. Sin nada más de tu parte.</p>
<h3><strong>Crear una herramienta personalizada</strong></h3>
<p>Acá está una de las cosas que más me gusta de Strands: convertir cualquier función Python en una herramienta del agente es tan fácil como agregar un decorador. El docstring no es opcional: el modelo lo usa para entender qué hace la herramienta y cuándo invocarla.</p>
<pre><code class="language-plaintext">from strands import Agent, tool
import boto3

@tool
def get_ec2_instances(region: str = "us-east-1") -&gt; str:
    """
    Lista las instancias EC2 corriendo en la región especificada.
    Útil para obtener un inventario del estado actual de la infraestructura.
    """
    ec2 = boto3.client("ec2", region_name=region)
    response = ec2.describe_instances(
        Filters=[{"Name": "instance-state-name", "Values": ["running"]}]
    )
    instances = []
    for reservation in response["Reservations"]:
        for i in reservation["Instances"]:
            name = next(
                (t["Value"] for t in i.get("Tags", []) if t["Key"] == "Name"),
                "Sin nombre"
            )
            instances.append(f"{name} ({i['InstanceId']}) - {i['InstanceType']}")
    
    return "\n".join(instances) if instances else "No hay instancias corriendo"

# El agente ahora sabe que puede usar esta herramienta
agent = Agent(
    system_prompt="Sos un agente de operaciones AWS. Ayudás a los equipos a entender su infraestructura.",
    tools=[get_ec2_instances]
)

agent("Dame un resumen de las instancias que tenemos corriendo en us-east-1")
</code></pre>
<h2><strong>Integración con servicios de AWS</strong></h2>
<p>Acá es donde Strands realmente brilla para quienes ya trabajamos con el ecosistema de AWS. El SDK viene con herramientas pre-construidas para los servicios más usados, y la integración con Bedrock, S3, DynamoDB, Lambda y más es directa.</p>
<h3><strong>Agente con acceso a una Knowledge Base de Bedrock</strong></h3>
<p>Uno de los patrones más potentes: un agente que busca en tu base de conocimiento interna antes de responder. Podés tener documentación de arquitectura, runbooks, post-mortems, todo indexado en Bedrock Knowledge Bases y disponible para el agente.</p>
<pre><code class="language-plaintext">from strands import Agent, tool
import boto3

KNOWLEDGE_BASE_ID = "tu-kb-id"

@tool
def buscar_runbook(query: str) -&gt; str:
    """
    Busca en la base de conocimiento interna runbooks, guías de operaciones
    y documentación de arquitectura. Usá esta herramienta antes de responder
    cualquier pregunta sobre procedimientos o infraestructura.
    """
    client = boto3.client("bedrock-agent-runtime")
    response = client.retrieve(
        knowledgeBaseId=KNOWLEDGE_BASE_ID,
        retrievalQuery={"text": query},
        retrievalConfiguration={
            "vectorSearchConfiguration": {"numberOfResults": 5}
        }
    )
    resultados = []
    for r in response["retrievalResults"]:
        resultados.append(r["content"]["text"])
    
    return "\n---\n".join(resultados)

@tool
def get_cloudwatch_alarms(region: str = "us-east-1") -&gt; str:
    """
    Obtiene las alarmas de CloudWatch en estado ALARM.
    Útil para diagnosticar incidentes en curso.
    """
    cw = boto3.client("cloudwatch", region_name=region)
    response = cw.describe_alarms(StateValue="ALARM")
    alarmas = [a["AlarmName"] for a in response["MetricAlarms"]]
    return f"Alarmas activas: {', '.join(alarmas)}" if alarmas else "Sin alarmas activas"

# Agente de guardia que puede consultar runbooks Y el estado actual
agente_ops = Agent(
    system_prompt="""Sos el asistente de operaciones de turno.
    Antes de responder cualquier pregunta sobre incidentes,
    siempre consultá los runbooks internos y el estado de CloudWatch.""",
    tools=[buscar_runbook, get_cloudwatch_alarms]
)

agente_ops("Tenemos latencia alta en el servicio de pagos. ¿Qué deberíamos revisar?")
</code></pre>
<h3><strong>Integración con MCP (Model Context Protocol)</strong></h3>
<p>Strands tiene soporte nativo para MCP, lo que significa que podés conectar tu agente a miles de servidores MCP disponibles en la comunidad. Bases de datos, APIs de terceros, herramientas de monitoreo, todo sin escribir código de integración desde cero.</p>
<pre><code class="language-plaintext">from strands import Agent
from strands.tools.mcp import MCPClient
from mcp import stdio_client, StdioServerParameters

# Conectar al servidor MCP de AWS (acceso a APIs de AWS via MCP)
aws_mcp = MCPClient(
    lambda: stdio_client(
        StdioServerParameters(command="uvx", args=["awslabs.aws-documentation-mcp-server@latest"])
    )
)

with aws_mcp as client:
    tools = client.list_tools_sync()
    agent = Agent(tools=tools)
    agent("¿Cuáles son los límites por defecto de Lambda en us-east-1?")
</code></pre>
<h3><strong>Deployment en Lambda o EKS</strong></h3>
<p>Para producción, Strands funciona sin problemas dentro de Lambda (para tareas cortas) o en un pod de EKS (para agentes de larga duración). También podés usar <strong>Bedrock AgentCore</strong>, el runtime managed de AWS para agentes, que soporta tareas de hasta 8 horas con gestión de estado incorporada.</p>
<pre><code class="language-plaintext"># Wrapper mínimo para deployar en Lambda
import json
from strands import Agent
from strands.models import BedrockModel

model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-5",
    region_name="us-east-1"
)

agent = Agent(
    model=model,
    system_prompt="Procesás consultas de infraestructura para el equipo de operaciones.",
    tools=[get_ec2_instances, get_cloudwatch_alarms]
)

def handler(event, context):
    query = event.get("query", "")
    response = agent(query)
    return {
        "statusCode": 200,
        "body": json.dumps({"response": str(response)})
    }
</code></pre>
<h2><strong>Multi-agentes: coordinación sin burocracia</strong></h2>
<p>Strands 1.0 introdujo cuatro primitivas para orquestar múltiples agentes. El patrón más usado es <strong>Agents-as-Tools</strong>: transformás agentes especializados en herramientas que un agente orquestador puede invocar.</p>
<pre><code class="language-plaintext">from strands import Agent

# Agente especialista en seguridad
security_agent = Agent(
    system_prompt="Especialista en seguridad AWS. Analizás configuraciones, IAM policies y posibles vectores de ataque.",
    tools=[...herramientas de seguridad...]
)

# Agente especialista en costos
cost_agent = Agent(
    system_prompt="Especialista en optimización de costos AWS. Identificás recursos sobredimensionados y oportunidades de ahorro.",
    tools=[...herramientas de billing y Cost Explorer...]
)

# Orquestador: puede delegar en cualquiera de los dos
orchestrator = Agent(
    system_prompt="Coordinás análisis de infraestructura delegando tareas a especialistas según lo que se necesite.",
    tools=[
        security_agent.as_tool(
            tool_name="analizar_seguridad",
            tool_description="Analiza la postura de seguridad de un servicio o recurso AWS"
        ),
        cost_agent.as_tool(
            tool_name="analizar_costos",
            tool_description="Analiza costos y oportunidades de optimización"
        )
    ]
)

orchestrator("Hacé un análisis completo de nuestro entorno de producción en us-east-1")
</code></pre>
<p><strong>✓ A2A Protocol</strong></p>
<p>Strands 1.0 implementa el protocolo Agent-to-Agent (A2A), lo que permite que agentes de diferentes frameworks o equipos se descubran y comuniquen entre sí. Podés tener un agente Strands coordinando con un agente de otro framework sin escribir código de integración custom.</p>
<h2><strong>Casos de uso para equipos DevOps y AWS</strong></h2>
<img src="https://cdn.hashnode.com/uploads/covers/66103248e2358bdecc56e178/d3aec887-a524-41d5-9e4b-edc9f2b6b2e0.png" alt="" style="display:block;margin:0 auto" />

<h2><strong>Comparación honesta con los frameworks más usados</strong></h2>
<p>El ecosistema de frameworks para agentes explotó en 2025. Cada uno tiene su nicho, y en muchos casos se nota que fueron construidos para el ecosistema OpenAI o Azure, y después adaptados para soportar otros proveedores. Strands nació al revés: primero AWS, y después el resto. Esa diferencia de origen se siente en la práctica.</p>
<table>
<thead>
<tr>
<th><strong>Framework</strong></th>
<th><strong>Filosofía</strong></th>
<th><strong>Curva de aprendizaje</strong></th>
<th><strong>Integración AWS</strong></th>
<th><strong>Multi-agente</strong></th>
<th><strong>Soporte MCP</strong></th>
<th><strong>Ideal para</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Strands (AWS)</strong></td>
<td>Model-driven</td>
<td>🟢 Baja</td>
<td><strong>Nativa</strong></td>
<td><strong>Sí (v1.0)</strong></td>
<td><strong>Sí, nativo</strong></td>
<td>Equipos AWS, agentes autónomos rápidos</td>
</tr>
<tr>
<td><strong>LangGraph</strong></td>
<td>Graph-based, stateful</td>
<td>🔴 Alta</td>
<td>Parcial</td>
<td><strong>Sí, avanzado</strong></td>
<td>Parcial</td>
<td>Workflows complejos, control total del flujo</td>
</tr>
<tr>
<td><strong>CrewAI</strong></td>
<td>Role-based teams</td>
<td>🟡 Media</td>
<td>Limitada</td>
<td><strong>Sí, por diseño</strong></td>
<td>Parcial</td>
<td>Equipos de agentes con roles definidos</td>
</tr>
<tr>
<td><strong>AutoGen (MS)</strong></td>
<td>Conversacional async</td>
<td>🟡 Media</td>
<td>Limitada</td>
<td><strong>Sí</strong></td>
<td>No</td>
<td>Debates multi-agente, integraciones Azure</td>
</tr>
<tr>
<td><strong>OpenAI Agents SDK</strong></td>
<td>Minimalista</td>
<td>🟢 Muy baja</td>
<td>Limitada</td>
<td><strong>Sí</strong></td>
<td>Parcial</td>
<td>Prototipado rápido en el ecosistema OpenAI</td>
</tr>
</tbody></table>
<h3><strong>Strands vs LangGraph: velocidad vs control</strong></h3>
<p>LangGraph es potente, pero tiene un costo: te obliga a pensar en grafos, nodos y bordes antes de escribir una sola línea de lógica real. Para alguien que viene del mundo DevOps y quiere automatizar operaciones, ese modelo mental es una barrera de entrada importante. A eso sumale que la integración con AWS requiere configurar adaptadores extra, y que el stack de observabilidad (LangSmith) es un servicio aparte.</p>
<p>Strands te deja llegar al mismo resultado con mucho menos código. Si tu caso de uso es un workflow determinístico con lógica de negocio muy específica donde cada bifurcación importa, LangGraph tiene su lugar. Pero para la mayoría de los agentes operacionales que necesitan un equipo DevOps, la complejidad de LangGraph es overhead que no agrega valor.</p>
<h3><strong>Strands vs CrewAI: la trampa de los roles rígidos</strong></h3>
<p>CrewAI tiene una propuesta atractiva en papel: modelar el problema como un equipo con roles definidos. El problema es que en operaciones reales, los problemas no llegan etiquetados. Un incidente de producción puede requerir diagnóstico, análisis de costos, revisión de seguridad y comunicación al mismo tiempo, en un orden que no podés predecir. Forzar eso en roles fijos termina siendo una rigidez que juega en contra.</p>
<p>Además, CrewAI fue construido sin pensar en AWS. Conectarlo a tus servicios existentes requiere trabajo extra, y el modelo de costos se puede complicar rápido: un crew con 5 agentes puede costar hasta 5x más en tokens que un único agente Strands bien configurado.</p>
<h3><strong>🎯 Veredicto: si usás AWS, Strands es la respuesta obvia</strong></h3>
<p>Los otros frameworks no nacieron en AWS. Se adaptaron después, y esa diferencia se siente: configuraciones extra, adaptadores, integraciones parciales. Strands es lo contrario: boto3 funciona de entrada, Bedrock es el provider por defecto, y deployar en Lambda o EKS no requiere nada especial. Es el único framework que no te hace sentir que estás peleando contra tu propia infraestructura.</p>
<p>Para equipos DevOps que viven en AWS, la pregunta no debería ser "¿uso Strands o LangChain?". La pregunta es "¿para qué caso puntual podría necesitar más control del que Strands me da?". Y la respuesta honesta es: para la gran mayoría de casos operacionales, Strands alcanza y sobra.</p>
<h2><strong>Cosas a tener en cuenta antes de arrancar</strong></h2>
<p>Strands es sólido, pero como cualquier herramienta tiene sus particularidades. Mejor saberlas de antemano que descubrirlas en producción.</p>
<p><strong>El modelo importa.</strong> La filosofía model-driven funciona muy bien con modelos modernos como Claude 4 en Bedrock. Si usás modelos más chicos o menos capaces, la calidad de razonamiento baja y el agente puede tomar decisiones subóptimas sobre qué herramienta usar. La buena noticia: en Bedrock tenés acceso a los mejores modelos del mercado con un par de líneas de configuración.</p>
<p><strong>La observabilidad requiere un poco de setup.</strong> Strands soporta OpenTelemetry y se integra nativamente con CloudWatch, pero no viene con un dashboard listo para usar. Para producción, conviene invertir unas horas configurando trazas desde el día uno.</p>
<p><strong>Es un framework joven.</strong> Con un año de vida pública, la comunidad externa está creciendo. La documentación oficial de AWS es muy buena, pero el volumen de respuestas en Stack Overflow todavía es menor que en frameworks más viejos. Eso va a cambiar rápido dado el ritmo de adopción.</p>
<p><strong>Monitoreá el uso de tokens.</strong> Los agentes model-driven hacen más llamadas al LLM para razonar. En Bedrock podés configurar presupuestos y alertas de costo desde el día uno, así que esto es más un recordatorio de buenas prácticas que un problema real.</p>
<hr />
<h2><strong>Conclusión</strong></h2>
<p>Strands es lo que pasa cuando el framework lo construye la misma gente que opera la infraestructura. No hay adaptadores, no hay workarounds para hacer que funcione con boto3 o Bedrock, no hay que elegir entre integración nativa y flexibilidad. Simplemente funciona, porque fue diseñado para funcionar así.</p>
<p>La apuesta de AWS con Strands es clara: que construir agentes de IA sobre AWS sea tan natural como construir cualquier otro servicio. Y en gran medida, lo lograron. La misma lógica que usaste para integrar Lambda con S3, o EKS con IAM, aplica para conectar un agente Strands con tus recursos existentes.</p>
<p>Si ya invertiste en el ecosistema AWS, Strands no es solo una opción más. Es el camino natural hacia agentes de IA en producción. Y con 14 millones de descargas en menos de un año y soporte activo del equipo de AWS, la apuesta tiene muy buenas chances de seguir madurando.</p>
<p><strong>🔗 Recursos</strong></p>
<p><strong>Documentación oficial:</strong> <a href="http://strandsagents.com">strandsagents.com</a><br /><strong>GitHub Python SDK:</strong> <a href="https://github.com/strands-agents/sdk-python">github.com/strands-agents/sdk-python</a><br /><strong>Ejemplos y samples:</strong> <a href="https://github.com/strands-agents/samples">github.com/strands-agents/samples</a><br /><strong>Bedrock AgentCore (runtime managed):</strong> AWS Console → Bedrock → AgentCore</p>
]]></content:encoded></item><item><title><![CDATA[Cómo crear una Knowledge Base en AWS Bedrock usando Crawl4AI y S3 Vectors]]></title><description><![CDATA[En los últimos meses, el concepto de retrieval augmented generation (RAG) empezó a aparecer cada vez más en productos, demos y artículos sobre IA. La idea central es simple:en lugar de que un modelo responda solo con lo que “sabe”, le damos documento...]]></description><link>https://blog.cloudacademy.ar/como-crear-una-knowledge-base-en-aws-bedrock-usando-crawl4ai-y-s3-vectors</link><guid isPermaLink="true">https://blog.cloudacademy.ar/como-crear-una-knowledge-base-en-aws-bedrock-usando-crawl4ai-y-s3-vectors</guid><category><![CDATA[Devops]]></category><category><![CDATA[#DevLearning]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[AWS]]></category><category><![CDATA[AI]]></category><category><![CDATA[agentic AI]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Sun, 11 Jan 2026 16:48:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1768149158258/6a790253-ceee-4462-afa5-3aa39de81d67.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En los últimos meses, el concepto de <em>retrieval augmented generation</em> (RAG) empezó a aparecer cada vez más en productos, demos y artículos sobre IA. La idea central es simple:<br />en lugar de que un modelo responda solo con lo que “sabe”, le damos <strong>documentos propios</strong> como fuente de información.</p>
<p>AWS Bedrock incorpora este enfoque a través de las <strong>Knowledge Bases</strong>, una forma administrada de conectar documentos, embeddings y modelos de lenguaje sin tener que construir toda la infraestructura desde cero.</p>
<p>En este artículo vamos a recorrer, paso a paso, cómo crear una Knowledge Base usando documentación pública como ejemplo. No vamos a construir un asistente ni una aplicación final: el objetivo es <strong>entender el proceso completo</strong>, desde los documentos hasta la consulta en Bedrock.</p>
<hr />
<h2 id="heading-que-vamos-a-hacer">Qué vamos a hacer</h2>
<p>A lo largo del artículo vamos a:</p>
<ul>
<li><p>Extraer contenido limpio desde documentación técnica pública</p>
</li>
<li><p>Almacenar esos documentos en Amazon S3</p>
</li>
<li><p>Crear una Knowledge Base en Amazon Bedrock</p>
</li>
<li><p>Sincronizar los documentos</p>
</li>
<li><p>Probar consultas directamente desde la consola</p>
</li>
</ul>
<p>Usaremos la documentación de <strong>Kubernetes</strong> únicamente como <strong>ejemplo</strong>, pero el mismo flujo aplica para:</p>
<ul>
<li><p>documentación interna</p>
</li>
<li><p>manuales técnicos</p>
</li>
<li><p>wikis</p>
</li>
<li><p>guías operativas</p>
</li>
<li><p>o cualquier conjunto de archivos de texto</p>
</li>
</ul>
<hr />
<h2 id="heading-conceptos-clave">Conceptos clave</h2>
<p>Antes de avanzar, vale la pena aclarar algunos conceptos que vamos a usar durante el tutorial.</p>
<h3 id="heading-amazon-bedrock">Amazon Bedrock</h3>
<p>Amazon Bedrock es un servicio administrado de AWS que permite trabajar con modelos fundacionales (como Claude o Titan) sin necesidad de entrenarlos ni desplegarlos.</p>
<p>Entre otras cosas, Bedrock ofrece:</p>
<ul>
<li><p>gestión de modelos</p>
</li>
<li><p>embeddings</p>
</li>
<li><p>y <strong>Knowledge Bases</strong>, que es lo que vamos a usar acá</p>
</li>
</ul>
<hr />
<h3 id="heading-knowledge-base-en-bedrock">Knowledge Base en Bedrock</h3>
<p>Una Knowledge Base es un recurso que conecta:</p>
<ul>
<li><p>documentos almacenados (por ejemplo, en S3)</p>
</li>
<li><p>un modelo de embeddings</p>
</li>
<li><p>un vector store</p>
</li>
<li><p>y un modelo de lenguaje</p>
</li>
</ul>
<p>El resultado es una base de conocimiento que puede responder preguntas <strong>usando exclusivamente los documentos que vos cargaste</strong>, con trazabilidad hacia las fuentes.</p>
<p>En este artículo vamos a crear la Knowledge Base y probarla desde la consola. La integración en una app o chatbot queda para más adelante.</p>
<hr />
<h3 id="heading-crawl4ai">Crawl4AI</h3>
<p>Crawl4AI es una herramienta de scraping pensada específicamente para casos de uso con LLMs.</p>
<p>A diferencia de scrapers tradicionales, su foco está en:</p>
<ul>
<li><p>extraer solo el contenido principal</p>
</li>
<li><p>eliminar navegación, footers y elementos visuales</p>
</li>
<li><p>generar texto limpio en Markdown</p>
</li>
</ul>
<p>Esto es clave cuando el destino final del contenido no es un humano, sino un sistema de embeddings.</p>
<hr />
<h2 id="heading-stack-que-vamos-a-usar">Stack que vamos a usar</h2>
<p>El stack es simple y económico:</p>
<ul>
<li><p><strong>Crawl4AI</strong> – para extraer contenido limpio</p>
</li>
<li><p><strong>Amazon S3</strong> – almacenamiento de documentos</p>
</li>
<li><p><strong>Amazon Bedrock Knowledge Bases</strong> – gestión del RAG</p>
</li>
<li><p><strong>S3 Vector Store</strong> – almacenamiento de embeddings</p>
</li>
</ul>
<hr />
<h2 id="heading-parte-1-setup-del-entorno">Parte 1: Setup del entorno</h2>
<h3 id="heading-pre-requisitos">Pre-requisitos</h3>
<ul>
<li><p>Python 3.11 o superior</p>
</li>
<li><p>AWS CLI configurado</p>
</li>
<li><p>Cuenta de AWS con acceso a Bedrock</p>
</li>
</ul>
<h3 id="heading-instalacion-de-dependencias">Instalación de dependencias</h3>
<pre><code class="lang-plaintext">mkdir scraper-kb-bedrock
cd scraper-kb-bedrock

python3 -m venv venv
source venv/bin/activate

pip install crawl4ai boto3 requests
playwright install
</code></pre>
<hr />
<h3 id="heading-configurar-aws-cli">Configurar AWS CLI</h3>
<pre><code class="lang-plaintext">aws configure
</code></pre>
<p>Configurar:</p>
<ul>
<li><p>Access Key</p>
</li>
<li><p>Secret Key</p>
</li>
<li><p>Región (ej: us-east-1)</p>
</li>
</ul>
<hr />
<h3 id="heading-crear-bucket-s3">Crear bucket S3</h3>
<pre><code class="lang-plaintext">aws s3 mb s3://docs-kb-bedrock --region us-east-1
</code></pre>
<p>Este bucket va a contener los documentos que luego usará la Knowledge Base.</p>
<hr />
<h2 id="heading-parte-2-descubrir-urls-usando-sitemaps">Parte 2: Descubrir URLs usando sitemaps</h2>
<p>Para cargar documentos en una Knowledge Base primero necesitamos <strong>saber qué páginas existen</strong>.</p>
<p>Muchos sitios publican un <strong>sitemap</strong>, un archivo XML que lista todas las URLs disponibles.</p>
<p>En el caso de Kubernetes:</p>
<pre><code class="lang-plaintext">curl -s https://kubernetes.io/en/sitemap.xml | head
</code></pre>
<p>A partir de ese archivo podemos identificar secciones relevantes y decidir qué contenido usar.<br />Para este tutorial vamos a limitarnos a <strong>un conjunto pequeño de páginas</strong>, solo para demostrar el flujo completo.</p>
<hr />
<h2 id="heading-parte-3-scraping-controlado-10-paginas">Parte 3: Scraping controlado (10 páginas)</h2>
<p>En lugar de scrapear cientos de URLs, vamos a hacer algo mucho más simple:<br />extraer <strong>10 páginas reales</strong>, limpiarlas y subirlas a S3.</p>
<p>Esto es suficiente para:</p>
<ul>
<li><p>crear la Knowledge Base</p>
</li>
<li><p>sincronizar documentos</p>
</li>
<li><p>probar consultas en Bedrock</p>
</li>
</ul>
<hr />
<h3 id="heading-script-de-scraping">Script de scraping</h3>
<pre><code class="lang-plaintext">import asyncio
import boto3
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig

BUCKET = "docs-kb-bedrock"

URLS = [
    "https://kubernetes.io/docs/concepts/overview/",
    "https://kubernetes.io/docs/concepts/workloads/pods/",
    "https://kubernetes.io/docs/concepts/services-networking/service/",
    "https://kubernetes.io/docs/concepts/configuration/configmap/",
    "https://kubernetes.io/docs/concepts/workloads/controllers/deployment/",
    "https://kubernetes.io/docs/tasks/run-application/run-stateless-application-deployment/",
    "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/",
    "https://kubernetes.io/docs/tutorials/kubernetes-basics/",
    "https://kubernetes.io/docs/setup/",
    "https://kubernetes.io/docs/reference/glossary/"
]

s3 = boto3.client("s3")

async def scrape():
    config = CrawlerRunConfig(
        excluded_tags=["nav", "footer", "header", "aside"],
        remove_overlay_elements=True,
        word_count_threshold=10
    )

    async with AsyncWebCrawler() as crawler:
        for url in URLS:
            result = await crawler.arun(url=url, config=config)
            if result.success:
                key = f"kubernetes/{url.split('/')[-2]}.md"
                s3.put_object(
                    Bucket=BUCKET,
                    Key=key,
                    Body=result.markdown.encode("utf-8")
                )
                print(f"Subido: {key}")

asyncio.run(scrape())
</code></pre>
<p>Este script:</p>
<ul>
<li><p>extrae contenido limpio</p>
</li>
<li><p>lo guarda como Markdown</p>
</li>
<li><p>lo sube a S3</p>
</li>
</ul>
<hr />
<h2 id="heading-parte-4-crear-la-knowledge-base-en-amazon-bedrock">Parte 4: Crear la Knowledge Base en Amazon Bedrock</h2>
<p>A partir de este punto, todo se hace desde la <strong>consola de AWS</strong>.<br />Esta sección está pensada para acompañar con capturas de pantalla.</p>
<h3 id="heading-crear-la-knowledge-base">Crear la Knowledge Base</h3>
<p>En la consola de Amazon Bedrock:</p>
<ol>
<li><p>Ir a <strong>Knowledge bases</strong></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768156815523/d7b7a8dd-a6a0-4db3-b944-aba3052d9ea1.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Crear una nueva Knowledge Base</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768156867758/77d02ec6-f83a-40f6-b4d4-74a11a9040bf.png" alt class="image--center mx-auto" /></p>
<ol>
<li>Asignarle un nombre y descripción</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768156914476/c96b5fc1-0b94-413b-a00b-9ee2d26b4601.png" alt class="image--center mx-auto" /></p>
<ol>
<li>Crear o reutilizar un rol de IAM</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157008806/2ba33d25-e40b-402c-85c3-ae280c3dd73e.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-configurar-el-data-source">Configurar el data source</h3>
<ul>
<li><p>Tipo: <strong>Amazon S3</strong></p>
</li>
<li><p>Ruta: el prefijo donde subiste los archivos (<code>s3://docs-kb-bedrock/kubernetes/</code>)</p>
</li>
</ul>
<p>Bedrock va a leer automáticamente todos los documentos en ese path.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157082177/102858be-7d33-48cb-b185-82a5a6d0e241.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157127836/66682b6d-4cd1-4802-b613-68b235d629a4.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-embeddings-y-vector-store">Embeddings y vector store</h3>
<ul>
<li><p>Parser: default</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157158529/a83863bf-736a-4592-8b88-b8882f5a5e35.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Chunking: default</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157188194/bbe36d37-6067-4f77-9401-773449553440.png" alt class="image--center mx-auto" /></p>
<ul>
<li>Embeddings: <strong>Amazon Titan Text Embeddings</strong></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157223693/bbcdf008-1001-4d1b-87d8-24114232d6b9.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157253122/da3f33aa-a9b9-400f-b81d-7e8d54ca3c3a.png" alt class="image--center mx-auto" /></p>
<ul>
<li>Vector store: <strong>Amazon S3</strong></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157292809/8ca95e7e-c959-433e-a3a4-9b77ee2fe797.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157315801/d7abbaed-4ecc-42cc-9607-61fbd9cb4b80.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157377652/7000ff7d-23b2-4a23-a47a-ede6b45f8d28.png" alt class="image--center mx-auto" /></p>
<p>Con esta configuración no hace falta administrar bases vectoriales externas.</p>
<hr />
<h3 id="heading-sincronizar-documentos">Sincronizar documentos</h3>
<p>Una vez creada la Knowledge Base:</p>
<ul>
<li>iniciar el proceso de <strong>Sync</strong></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157420568/43ef4421-3621-42c6-96df-04f89061df11.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157444962/9dc102a0-cf66-4b04-9bd7-ecf162f2628d.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p>esperar a que los documentos se procesen</p>
</li>
<li><p>verificar que los chunks fueron generados correctamente</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157484319/c6da0670-6fc3-495d-9bea-6c3e8f08e837.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-parte-5-probar-la-knowledge-base">Parte 5: Probar la Knowledge Base</h2>
<p>Desde la misma consola de Bedrock se puede probar la Knowledge Base sin escribir código.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157547660/79bbaea1-bc38-4d61-bee4-135466bb1e91.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157570721/e5c2ea38-9aa2-402f-a6e3-3bdfa8d22c9b.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157595835/b5557e60-2a0f-439e-a92f-ed2305303c1a.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157679804/d9a087b7-8411-484f-84d0-d41afef12cfb.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157704907/4b4bf451-4cb0-4ae6-8e66-800a77851c23.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768157729149/5b5cdc15-4ba2-480a-a26c-40f1fdb479e3.png" alt class="image--center mx-auto" /></p>
<p>Al hacer una consulta:</p>
<ul>
<li><p>el modelo responde usando los documentos cargados</p>
</li>
<li><p>se muestran las fuentes utilizadas</p>
</li>
<li><p>se puede validar que la información viene efectivamente de S3</p>
</li>
</ul>
<p>Esto confirma que la Knowledge Base está funcionando correctamente.</p>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p>En este artículo creamos una Knowledge Base completa en Amazon Bedrock partiendo únicamente de documentación en texto.</p>
<p>Sin entrenar modelos, sin manejar infraestructura compleja y usando servicios administrados, vimos cómo:</p>
<ul>
<li><p>preparar documentos</p>
</li>
<li><p>almacenarlos correctamente</p>
</li>
<li><p>convertirlos en una base consultable por IA</p>
</li>
</ul>
<p>A partir de acá, esta Knowledge Base puede usarse como base para:</p>
<ul>
<li><p>asistentes conversacionales</p>
</li>
<li><p>APIs internas</p>
</li>
<li><p>herramientas de búsqueda semántica</p>
</li>
<li><p>o sistemas de soporte basados en documentación</p>
</li>
</ul>
<p>En próximos artículos, el foco estará en <strong>cómo consumir esta Knowledge Base desde aplicaciones reales</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[AWS Nuke: Qué es, para qué sirve y cómo eliminar cuentas de AWS de forma segura]]></title><description><![CDATA[Cuando trabajás con AWS en serio —múltiples cuentas, entornos sandbox, CI/CD, pruebas automatizadas— limpiar recursos manualmente deja de ser una opción.Ahí aparece una herramienta tan poderosa como peligrosa si no se entiende bien: AWS Nuke.
En este...]]></description><link>https://blog.cloudacademy.ar/aws-nuke-que-es-para-que-sirve-y-como-eliminar-cuentas-de-aws-de-forma-segura</link><guid isPermaLink="true">https://blog.cloudacademy.ar/aws-nuke-que-es-para-que-sirve-y-como-eliminar-cuentas-de-aws-de-forma-segura</guid><category><![CDATA[#AWSNuke]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Devops]]></category><category><![CDATA[cloud security]]></category><category><![CDATA[Cloud Governance]]></category><category><![CDATA[Security]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Mon, 15 Dec 2025 03:00:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764502920376/2fc6ff70-b22c-46f9-81b9-b773d33e9043.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Cuando trabajás con AWS en serio —múltiples cuentas, entornos sandbox, CI/CD, pruebas automatizadas— limpiar recursos manualmente deja de ser una opción.<br />Ahí aparece una herramienta tan poderosa como peligrosa si no se entiende bien: <strong>AWS Nuke</strong>.</p>
<p>En este artículo vamos a ver:</p>
<ul>
<li><p>✅ Qué es AWS Nuke</p>
</li>
<li><p>✅ Para qué sirve (y para qué <strong>no</strong>)</p>
</li>
<li><p>✅ Cómo funciona internamente</p>
</li>
<li><p>✅ Ejemplos de uso reales</p>
</li>
<li><p>✅ Buenas prácticas y advertencias</p>
</li>
</ul>
<hr />
<h2 id="heading-que-es-aws-nuke">¿Qué es AWS Nuke?</h2>
<p><strong>AWS Nuke</strong> es una herramienta open source creada por <strong>Rebuy</strong> que permite <strong>eliminar casi todos los recursos de una cuenta de AWS de forma automática</strong>.</p>
<p>👉 En pocas palabras:</p>
<blockquote>
<p>AWS Nuke destruye una cuenta de AWS para dejarla totalmente limpia.</p>
</blockquote>
<p>Funciona vía AWS APIs y es capaz de borrar:</p>
<ul>
<li><p>EC2, EBS, AMIs</p>
</li>
<li><p>S3 buckets</p>
</li>
<li><p>RDS, DynamoDB</p>
</li>
<li><p>Lambda</p>
</li>
<li><p>API Gateway</p>
</li>
<li><p>EKS / ECS</p>
</li>
<li><p>CloudWatch</p>
</li>
<li><p>IAM roles (no root)</p>
</li>
<li><p>Y muchos más</p>
</li>
</ul>
<hr />
<h2 id="heading-por-que-existe-aws-nuke">¿Por qué existe AWS Nuke?</h2>
<p>Porque AWS <strong>NO tiene un botón de “delete everything”</strong>.</p>
<p>Usos típicos:</p>
<ul>
<li><p>Cuentas sandbox descartables</p>
</li>
<li><p>Ambientes de testing automatizado</p>
</li>
<li><p>Laboratorios de training</p>
</li>
<li><p>Reset completo antes de reutilizar una cuenta</p>
</li>
<li><p>CI/CD que crea infraestructura efímera</p>
</li>
</ul>
<hr />
<h2 id="heading-que-no-es-aws-nuke">¿Qué NO es AWS Nuke?</h2>
<p>❌ No es una herramienta de limpieza selectiva<br />❌ No es para producción<br />❌ No es “terraform destroy”<br />❌ No tiene rollback</p>
<p>💡 Si lo ejecutás mal, <strong>perdés la cuenta completa</strong> (datos incluidos).</p>
<hr />
<h2 id="heading-como-funciona-aws-nuke">Cómo funciona AWS Nuke</h2>
<p>El flujo general es:</p>
<ol>
<li><p>Se conecta a una cuenta AWS usando credenciales</p>
</li>
<li><p>Lista todos los recursos soportados</p>
</li>
<li><p>Aplica filtros y exclusiones</p>
</li>
<li><p>Elimina recurso por recurso</p>
</li>
<li><p>Reintenta hasta que no queda nada</p>
</li>
</ol>
<p>⚠️ Algunos recursos requieren múltiples pasadas (por dependencias).</p>
<hr />
<h2 id="heading-instalacion-de-aws-nuke">Instalación de AWS Nuke</h2>
<h3 id="heading-opcion-1-binario">Opción 1: Binario</h3>
<pre><code class="lang-plaintext">brew install aws-nuke
</code></pre>
<p>o descargando el binario desde GitHub.</p>
<h3 id="heading-opcion-2-docker-muy-recomendado">Opción 2: Docker (muy recomendado)</h3>
<pre><code class="lang-plaintext">docker run --rm -it \
  -v $(pwd)/config.yml:/config.yml \
  quay.io/rebuy/aws-nuke:v2.25.0 \
  aws-nuke -c /config.yml --dry-run
</code></pre>
<hr />
<h2 id="heading-archivo-de-configuracion-configyml">Archivo de configuración (config.yml)</h2>
<p>Ejemplo básico:</p>
<pre><code class="lang-plaintext">regions:
  - us-east-1
  - global

account-blocklist:
  - "123456789012" # Cuenta productiva (NUNCA NUKLEAR)

accounts:
  "111111111111":
    filters:
      IAMUser:
        - "admin"
</code></pre>
<hr />
<h2 id="heading-conceptos-clave-del-config">🔎 Conceptos clave del config</h2>
<h3 id="heading-regions">✅ regions</h3>
<p>Define dónde buscar y borrar recursos.</p>
<h3 id="heading-account-blocklist">✅ account-blocklist</h3>
<p><strong>Crítico. Obligatorio.</strong><br />Previene nukear cuentas prohibidas.</p>
<p>✅ Best practice: incluir SIEMPRE la cuenta root y producción.</p>
<hr />
<h2 id="heading-dry-run-modo-seguro">Dry Run (modo seguro)</h2>
<p>Antes de ejecutar nada:</p>
<pre><code class="lang-plaintext">aws-nuke -c config.yml --dry-run
</code></pre>
<p>Este modo:</p>
<ul>
<li><p>No elimina nada</p>
</li>
<li><p>Muestra exactamente qué se borraría</p>
</li>
<li><p>Es <strong>obligatorio</strong> correrlo siempre</p>
</li>
</ul>
<p>💡 Nunca ejecutes AWS Nuke en modo activo sin un dry-run previo.</p>
<hr />
<h2 id="heading-ejemplo-1-limpiar-una-cuenta-sandbox">Ejemplo 1: Limpiar una cuenta sandbox</h2>
<p>Caso típico:</p>
<ul>
<li><p>Developers prueban cosas</p>
</li>
<li><p>Recursos quedan colgados</p>
</li>
<li><p>Costos innecesarios</p>
</li>
</ul>
<p>Config simple:</p>
<pre><code class="lang-plaintext">regions:
  - us-east-1
  - global

account-blocklist:
  - "999999999999"

accounts:
  "111111111111": {}
</code></pre>
<p>Ejecución real:</p>
<pre><code class="lang-plaintext">aws-nuke -c config.yml --no-dry-run
</code></pre>
<p>Resultado:<br />✅ Cuenta completamente vacía<br />✅ Lista para reutilizar</p>
<hr />
<h2 id="heading-ejemplo-2-integracion-con-cicd">Ejemplo 2: Integración con CI/CD</h2>
<p>Uso común:</p>
<ul>
<li><p>Pipeline crea una cuenta temporal</p>
</li>
<li><p>Ejecuta tests</p>
</li>
<li><p>Al final → <strong>nuke automático</strong></p>
</li>
</ul>
<p>Ejemplo en pipeline:</p>
<pre><code class="lang-plaintext">aws-nuke -c config.yml --force --no-dry-run
</code></pre>
<p>Flags importantes:</p>
<ul>
<li><p><code>--force</code>: no pide confirmación interactiva</p>
</li>
<li><p><code>--no-dry-run</code>: ejecuta de verdad</p>
</li>
</ul>
<p>⚠️ Usar solo en cuentas descartables.</p>
<hr />
<h2 id="heading-ejemplo-3-training-y-workshops">Ejemplo 3: Training y workshops</h2>
<p>En workshops:</p>
<ul>
<li><p>Cada alumno tiene su cuenta</p>
</li>
<li><p>Al finalizar el día → reset total</p>
</li>
</ul>
<p>AWS Nuke permite:</p>
<ul>
<li><p>Evitar costos residuales</p>
</li>
<li><p>Reutilizar cuentas para el próximo grupo</p>
</li>
<li><p>Garantizar entorno limpio</p>
</li>
</ul>
<hr />
<h2 id="heading-filtros-y-exclusiones">Filtros y exclusiones</h2>
<p>AWS Nuke <strong>NO puede borrar todo</strong> (ej: root user), pero sí casi todo.</p>
<p>Ejemplo: proteger un bucket específico</p>
<pre><code class="lang-plaintext">accounts:
  "111111111111":
    filters:
      S3Bucket:
        - "important-logs-bucket"
</code></pre>
<hr />
<h2 id="heading-seguridad-y-buenas-practicas">Seguridad y buenas prácticas</h2>
<p>✅ Usar siempre:</p>
<ul>
<li><p>SCPs que bloqueen AWS Nuke en prod</p>
</li>
<li><p>account-blocklist</p>
</li>
<li><p>Dry run obligatorio</p>
</li>
</ul>
<p>✅ Ejecutar desde:</p>
<ul>
<li><p>Cuenta de seguridad</p>
</li>
<li><p>Rol dedicado</p>
</li>
<li><p>Pipeline controlado</p>
</li>
</ul>
<p>❌ Nunca:</p>
<ul>
<li><p>Ejecutar manualmente “por las dudas”</p>
</li>
<li><p>Usar en prod</p>
</li>
<li><p>Omitir blocklist</p>
</li>
</ul>
<hr />
<h2 id="heading-aws-nuke-scps-combinacion-ideal">AWS Nuke + SCPs (combinación ideal)</h2>
<p>Una muy buena práctica es:</p>
<ul>
<li><p>✅ SCP bloquea acciones destructivas en prod</p>
</li>
<li><p>✅ AWS Nuke solo funciona en:</p>
<ul>
<li><p>Sandbox</p>
</li>
<li><p>Dev</p>
</li>
<li><p>Accounts efímeras</p>
</li>
</ul>
</li>
</ul>
<p>Esto alinea perfecto con:</p>
<ul>
<li><p>AWS CAF</p>
</li>
<li><p>Control preventivo</p>
</li>
<li><p>Gobierno organizacional</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p><strong>AWS Nuke es una motosierra.</strong></p>
<p>En manos correctas:<br />✅ Ahorra tiempo<br />✅ Reduce costos<br />✅ Automatiza limpieza</p>
<p>En manos incorrectas:<br />💥 Destrucción total</p>
<p>Si trabajás con AWS a escala, <strong>AWS Nuke no es opcional</strong>, pero <strong>el gobierno sí es obligatorio</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[Llega AWS Lambda Managed Instances]]></title><description><![CDATA[¿Serverless o Servidores? Por fin, lo mejor de los dos mundos.
Durante años, los desarrolladores en el ecosistema de AWS han enfrentado una disyuntiva difícil. O elegías la simplicidad operativa de AWS Lambda (el famoso "code-and-go"), o elegías Amaz...]]></description><link>https://blog.cloudacademy.ar/llega-aws-lambda-managed-instances</link><guid isPermaLink="true">https://blog.cloudacademy.ar/llega-aws-lambda-managed-instances</guid><category><![CDATA[AWS]]></category><category><![CDATA[lambda]]></category><category><![CDATA[serverless]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Tue, 09 Dec 2025 03:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765023313581/57cde045-b843-40c7-bbb3-459c86987f98.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>¿Serverless o Servidores? Por fin, lo mejor de los dos mundos.</strong></p>
<p>Durante años, los desarrolladores en el ecosistema de AWS han enfrentado una disyuntiva difícil. O elegías la simplicidad operativa de <strong>AWS Lambda</strong> (el famoso "code-and-go"), o elegías <strong>Amazon EC2</strong> para acceder a hardware especializado y modelos de precios más económicos.</p>
<p>Si necesitabas arquitecturas de CPU específicas o querías aprovechar los <em>Compute Savings Plans</em> para cargas de trabajo constantes, a menudo tenías que sacrificar la facilidad de Lambda y asumir la carga de gestionar la infraestructura.</p>
<p><strong>Hoy, ese compromiso se acaba.</strong></p>
<p>AWS ha anunciado <strong>Lambda Managed Instances</strong>, una nueva capacidad que te permite ejecutar funciones Lambda en instancias EC2, mientras AWS se encarga del trabajo pesado.</p>
<h2 id="heading-que-es-aws-lambda-managed-instances">¿Qué es AWS Lambda Managed Instances?</h2>
<p>En pocas palabras, esta función te permite definir <strong>cómo</strong> se ejecutan tus funciones Lambda en instancias EC2, sin obligarte a gestionar esas instancias tú mismo.</p>
<p>AWS sigue encargándose de la complejidad operativa: gestión del ciclo de vida, parches del sistema operativo, balanceo de carga y auto-escalado. Tú obtienes el acceso a los perfiles de cómputo especializados que necesitas.</p>
<h3 id="heading-como-funciona-el-capacity-provider">¿Cómo funciona? El "Capacity Provider"</h3>
<p>El mecanismo central detrás de esta característica es el <strong>Capacity Provider</strong>. En lugar de simplemente desplegar una función, configuras este proveedor donde especificas:</p>
<ul>
<li><p><strong>Configuración de Red:</strong> La VPC, subnets y grupos de seguridad.</p>
</li>
<li><p><strong>Selección de Instancia:</strong> Tipos específicos de EC2 (o una mezcla para diversidad), incluyendo acceso a <strong>AWS Graviton4</strong>.</p>
</li>
<li><p><strong>Controles de Escalado:</strong> Cantidad máxima de vCPUs y políticas de escalado.</p>
</li>
</ul>
<p>Una vez configurado, simplemente adjuntas tu función Lambda a este Capacity Provider mediante su ARN.</p>
<h2 id="heading-las-ventajas-clave">Las Ventajas Clave</h2>
<ol>
<li><p><strong>Fin de los "Cold Starts":</strong> Las peticiones se enrutan a entornos de ejecución pre-aprovisionados, eliminando la latencia de espera a que el código "despierte".</p>
</li>
<li><p><strong>Control de Hardware:</strong> Acceso a requisitos específicos como redes de alto ancho de banda o arquitecturas de CPU concretas.</p>
</li>
<li><p><strong>Experiencia Serverless:</strong> No necesitas configurar balanceadores de carga ni escribir políticas complejas de auto-scaling.</p>
</li>
<li><p><strong>Optimización de Costos:</strong> Aquí cambia la economía. Puedes aplicar modelos de precios basados en compromisos de EC2 (<strong>Savings Plans</strong> y <strong>Reserved Instances</strong>) a tus cargas de trabajo Lambda.</p>
</li>
</ol>
<h2 id="heading-advertencia-critica-para-desarrolladores-thread-safety">⚠️ Advertencia Crítica para Desarrolladores: Thread Safety</h2>
<p>Uno de los cambios técnicos más significativos es la <strong>Multiconcurrencia</strong>. A diferencia de las funciones Lambda estándar, donde un entorno de ejecución maneja una sola petición a la vez, las Managed Instances permiten que un solo entorno procese <strong>múltiples peticiones simultáneamente</strong>.</p>
<p>Esto maximiza el uso de recursos, pero implica un riesgo: <strong>tu código debe ser "Thread-Safe" (seguro para hilos).</strong></p>
<p>Antes de migrar, debes revisar tu código en busca de:</p>
<ul>
<li><p><strong>Archivos:</strong> Escrituras en rutas de archivo que no sean únicas por petición (cuidado con <code>/tmp</code> si no usas nombres aleatorios).</p>
</li>
<li><p><strong>Memoria:</strong> Espacios de memoria compartida o variables globales que cambien de estado entre invocaciones.</p>
</li>
</ul>
<h2 id="heading-el-nuevo-modelo-de-precios">El Nuevo Modelo de Precios</h2>
<p>La estructura de precios es distinta a la de Lambda estándar y se compone de tres partes:</p>
<ol>
<li><p><strong>Cargo por Petición Estándar:</strong> Pagas la tarifa habitual de Lambda ($0.20 por millón de invocaciones).</p>
</li>
<li><p><strong>Cargos de Instancia EC2:</strong> Pagas por la capacidad de cómputo provisionada. <strong>Crucialmente</strong>, aquí es donde puedes aplicar descuentos de hasta un <strong>72%</strong> con Savings Plans.</p>
</li>
<li><p><strong>Tarifa de Gestión (Management Fee):</strong> Una tarifa del <strong>15%</strong> calculada sobre el precio On-Demand de la instancia EC2 para cubrir la gestión operativa de AWS.</p>
</li>
</ol>
<p><strong>Dato importante:</strong> A diferencia del Lambda tradicional, <strong>no se te cobra por separado por la duración de la ejecución</strong>por petición. Esto hace que Managed Instances sea altamente atractivo para cargas de trabajo de alto tráfico y estado constante (<em>steady-state</em>).</p>
<h2 id="heading-disponibilidad">Disponibilidad</h2>
<p>El servicio ya está disponible en las regiones de <strong>US East (N. Virginia &amp; Ohio), US West (Oregon), Asia Pacific (Tokyo) y Europe (Ireland)</strong>. Actualmente soporta las últimas versiones de <strong>Node.js, Java, .NET y Python</strong>.</p>
<h2 id="heading-conclusion">Conclusión</h2>
<p>Este lanzamiento representa un cambio masivo en cómo arquitectamos aplicaciones serverless. Es la victoria definitiva para las cargas de trabajo constantes: eliminas los arranques en frío y finalmente puedes aplicar grandes descuentos de EC2 a tu factura serverless.</p>
<p>Si tienes procesos pesados donde Lambda era demasiado caro o poco potente, es hora de probar Managed Instances.</p>
<hr />
<p><em>Fuente y más información técnica en el anuncio oficial:</em> <a target="_blank" href="https://aws.amazon.com/es/blogs/aws/introducing-aws-lambda-managed-instances-serverless-simplicity-with-ec2-flexibility/"><em>AWS Blog - Introducing AWS Lambda Managed Instances</em></a></p>
]]></content:encoded></item><item><title><![CDATA[Guardrails en AWS: Protección organizacional con Service Control Policies (SCP)]]></title><description><![CDATA[Cuando una organización empieza a crecer en AWS, los mayores riesgos no suelen ser solo ataques externos, sino configuraciones incorrectas, uso indebido de privilegios y explosiones de costos.Para mitigar esos riesgos, AWS Organizations ofrece una he...]]></description><link>https://blog.cloudacademy.ar/guardrails-en-aws-proteccion-organizacional-con-service-control-policies-scp</link><guid isPermaLink="true">https://blog.cloudacademy.ar/guardrails-en-aws-proteccion-organizacional-con-service-control-policies-scp</guid><category><![CDATA[#AWSSecurit]]></category><category><![CDATA[AWS]]></category><category><![CDATA[cloud security]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Cloud Governance]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Sun, 30 Nov 2025 11:19:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764501463757/b1f70354-e486-4ee3-80b8-4574ffaface4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Cuando una organización empieza a crecer en AWS, los mayores riesgos no suelen ser solo ataques externos, sino <strong>configuraciones incorrectas, uso indebido de privilegios y explosiones de costos</strong>.<br />Para mitigar esos riesgos, AWS Organizations ofrece una herramienta clave: <strong>Service Control Policies (SCPs)</strong>.</p>
<p>Además, las SCPs juegan un rol fundamental dentro del <strong>AWS Cloud Adoption Framework (CAF)</strong>, específicamente en el <strong>dominio de Seguridad</strong>, ayudando a implementar gobierno, control preventivo y seguridad por diseño.</p>
<hr />
<h2 id="heading-que-son-las-scp-service-control-policies">¿Qué son las SCP (Service Control Policies)?</h2>
<p>Las <strong>Service Control Policies</strong> permiten definir <strong>guardrails obligatorios</strong> que determinan qué acciones <strong>pueden o no</strong> ejecutarse dentro de una cuenta de AWS, sin importar los permisos IAM configurados.</p>
<p>✅ Se aplican a nivel <strong>Organización / OU / Cuenta</strong><br />✅ No otorgan permisos, solo los <strong>restringen</strong><br />✅ Afectan a <strong>usuarios, roles y root</strong><br />✅ Son evaluadas antes que IAM</p>
<p><strong>Concepto clave:</strong></p>
<blockquote>
<p>Una SCP define el <em>límite máximo</em> de lo que una cuenta puede hacer.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764542307908/74b52e51-8ef6-4bf7-affe-6898091a9da9.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-relacion-entre-scps-e-iam">Relación entre SCPs e IAM</h2>
<p>El modelo mental correcto es:</p>
<pre><code class="lang-plaintext">SCP (Organizations)
   ↓
IAM Policies (Account)
   ↓
Permiso final efectivo
</code></pre>
<p>Aunque una IAM policy permita una acción, <strong>si la SCP la niega, la acción jamás se ejecuta</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764541523872/cb422b03-6e38-47fb-b4a4-333853941f07.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-scps-y-el-aws-cloud-adoption-framework-caf">SCPs y el AWS Cloud Adoption Framework (CAF)</h2>
<p>Dentro del <strong>AWS CAF</strong>, las SCPs impactan directamente en el <strong>pilar de Seguridad</strong>, principalmente en:</p>
<ul>
<li><p><strong>Preventive Controls</strong></p>
</li>
<li><p><strong>Identity and Access Management</strong></p>
</li>
<li><p><strong>Governance</strong></p>
</li>
<li><p><strong>Cost Control (shared responsibility)</strong></p>
</li>
</ul>
<p>Las SCPs permiten aplicar <strong>controles preventivos</strong>, evitando incidentes <strong>antes</strong> de que ocurran, en lugar de detectarlos después.</p>
<p><img src="https://miro.medium.com/v2/resize:fit:1400/1*ZRrQi8tH82qPwm0hvyOVkQ.png" alt="AWS Cloud Adoption Framework (CAF): Security Perspective Explained | by  Rabbiyatabassum | Oct, 2025 | Medium" /></p>
<hr />
<h1 id="heading-scp-1-identity-guardrails">🧱 SCP #1 — Identity Guardrails</h1>
<h3 id="heading-name">🏷️ Name</h3>
<p><code>identity-guardrails</code></p>
<h3 id="heading-description">📝 Description</h3>
<p>Prevent IAM users and access keys creation. Enforce IAM Identity Center usage.</p>
<h3 id="heading-objetivo">🎯 Objetivo</h3>
<p>Forzar un modelo moderno y seguro de identidad:</p>
<ul>
<li><p>❌ No más usuarios IAM</p>
</li>
<li><p>❌ No más access keys permanentes</p>
</li>
<li><p>✅ Solo IAM Identity Center (SSO) y roles temporales</p>
</li>
</ul>
<hr />
<h3 id="heading-policy-json">📄 Policy (JSON)</h3>
<pre><code class="lang-plaintext">{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyIAMUserAndAccessKeyManagement",
      "Effect": "Deny",
      "Action": [
        "iam:CreateUser",
        "iam:DeleteUser",
        "iam:CreateAccessKey",
        "iam:UpdateAccessKey",
        "iam:DeleteAccessKey"
      ],
      "Resource": "*"
    }
  ]
}
</code></pre>
<h3 id="heading-alineacion-caf-seguridad">✅ Alineación CAF – Seguridad</h3>
<ul>
<li><p>Identity &amp; Access Management</p>
</li>
<li><p>Least Privilege</p>
</li>
<li><p>Preventive Controls</p>
</li>
</ul>
<hr />
<h1 id="heading-scp-2-region-guardrails">🧱 SCP #2 — Region Guardrails</h1>
<h3 id="heading-name-1">🏷️ Name</h3>
<p><code>region-guardrails</code></p>
<h3 id="heading-description-1">📝 Description</h3>
<p>Restrict AWS usage to approved regions only.</p>
<h3 id="heading-objetivo-1">🎯 Objetivo</h3>
<p>Evitar:</p>
<ul>
<li><p>Recursos creados en regiones no aprobadas</p>
</li>
<li><p>Costos inesperados</p>
</li>
<li><p>Problemas de compliance</p>
</li>
</ul>
<p><img src="https://kodekloud.com/community/uploads/db1265/original/3X/8/f/8f04b9de6817de3c205ad96797dae6d1733c7443.png" alt="Access denied while creating any resource in Pulumi + AWS Playground -  Playgrounds - KodeKloud - DevOps Learning Community" /></p>
<hr />
<h3 id="heading-solo-us-east-1-permitido">✅ Solo <code>us-east-1</code> permitido</h3>
<pre><code class="lang-plaintext">{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAllRegionsExceptUSEast1",
      "Effect": "Deny",
      "NotAction": [
        "account:*",
        "billing:*",
        "iam:*",
        "organizations:*",
        "support:*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": "us-east-1"
        }
      },
      "Resource": "*"
    }
  ]
}
</code></pre>
<h3 id="heading-alineacion-caf-seguridad-1">✅ Alineación CAF – Seguridad</h3>
<ul>
<li><p>Governance</p>
</li>
<li><p>Compliance</p>
</li>
<li><p>Data residency controls</p>
</li>
</ul>
<hr />
<h1 id="heading-scp-3-root-guardrails">🧱 SCP #3 — Root Guardrails</h1>
<h3 id="heading-name-2">🏷️ Name</h3>
<p><code>root-guardrails</code></p>
<h3 id="heading-description-2">📝 Description</h3>
<p>Deny root account usage except for billing and support operations.</p>
<h3 id="heading-objetivo-2">🎯 Objetivo</h3>
<p>Eliminar el uso operativo del usuario root.</p>
<hr />
<h3 id="heading-policy-json-1">📄 Policy (JSON)</h3>
<pre><code class="lang-plaintext">{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyRootAccountUsage",
      "Effect": "Deny",
      "Condition": {
        "StringLike": {
          "aws:PrincipalArn": "arn:aws:iam::*:root"
        }
      },
      "NotAction": [
        "account:*",
        "billing:*",
        "payments:*",
        "support:*",
        "tax:*"
      ],
      "Resource": "*"
    }
  ]
}
</code></pre>
<h3 id="heading-alineacion-caf-seguridad-2">✅ Alineación CAF – Seguridad</h3>
<ul>
<li><p>Account Protection</p>
</li>
<li><p>Identity Hardening</p>
</li>
<li><p>Blast Radius Reduction</p>
</li>
</ul>
<hr />
<h1 id="heading-scp-4-cost-explosion-prevention">🧱 SCP #4 — Cost Explosion Prevention ✅</h1>
<h3 id="heading-name-3">🏷️ Name</h3>
<p><code>cost-explosion-prevention</code></p>
<h3 id="heading-description-3">📝 Description</h3>
<p>Prevent cost explosions by blocking high-cost EC2 instances, uncontrolled Auto Scaling, and Lambda functions without concurrency limits.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764541823769/0ce56bae-1d3c-4612-9b52-cfccf350cf0d.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-policy-json-2">📄 Policy (JSON)</h3>
<pre><code class="lang-plaintext">{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyHighCostEC2InstanceTypes",
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Condition": {
        "ForAnyValue:StringLike": {
          "ec2:InstanceType": [
            "p*",
            "g*",
            "inf*",
            "trn*",
            "hpc*"
          ]
        }
      },
      "Resource": "*"
    },
    {
      "Sid": "LimitAutoScalingCapacity",
      "Effect": "Deny",
      "Action": [
        "autoscaling:SetDesiredCapacity",
        "autoscaling:UpdateAutoScalingGroup"
      ],
      "Condition": {
        "NumericGreaterThan": {
          "autoscaling:DesiredCapacity": "5"
        }
      },
      "Resource": "*"
    },
    {
      "Sid": "RequireLambdaConcurrencyLimit",
      "Effect": "Deny",
      "Action": [
        "lambda:CreateFunction",
        "lambda:UpdateFunctionConfiguration"
      ],
      "Condition": {
        "Null": {
          "lambda:ReservedConcurrentExecutions": "true"
        }
      },
      "Resource": "*"
    }
  ]
}
</code></pre>
<h3 id="heading-alineacion-caf-seguridad-3">✅ Alineación CAF – Seguridad</h3>
<ul>
<li><p>Financial Governance</p>
</li>
<li><p>Preventive Technical Controls</p>
</li>
<li><p>Shared Responsibility (Security &amp; Cost)</p>
</li>
</ul>
<hr />
<h2 id="heading-donde-aplicar-estas-scps">¿Dónde aplicar estas SCPs?</h2>
<p>📸 <strong>(ACÁ PONER CAPTURA — Organizational Units con SCPs asociadas)</strong></p>
<p>Ejemplo recomendado:</p>
<pre><code class="lang-plaintext">Root OU
 ├─ Security
 ├─ Shared-Services
 ├─ Production
 └─ Sandbox
</code></pre>
<hr />
<h2 id="heading-conclusion">Conclusión</h2>
<p>Las <strong>Service Control Policies</strong> no solo refuerzan la seguridad técnica, sino que también:</p>
<ul>
<li><p>✅ Alinean la cuenta con el <strong>AWS CAF</strong></p>
</li>
<li><p>✅ Implementan <strong>controles preventivos reales</strong></p>
</li>
<li><p>✅ Reducen riesgos técnicos y financieros</p>
</li>
<li><p>✅ Profesionalizan el gobierno de AWS</p>
</li>
</ul>
<p>En AWS, <strong>la seguridad madura empieza por los guardrails</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[Zep en EKS: Memoria Revolucionaria para Agentes de IA]]></title><description><![CDATA[Zep (getzep.com) representa un avance revolucionario en tecnología de memoria para agentes de IA, ofreciendo mejoras de precisión de hasta 18.5% y reducción de latencia del 90% comparado con enfoques tradicionales. Zep construye sobre bases de datos ...]]></description><link>https://blog.cloudacademy.ar/zep-en-eks-memoria-revolucionaria-para-agentes-de-ia</link><guid isPermaLink="true">https://blog.cloudacademy.ar/zep-en-eks-memoria-revolucionaria-para-agentes-de-ia</guid><category><![CDATA[EKS]]></category><category><![CDATA[Zep]]></category><category><![CDATA[Devops]]></category><category><![CDATA[AI]]></category><category><![CDATA[ai agents]]></category><category><![CDATA[#ai-tools]]></category><category><![CDATA[k8s]]></category><category><![CDATA[Developer]]></category><category><![CDATA[getzep]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Sun, 14 Sep 2025 15:18:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1757862195022/1e062291-1f8b-4669-9921-02210f586bdc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Zep (<a target="_blank" href="http://getzep.com">getzep.com</a>) representa un avance revolucionario en tecnología de memoria para agentes de IA, ofreciendo <strong>mejoras de precisión de hasta 18.5% y reducción de latencia del 90%</strong> comparado con enfoques tradicionales. Zep construye sobre bases de datos vectoriales tradicionales como PostgreSQL + pgvector, pero añade grafos de conocimiento temporales para dar a los agentes de IA memoria persistente e inteligente que se vuelve más inteligente con cada interacción.</p>
<p>La plataforma aborda una limitación fundamental: <strong>los agentes de IA son sin estado por defecto</strong>, olvidando todo entre conversaciones. Mientras las empresas dependen cada vez más de IA para soporte al cliente y automatización de ventas, las soluciones tradicionales—PostgreSQL o almacenes vectoriales—fallan en capturar la naturaleza dinámica de las interacciones empresariales reales. Zep resuelve esto a través de su "ingeniería de contexto", ensamblando sistemáticamente contexto personalizado desde preferencias de usuario, datos empresariales y conversaciones evolutivas.</p>
<h2 id="heading-que-hace-a-zep-fundamentalmente-diferente">Qué hace a Zep fundamentalmente diferente</h2>
<p>Los enfoques tradicionales tratan la información como capturas estáticas. <strong>Los grafos de conocimiento temporales de Zep entienden que la información empresarial es dinámica e interconectada</strong>. Cuando un cliente cambia preferencias o reporta problemas, Zep no solo añade nueva información—entiende estos cambios en contexto, manteniendo relaciones históricas mientras presenta la realidad actual.</p>
<p>El <strong>motor Graphiti</strong> (con más de 14,000 estrellas en GitHub) potencia esta capacidad a través de modelado bi-temporal. Esto rastrea tanto cuándo ocurrieron los eventos como cuándo el sistema se enteró de ellos, habilitando razonamiento sofisticado sobre causa y efecto.</p>
<p><strong>La ingeniería de contexto emerge como la innovación central de Zep</strong>—yendo más allá de la simple ingeniería de prompts para ensamblar sistemáticamente información relevante en prompts optimizados. Esto reduce alucinaciones, mejora la precisión y disminuye dramáticamente los costos computacionales usando menos del 2% de los tokens requeridos por enfoques tradicionales.</p>
<h2 id="heading-potenciando-postgresql-superando-limitaciones-tradicionales">Potenciando PostgreSQL: superando limitaciones tradicionales</h2>
<p>PostgreSQL con pgvector sobresale en almacenamiento vectorial estructurado pero, usado directamente, carece del razonamiento temporal que los agentes de IA necesitan. Los desarrolladores que implementan memoria de IA sobre PostgreSQL enfrentan consultas complejas para reconstruir contexto, mapeo manual de relaciones, y ningún entendimiento nativo de cómo evoluciona la información a través del tiempo.</p>
<p>Zep proporciona <strong>APIs optimizadas para agentes con rendimiento sub-200ms</strong> específicamente diseñadas para IA conversacional. Los grafos temporales rastrean automáticamente relaciones de entidades—clientes conectan con tickets de soporte, que se vinculan a problemas de producto—sin diseño manual.</p>
<blockquote>
<p>Las diferencias de rendimiento son significativas: mientras implementaciones directas sobre PostgreSQL requieren historiales completos (115k+ tokens), las capas de abstracción de Zep comprimen esto en bloques enfocados promediando 1.6k tokens con precisión superior. Esto significa ahorros dramáticos para empresas ejecutando agentes de IA a escala.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757862895687/183209a0-ceed-4707-a6da-107956a4984e.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-visualizacion-de-relaciones-y-datos-de-usuario">Visualización de relaciones y datos de usuario</h2>
<p>Zep ofrece <strong>herramientas de visualización que revelan patrones ocultos en comportamiento de usuario</strong>. La plataforma construye automáticamente relaciones—clientes se conectan a preferencias, historial de compras, interacciones de soporte—creando una vista comprensiva del viaje de cada usuario.</p>
<p><strong>El dashboard de visualización permite explorar conexiones interactivamente</strong>, rastreando evolución de preferencias, identificando patrones, y entendiendo flujos temporales. Esto es valioso para equipos de ventas, soporte y producto analizando comportamientos sin análisis manual.</p>
<p>Las características avanzadas incluyen <strong>algoritmos de detección de comunidades que agrupan entidades relacionadas</strong>, ayudando a identificar segmentos de clientes y patrones de interacción. El modelado bi-temporal preserva auditorías completas, crucial para cumplimiento y análisis estratégico.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757862941423/1a4d87b4-d4f2-4dd7-9f30-21ee9f51bdab.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-casos-de-uso-transformadores">Casos de uso transformadores</h2>
<p>Zep habilita <strong>aplicaciones de IA previamente imposibles</strong>. Los agentes de soporte acceden a historial completo entendiendo cambios de contexto—cuándo cambió el estado de cuenta, nivel de satisfacción, o necesidades de producto. Esto transforma interacciones genéricas en experiencias personalizadas.</p>
<p><strong>La automatización de ventas se vuelve más efectiva</strong> cuando agentes recuerdan preferencias de prospectos y entienden dinámicas de relación. Los agentes potenciados por Zep construyen perfiles que evolucionan con cada interacción.</p>
<p>Las aplicaciones de inteligencia empresarial aprovechan <strong>Graph RAG para conectar fuentes dispares</strong>—CRM, tickets, facturación—en grafos unificados que revelan insights invisibles. Esto habilita responder preguntas complejas traversando relaciones entre sistemas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757862957346/e68c73cf-faae-405b-a61e-c54b557e2858.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-integracion-perfecta-con-n8n">Integración perfecta con n8n</h2>
<p><strong>Los usuarios de n8n obtienen memoria sofisticada través del nodo Zep</strong>, habilitando automatización visual con memoria persistente. La integración soporta múltiples modos: recuperar documentos, insertar nuevos, y conectar memoria a herramientas de IA—todo mediante arrastrar y soltar.</p>
<p><strong>Patrones comunes incluyen</strong> flujos donde tickets disparan búsquedas de memoria y respuestas personalizadas basadas en historial completo. Los pipelines de leads acceden a historial de interacción y puntúan oportunidades con contexto comprensivo.</p>
<p><strong>Las librerías de plantillas proporcionan valor inmediato</strong> con más de 200 plantillas de IA incorporando patrones Zep, cubriendo memoria multicanal, sistemas RAG, y campañas que mantienen contexto a través de múltiples touchpoints.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757862991795/69bcd3d9-167b-4f33-b560-a42e8870529a.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-capacidades-tecnicas-clave">Capacidades técnicas clave</h2>
<p><strong>La arquitectura se centra en tres innovaciones</strong>: memoria episódica que preserva interacciones originales, extracción semántica que identifica conceptos relacionados, y subgrafos de comunidad para entendimiento de alto nivel.</p>
<p><strong>Clasificación automática y extracción de entidades</strong> operan transparentemente, identificando personas, organizaciones, productos y eventos sin configuración manual. <strong>Las capacidades de clasificación de diálogo</strong>categorizan conversaciones por intención, sentimiento y tópico.</p>
<p>Las características de rendimiento son <strong>listas para empresa con latencia P95 bajo 300ms</strong> para operaciones complejas, escalando para alta concurrencia mientras mantiene tiempos consistentes.</p>
<h2 id="heading-ventajas-de-rendimiento-comprobadas">Ventajas de rendimiento comprobadas</h2>
<p><strong>Los benchmarks demuestran superioridad técnica</strong>: en Deep Memory Retrieval, Zep logra 94.8% versus 93.4% de MemGPT. En LongMemEval, Zep entrega hasta 18.5% mejoras de precisión reduciendo latencia 90%.</p>
<p><strong>La eficiencia de tokens representa ventaja mayor</strong>: donde enfoques tradicionales consumen 115,000 tokens, Zep logra precisión superior usando solo 1,600 tokens promedio. Para empresas procesando miles de interacciones diarias, esto significa ahorros sustanciales de API LLM.</p>
<p><strong>La búsqueda híbrida combina similaridad semántica, matching de palabras clave y traversal de grafo</strong> en operaciones únicas, proporcionando capacidades que bases vectoriales tradicionales no pueden igualar.</p>
<h2 id="heading-ventajas-competitivas">Ventajas competitivas</h2>
<p><strong>Versus MemGPT/Letta</strong>: Zep ofrece servicios gestionados listos para producción versus proyectos de investigación. Mientras MemGPT requiere gestión manual, Zep opera automáticamente.</p>
<p><strong>Versus bases vectoriales tradicionales</strong>: Pinecone o Weaviate sobresalen en similaridad semántica pero carecen de modelado temporal. Zep entiende relaciones que evolucionan, habilitando razonamiento multi-hop imposible solo con vectores.</p>
<p><strong>Versus PostgreSQL directo</strong>: Zep proporciona APIs optimizadas construidas sobre PostgreSQL + pgvector con rendimiento sub-100ms, eliminando la necesidad de joins costosos y consultas complejas que requieren las implementaciones directas.</p>
<h2 id="heading-preparacion-empresarial">Preparación empresarial</h2>
<p><strong>Credenciales empresariales incluyen certificación SOC 2 Type II</strong>, acuerdos HIPAA, y herramientas GDPR incluyendo "Derecho al Olvido". La plataforma ofrece servicios de nube gestionados y despliegue auto-hospedado.</p>
<p><strong>La estructura de precios escala con crecimiento</strong>, desde niveles gratuitos para desarrollo hasta acuerdos empresariales. El modelo cobra solo por mensajes procesados—no almacenamiento—alineando costos con uso real.</p>
<p><strong>El ecosistema demuestra adopción fuerte</strong> con SDKs comprensivos (Python, TypeScript, Go), documentación extensa, y 25,000 descargas semanales de PyPI. El equipo respaldado por Y Combinator alcanzó $1M de ingresos en 2024 con cinco personas.</p>
<h2 id="heading-desplegando-zep-en-kubernetes-una-guia-completa">Desplegando Zep en Kubernetes: Una Guía Completa</h2>
<p>Para organizaciones que buscan implementar Zep en infraestructura empresarial, el despliegue en Kubernetes proporciona escalabilidad, alta disponibilidad y gestión simplificada. La arquitectura de Zep en Kubernetes se compone de múltiples componentes interconectados que trabajan juntos para proporcionar una plataforma de memoria robusta para agentes de IA.</p>
<p><strong>📁 Repositorio completo disponible</strong>: <a target="_blank" href="https://github.com/MatiasMartinez90/zep-k8s">https://github.com/MatiasMartinez90/zep-k8s</a></p>
<h3 id="heading-arquitectura-del-despliegue">Arquitectura del Despliegue</h3>
<p>El despliegue de Zep en Kubernetes incluye los siguientes componentes principales:</p>
<ul>
<li><p><strong>Zep App</strong>: La aplicación principal que expone las APIs y la interfaz web</p>
</li>
<li><p><strong>Zep NLP Server</strong>: Servidor especializado para procesamiento de lenguaje natural</p>
</li>
<li><p><strong>PostgreSQL con pgvector</strong>: Base de datos optimizada para almacenamiento vectorial</p>
</li>
<li><p><strong>Ingress Controller</strong>: Para gestión de tráfico y certificados SSL/TLS</p>
</li>
</ul>
<h3 id="heading-componentes-de-los-manifiestos">Componentes de los Manifiestos</h3>
<h4 id="heading-1-namespace-y-organizacion-01-namespaceyaml">1. Namespace y Organización (<code>01-namespace.yaml</code>)</h4>
<p>yaml</p>
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Namespace</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">zep</span>
</code></pre>
<p>Este manifiesto crea un namespace dedicado llamado <code>zep</code> que aísla todos los recursos relacionados con Zep del resto del cluster. Los namespaces en Kubernetes proporcionan separación lógica y facilitan la gestión de recursos, políticas de seguridad y cuotas.</p>
<h4 id="heading-2-gestion-de-secretos-02-secretsyaml">2. Gestión de Secretos (<code>02-secrets.yaml</code>)</h4>
<p>Los secretos manejan información sensible de manera segura:</p>
<p><strong>Secret de Base de Datos</strong>:</p>
<ul>
<li><p>Almacena la cadena de conexión DSN a PostgreSQL</p>
</li>
<li><p>Incluye credenciales de autenticación encriptadas</p>
</li>
<li><p>Permite rotación de credenciales sin reconstruir contenedores</p>
</li>
</ul>
<p><strong>Secret de Configuración de Zep</strong>:</p>
<ul>
<li><p>Contiene la API key de OpenAI para servicios de embeddings</p>
</li>
<li><p>Incluye el secreto de autenticación interno de Zep</p>
</li>
<li><p>Mantiene las claves sensibles separadas del código</p>
</li>
</ul>
<h4 id="heading-3-configuracion-de-base-de-datos-externa-03-pgvector-yaml">3. Configuración de Base de Datos Externa (<code>03-pgvector-*.yaml</code>)</h4>
<p>Estos archivos proporcionan dos enfoques para conectar con PostgreSQL:</p>
<p><strong>Endpoint Externo</strong> (<code>03-pgvector-endpoint.yaml</code>):</p>
<ul>
<li><p>Define un endpoint manual a una instancia PostgreSQL externa</p>
</li>
<li><p>Útil cuando se conecta a bases de datos en Docker Swarm o infraestructura externa</p>
</li>
<li><p>Especifica IP y puerto directamente</p>
</li>
</ul>
<p><strong>Service External Name</strong> (<code>03-pgvector-service.yaml</code>):</p>
<ul>
<li><p>Utiliza el tipo <code>ExternalName</code> para referenciar servicios externos</p>
</li>
<li><p>Proporciona resolución DNS automática</p>
</li>
<li><p>Más flexible para entornos con DNS dinámico</p>
</li>
</ul>
<h4 id="heading-4-configuraciones-de-aplicacion-04-configmapsyaml">4. Configuraciones de Aplicación (<code>04-configmaps.yaml</code>)</h4>
<p>Los ConfigMaps definen configuraciones no sensibles:</p>
<p><strong>Variables de Entorno</strong>:</p>
<ul>
<li><p><code>ZEP_STORE_TYPE</code>: Especifica PostgreSQL como almacén de datos</p>
</li>
<li><p><code>ZEP_NLP_SERVER_URL</code>: URL del servidor NLP interno</p>
</li>
<li><p><code>ZEP_LOG_LEVEL</code>: Nivel de logging para debugging</p>
</li>
<li><p>Configuraciones de embeddings para OpenAI</p>
</li>
</ul>
<p><strong>Archivo de Configuración</strong>:</p>
<ul>
<li><p>Archivo <code>config.yaml</code> completo montado como volumen</p>
</li>
<li><p>Configuración estructurada para todos los componentes</p>
</li>
<li><p>Permite modificación sin reconstruir imágenes</p>
</li>
</ul>
<h4 id="heading-5-almacenamiento-persistente-06-zep-pvcyaml-07-pgvector-deploymentyaml">5. Almacenamiento Persistente (<code>06-zep-pvc.yaml</code>, <code>07-pgvector-deployment.yaml</code>)</h4>
<p><strong>PVC de Configuración</strong>:</p>
<ul>
<li><p>Almacenamiento opcional para configuraciones personalizadas</p>
</li>
<li><p>Utiliza <code>nfs-dynamic</code> como storage class por defecto</p>
</li>
<li><p>1Gi de capacidad para archivos de configuración</p>
</li>
</ul>
<p><strong>PostgreSQL con pgvector</strong>:</p>
<ul>
<li><p>Deployment completo de PostgreSQL con extensión vectorial</p>
</li>
<li><p>PVC de 2Gi para datos persistentes</p>
</li>
<li><p>Variables de entorno para configuración de base de datos</p>
</li>
<li><p>Service ClusterIP para acceso interno</p>
</li>
</ul>
<h4 id="heading-6-aplicacion-principal-de-zep-08-zep-deploymentyaml">6. Aplicación Principal de Zep (<code>08-zep-deployment.yaml</code>)</h4>
<p><strong>Características del Deployment</strong>:</p>
<ul>
<li><p>Imagen oficial <code>ghcr.io/getzep/zep:latest</code></p>
</li>
<li><p>Puerto 8000 para API y interfaz web</p>
</li>
<li><p>Variables de entorno desde ConfigMaps y Secrets</p>
</li>
<li><p>Montaje de archivo de configuración personalizado</p>
</li>
<li><p>Recursos comentados para ajuste según necesidades</p>
</li>
</ul>
<p><strong>Configuración de Seguridad</strong>:</p>
<ul>
<li><p>Separación de variables sensibles y no sensibles</p>
</li>
<li><p>Referencias a Secrets para credenciales</p>
</li>
<li><p>Configuración desde ConfigMaps para parámetros operacionales</p>
</li>
</ul>
<h4 id="heading-7-servidor-nlp-de-zep-09-zep-nlp-deploymentyaml">7. Servidor NLP de Zep (<code>09-zep-nlp-deployment.yaml</code>)</h4>
<p><strong>Especializaciones del NLP Server</strong>:</p>
<ul>
<li><p>Imagen dedicada <code>ghcr.io/getzep/zep-nlp-server:latest</code></p>
</li>
<li><p>Puerto 5557 para comunicación interna</p>
</li>
<li><p>Recursos específicos para procesamiento NLP</p>
</li>
<li><p>Tolerations para scheduling en nodos master</p>
</li>
</ul>
<p><strong>Requisitos de Recursos</strong>:</p>
<ul>
<li><p>CPU: 200m request, 500m limit</p>
</li>
<li><p>Memoria: 512Mi request, 1Gi limit</p>
</li>
<li><p>Optimizado para cargas de trabajo de ML</p>
</li>
</ul>
<h4 id="heading-8-servicios-de-red-10-zep-servicesyaml">8. Servicios de Red (<code>10-zep-services.yaml</code>)</h4>
<p><strong>Service de Aplicación</strong>:</p>
<ul>
<li><p>Tipo ClusterIP para acceso interno</p>
</li>
<li><p>Puerto 8000 mapeado al contenedor</p>
</li>
<li><p>Selector específico para pods de aplicación</p>
</li>
</ul>
<p><strong>Service NLP</strong>:</p>
<ul>
<li><p>Puerto 5557 para comunicación inter-componente</p>
</li>
<li><p>ClusterIP para acceso interno exclusivo</p>
</li>
<li><p>Separación de concerns de red</p>
</li>
</ul>
<h4 id="heading-9-ingress-y-exposicion-externa-11-zep-ingressyaml">9. Ingress y Exposición Externa (<code>11-zep-ingress.yaml</code>)</h4>
<p><strong>Configuración de Traefik</strong>:</p>
<ul>
<li><p>Ingress class <code>traefik</code> para routing</p>
</li>
<li><p>TLS automático con cert-manager</p>
</li>
<li><p>Certificados Let's Encrypt para HTTPS</p>
</li>
</ul>
<p><strong>Características de Seguridad</strong>:</p>
<ul>
<li><p>Terminación TLS en el edge</p>
</li>
<li><p>Certificados automáticos renovables</p>
</li>
<li><p>Dominio personalizable (<code>devzep.cloudacademy.ar</code>)</p>
</li>
</ul>
<h3 id="heading-script-de-despliegue-automatizado">Script de Despliegue Automatizado</h3>
<p>El script <code>deploy-zep.sh</code> automatiza el proceso completo:</p>
<ol>
<li><p><strong>Creación de Namespace</strong>: Aislamiento de recursos</p>
</li>
<li><p><strong>Aplicación de Secrets</strong>: Configuración segura de credenciales</p>
</li>
<li><p><strong>ConfigMaps</strong>: Despliegue de configuraciones</p>
</li>
<li><p><strong>PVC</strong>: Provisión de almacenamiento persistente</p>
</li>
<li><p><strong>NLP Server</strong>: Despliegue del componente de procesamiento</p>
</li>
<li><p><strong>Aplicación Principal</strong>: Despliegue de la API y UI</p>
</li>
<li><p><strong>Servicios</strong>: Configuración de red interna</p>
</li>
<li><p><strong>Ingress</strong>: Exposición externa con HTTPS</p>
</li>
</ol>
<h3 id="heading-verificacion-y-monitoreo">Verificación y Monitoreo</h3>
<p>Después del despliegue, el script proporciona comandos para verificación:</p>
<p>bash</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Estado de pods</span>
kubectl get pods -n zep

<span class="hljs-comment"># Servicios y endpoints</span>
kubectl get svc -n zep

<span class="hljs-comment"># Ingress y certificados</span>
kubectl get ingress -n zep

<span class="hljs-comment"># Logs para debugging</span>
kubectl logs -f deployment/zep-app -n zep
kubectl logs -f deployment/zep-nlp -n zep
</code></pre>
<h3 id="heading-consideraciones-de-produccion">Consideraciones de Producción</h3>
<p><strong>Recursos y Escalabilidad</strong>:</p>
<ul>
<li><p>Los límites de recursos están comentados para personalización</p>
</li>
<li><p>Considerar HPA (Horizontal Pod Autoscaler) para alta demanda</p>
</li>
<li><p>Monitoreo de métricas de rendimiento de PostgreSQL</p>
</li>
</ul>
<p><strong>Seguridad</strong>:</p>
<ul>
<li><p>Rotación regular de secrets</p>
</li>
<li><p>Network policies para aislamiento de tráfico</p>
</li>
<li><p>Scanning de vulnerabilidades en imágenes</p>
</li>
</ul>
<p><strong>Backup y Recuperación</strong>:</p>
<ul>
<li><p>Estrategia de backup para PVC de PostgreSQL</p>
</li>
<li><p>Procedimientos de disaster recovery</p>
</li>
<li><p>Testing regular de restauración</p>
</li>
</ul>
<p><strong>Networking</strong>:</p>
<ul>
<li><p>Configuración de DNS interno optimizada</p>
</li>
<li><p>Políticas de red para micro-segmentación</p>
</li>
<li><p>Load balancing para múltiples réplicas</p>
</li>
</ul>
<p>Este despliegue en Kubernetes proporciona una base sólida para implementar Zep en producción, combinando la potencia de la plataforma de memoria con la robustez y escalabilidad de Kubernetes.</p>
<h2 id="heading-conclusion">Conclusión</h2>
<p>Zep representa un avance fundamental en memoria de agentes de IA, yendo más allá del almacenamiento estático a grafos de conocimiento dinámicos. Para organizaciones usando n8n, Zep proporciona la capa de memoria que transforma agentes genéricos en asistentes personalizados capaces de razonamiento empresarial sofisticado.</p>
<p>La combinación de innovación técnica, mejoras probadas, e infraestructura empresarial posiciona a Zep como la solución líder para despliegue serio de agentes de IA. Con integración perfecta con n8n, despliegue robusto en Kubernetes, y resultados demostrados, Zep habilita construir experiencias de IA inteligentes que los clientes modernos esperan mientras mantienen estándares de seguridad empresarial.</p>
<p>La inversión en capacidades de memoria de Zep paga dividendos a través de mejor satisfacción de cliente, eficiencia operacional, y ventaja competitiva en un panorama empresarial cada vez más impulsado por IA. El despliegue en Kubernetes asegura que estas capacidades puedan escalar con las necesidades empresariales, proporcionando una plataforma confiable y mantenible para el futuro de la IA empresarial.</p>
]]></content:encoded></item><item><title><![CDATA[Instala N8N y +70 Herramientas de IA en Minutos con SetupOrion]]></title><description><![CDATA[¿Te imaginas poder instalar N8N, Qdrant, Ollama, ZEP y más de 70 herramientas de automatización e inteligencia artificial en tu servidor con solo tres comandos? Esto es exactamente lo que ofrece SetupOrion, un proyecto brasileño revolucionario que es...]]></description><link>https://blog.cloudacademy.ar/instala-n8n-y-70-herramientas-de-ia-en-minutos-con-setuporion</link><guid isPermaLink="true">https://blog.cloudacademy.ar/instala-n8n-y-70-herramientas-de-ia-en-minutos-con-setuporion</guid><category><![CDATA[AI]]></category><category><![CDATA[n8n]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Sun, 14 Sep 2025 14:45:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1757859747773/f14b0797-de95-452d-812c-6dad49a06832.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>¿Te imaginas poder instalar N8N, Qdrant, Ollama, ZEP y más de 70 herramientas de automatización e inteligencia artificial en tu servidor con solo tres comandos? Esto es exactamente lo que ofrece <strong>SetupOrion</strong>, un proyecto brasileño revolucionario que está transformando la manera en que desarrolladores y entusiastas de la IA configuran sus entornos de trabajo.</p>
<h2 id="heading-que-es-setuporion">¿Qué es SetupOrion?</h2>
<p>SetupOrion es un auto-instalador completamente gratuito desarrollado por OrionDesign que simplifica la instalación de las principales herramientas del mercado de automatización, marketing e inteligencia artificial. Con más de <strong>70 aplicaciones disponibles</strong>, este setup elimina la complejidad técnica que tradicionalmente requiere configurar un stack completo de herramientas para IA y automatización.</p>
<p>El proyecto brasileño se ha convertido en una solución indispensable para quienes buscan experimentar y desarrollar con herramientas como N8N, agentes de IA, bases de datos vectoriales y mucho más, sin necesidad de convertirse en expertos en DevOps.</p>
<h2 id="heading-herramientas-destacadas-para-ia-y-automatizacion">Herramientas Destacadas para IA y Automatización</h2>
<h3 id="heading-automatizacion-y-workflows">Automatización y Workflows</h3>
<ul>
<li><p><strong>N8N</strong>: La plataforma principal para crear workflows de automatización complejos, conectar APIs y orquestar procesos</p>
</li>
<li><p><strong>Traefik &amp; Portainer</strong>: Gestión de contenedores y proxy reverso para un despliegue profesional</p>
</li>
</ul>
<h3 id="heading-inteligencia-artificial-y-memoria">Inteligencia Artificial y Memoria</h3>
<ul>
<li><p><strong>ZEP</strong>: Plataforma de ingeniería de contexto para agentes de IA que transforma conversaciones y datos empresariales en un grafo de conocimiento evolutivo</p>
</li>
<li><p><strong>Qdrant</strong>: Base de datos vectorial de alto rendimiento para búsquedas semánticas y sistemas RAG</p>
</li>
<li><p><strong>Ollama</strong>: Ejecuta modelos de IA localmente de forma eficiente</p>
</li>
</ul>
<h3 id="heading-herramientas-de-soporte-para-ia">Herramientas de Soporte para IA</h3>
<ul>
<li><p><strong>RabbitMQ</strong>: Sistema de mensajería para comunicación asíncrona entre servicios de IA</p>
</li>
<li><p><strong>MinIO</strong>: Almacenamiento de objetos compatible con S3, ideal para datasets y modelos</p>
</li>
<li><p><strong>Cal.com</strong>: Sistema de programación que se integra perfectamente con chatbots y agentes</p>
</li>
<li><p><strong>Bolt</strong>: Herramienta de desarrollo con IA similar a v0, para generar aplicaciones web rápidamente</p>
</li>
</ul>
<h3 id="heading-utilidades-empresariales">Utilidades Empresariales</h3>
<ul>
<li><p><strong>Keycloak</strong>: Gestión de identidad y acceso para aplicaciones</p>
</li>
<li><p><strong>VaultWarden</strong>: Gestor de contraseñas auto-hospedado</p>
</li>
<li><p><strong>Uptime Kuma</strong>: Monitoreo de servicios y aplicaciones</p>
</li>
<li><p><strong>Moodle</strong>: Plataforma de aprendizaje que se puede integrar con sistemas de IA</p>
</li>
</ul>
<h2 id="heading-requisitos-del-sistema">Requisitos del Sistema</h2>
<p>Para aprovechar al máximo SetupOrion, necesitas:</p>
<p><strong>Requisitos mínimos:</strong></p>
<ul>
<li><p>Ubuntu 20.04 o 22.04</p>
</li>
<li><p>4GB de RAM</p>
</li>
<li><p>2 vCPUs</p>
</li>
<li><p>Servidor completamente vacío</p>
</li>
</ul>
<p><strong>Requisitos recomendados:</strong></p>
<ul>
<li><p>8GB de RAM</p>
</li>
<li><p>4 vCPUs</p>
</li>
<li><p>Para un rendimiento óptimo con las herramientas más populares</p>
</li>
</ul>
<h3 id="heading-opcion-economica-para-pruebas">Opción Económica para Pruebas</h3>
<p>Si quieres probar SetupOrion sin una gran inversión inicial, puedes usar este VPS barato que encontré: <a target="_blank" href="https://contabo.com/">Contabo</a>, que ofrece excelente relación precio-rendimiento para probar estas herramientas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757859965748/bf4ecd00-b22f-4f4f-b3ae-cc1afb8abafa.png" alt class="image--center mx-auto" /></p>
<p><strong>Importante</strong>: El servidor debe estar completamente vacío, ya que SetupOrion realiza configuraciones profundas que podrían conflictuar con instalaciones existentes, para algo más estable mejor instalar en AWS.</p>
<h2 id="heading-instalacion-paso-a-paso-en-ec2">Instalación Paso a Paso en EC2</h2>
<h3 id="heading-paso-1-preparacion-del-servidor">Paso 1: Preparación del Servidor</h3>
<ol>
<li><p>Lanza una instancia EC2 con Ubuntu 20.04</p>
</li>
<li><p>Configura los grupos de seguridad para permitir tráfico HTTP (80) y HTTPS (443)</p>
</li>
<li><p>Conecta via SSH a tu instancia</p>
</li>
</ol>
<h3 id="heading-paso-2-ejecutar-setuporion">Paso 2: Ejecutar SetupOrion</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860264591/0ba15569-563c-4c93-85d1-90594443903f.png" alt class="image--center mx-auto" /></p>
<p>Ejecuta este comando único en tu terminal SSH:</p>
<pre><code class="lang-bash">bash &lt;(curl -sSL setup.oriondesign.art.br)
</code></pre>
<p>El script automáticamente:</p>
<ul>
<li><p>Actualiza el sistema</p>
</li>
<li><p>Instala dependencias necesarias</p>
</li>
<li><p>Descarga y ejecuta SetupOrion</p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860776728/7ffe73d9-7099-4b1e-a422-2bc8ab34c1a4.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860341714/b54bc12a-ada5-413a-a6bc-66e7c2918255.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860657112/27d8c099-d238-432a-b65a-0305b585f389.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860671516/53cb7a53-dba4-4f31-b5c7-0107af63a2d8.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-paso-3-instalacion-de-traefik-y-portainer-base-del-sistema">Paso 3: Instalación de Traefik y Portainer (Base del Sistema)</h3>
<p>SetupOrion comenzará instalando los componentes fundamentales:</p>
<ol>
<li><p><strong>Configuración inicial del servidor</strong>:</p>
<ul>
<li><p>Update del sistema</p>
</li>
<li><p>Instalación de herramientas básicas</p>
</li>
<li><p>Configuración de timezone y hostname</p>
</li>
</ul>
</li>
<li><p><strong>Instalación de Docker Swarm</strong>:</p>
<ul>
<li><p>Configuración automática del orquestador</p>
</li>
<li><p>Creación de red interna</p>
</li>
</ul>
</li>
<li><p><strong>Despliegue de Traefik</strong>:</p>
<ul>
<li><p>Proxy reverso para gestión de dominios</p>
</li>
<li><p>Configuración SSL automática</p>
</li>
</ul>
</li>
<li><p><strong>Instalación de Portainer</strong>:</p>
<ul>
<li><p>Interface web para gestión de contenedores</p>
</li>
<li><p>Configuración de usuario administrador</p>
</li>
</ul>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860431643/51659b01-1055-4f45-83ab-ee2f2e18f586.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860496038/b452a7e1-3dcd-416a-af53-594025f0cf4d.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860517845/291be2c5-f26f-42ae-9cfe-67ba04620f06.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860554971/e61f6621-3927-4a7c-82fe-bdddeca41ae3.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860564581/019a24e0-2ec0-4ccf-b161-dc0a3bbbedd8.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-paso-4-configuracion-de-dominios">Paso 4: Configuración de Dominios</h3>
<p>Para cada herramienta que instales, necesitarás configurar subdominios apuntando a la IP pública de tu instancia EC2. Por ejemplo:</p>
<ul>
<li><p><code>portainer.tudominio.com</code></p>
</li>
<li><p><code>n8n.tudominio.com</code></p>
</li>
<li><p><code>qdrant.tudominio.com</code></p>
</li>
</ul>
<p>Puedes usar cualquier proveedor DNS (Cloudflare recomendado pero no obligatorio).</p>
<h3 id="heading-paso-5-instalacion-de-n8n-y-herramientas-de-ia">Paso 5: Instalación de N8N y Herramientas de IA</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1757860573781/b2f92cae-a9f4-4ddc-b838-1a4071a1595a.png" alt class="image--center mx-auto" /></p>
<p>Una vez completada la base, selecciona N8N del menú:</p>
<ol>
<li><p>Ingresa el dominio para N8N (ej: <code>n8n.tudominio.com</code>)</p>
</li>
<li><p>El sistema configurará automáticamente:</p>
<ul>
<li><p>Contenedor Docker optimizado</p>
</li>
<li><p>Integración con Traefik</p>
</li>
<li><p>SSL automático</p>
</li>
<li><p>Variables de entorno necesarias</p>
</li>
</ul>
</li>
</ol>
<p>Repite el proceso para otras herramientas como Qdrant, Ollama, ZEP, etc.</p>
<h2 id="heading-casos-de-uso-practicos">Casos de Uso Prácticos</h2>
<h3 id="heading-automatizacion-de-procesos-de-negocio">Automatización de Procesos de Negocio</h3>
<p>Combina N8N con Cal.com para crear sistemas de programación inteligentes que se integren con CRMs, envíen confirmaciones automáticas y gestionen disponibilidad.</p>
<h3 id="heading-sistemas-rag-retrieval-augmented-generation">Sistemas RAG (Retrieval-Augmented Generation)</h3>
<p>Utiliza Qdrant para almacenar embeddings, Ollama para procesamiento local de IA y ZEP para mantener memoria contextual en conversaciones largas.</p>
<h3 id="heading-chatbots-empresariales-avanzados">Chatbots Empresariales Avanzados</h3>
<p>Integra N8N para workflows, ZEP para memoria conversacional, MinIO para almacenamiento de archivos y RabbitMQ para comunicación asíncrona entre servicios.</p>
<h3 id="heading-plataformas-de-aprendizaje-inteligentes">Plataformas de Aprendizaje Inteligentes</h3>
<p>Combina Moodle con herramientas de IA para crear experiencias educativas personalizadas que se adapten al progreso de cada estudiante.</p>
<h2 id="heading-ventajas-del-enfoque-setuporion">Ventajas del Enfoque SetupOrion</h2>
<p><strong>Simplicidad Extrema</strong>: Tres pasos para tener un entorno completo funcionando <strong>Economía de Tiempo</strong>: Lo que tomaría días de configuración se resuelve en horas <strong>Configuración Profesional</strong>: Incluye SSL, proxy reverso y gestión de contenedores <strong>Escalabilidad</strong>: Basado en Docker Swarm para crecimiento futuro <strong>Comunidad Activa</strong>: Más de 1000 miembros en Discord y WhatsApp para soporte</p>
<h2 id="heading-consideraciones-y-limitaciones">Consideraciones y Limitaciones</h2>
<p>SetupOrion es perfecto para:</p>
<ul>
<li><p>Desarrollo y testing de soluciones de IA</p>
</li>
<li><p>Prototipos de automatización</p>
</li>
<li><p>Entornos de aprendizaje</p>
</li>
<li><p>Pequeñas implementaciones productivas</p>
</li>
</ul>
<p>Para entornos empresariales críticos, considera implementaciones más robustas con redundancia y monitoreo avanzado.</p>
<p>¿Listo para revolucionar tu flujo de trabajo con IA y automatización? Un comando, tres pasos, y tendrás acceso a lo mejor del ecosistema open source en tu propio servidor.</p>
]]></content:encoded></item><item><title><![CDATA[n8n-MCP: Crea Workflows de n8n desde Claude Code / Cursor]]></title><description><![CDATA[¿Alguna vez intentaste pedirle a Claude o Cursor que te construyera un workflow de n8n y terminaste con configuraciones incorrectas, nodos que no existen, o propiedades mal definidas? n8n-MCP soluciona exactamente ese problema.
Es un puente inteligen...]]></description><link>https://blog.cloudacademy.ar/n8n-mcp-crea-workflows-de-n8n-desde-claude-code-cursor</link><guid isPermaLink="true">https://blog.cloudacademy.ar/n8n-mcp-crea-workflows-de-n8n-desde-claude-code-cursor</guid><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Sat, 02 Aug 2025 11:21:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754133165127/6f9358ed-8585-4e81-a6bd-8f4b0e7c077f.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>¿Alguna vez intentaste pedirle a Claude o Cursor que te construyera un workflow de n8n y terminaste con configuraciones incorrectas, nodos que no existen, o propiedades mal definidas? <strong>n8n-MCP</strong> soluciona exactamente ese problema.</p>
<p>Es un puente inteligente que conecta asistentes de IA como Claude con la plataforma n8n, pero con una ventaja única: <strong>tiene acceso automático y siempre actualizado a toda la documentación oficial de n8n</strong>. Con 525+ nodos cubiertos al 100% y actualizaciones semanales automáticas, ahora puedes construir automaciones reales que funcionan al primer intento.</p>
<h2 id="heading-que-puedes-hacer-realmente-con-n8n-mcp">Qué puedes hacer realmente con n8n-MCP</h2>
<h3 id="heading-el-problema-que-soluciona">El problema que soluciona</h3>
<p>Antes de n8n-MCP, pedirle a Claude que construyera un workflow de n8n era como jugar a la lotería:</p>
<ul>
<li><p>📝 <strong>"Crea un workflow que envíe notificaciones a Slack cuando llegue un email"</strong></p>
<ul>
<li><p>Claude adivinaba los nombres de nodos (¿es <code>emailTrigger</code> o <code>Email Trigger</code>?)</p>
</li>
<li><p>Inventaba propiedades que no existían</p>
</li>
<li><p>Te daba configuraciones que parecían correctas pero fallaban</p>
</li>
</ul>
</li>
</ul>
<h3 id="heading-la-solucion-real">La solución real</h3>
<p>Con n8n-MCP, Claude tiene acceso directo a:</p>
<ul>
<li><p><strong>Todos los nodos disponibles</strong> con nombres exactos</p>
</li>
<li><p><strong>Todas las propiedades</strong> de cada nodo con sus valores válidos</p>
</li>
<li><p><strong>Documentación oficial</strong> actualizada semanalmente</p>
</li>
<li><p><strong>Ejemplos de configuración</strong> que realmente funcionan</p>
</li>
</ul>
<h3 id="heading-la-diferencia-practica">La diferencia práctica</h3>
<p><strong>Sin n8n-MCP:</strong></p>
<ul>
<li><p>45 minutos promedio para un workflow simple</p>
</li>
<li><p>6+ iteraciones de prueba y error</p>
</li>
<li><p>Configuraciones que "parecen correctas" pero fallan</p>
</li>
<li><p>Documentación desactualizada o inexistente</p>
</li>
</ul>
<p><strong>Con n8n-MCP:</strong></p>
<ul>
<li><p>3-5 minutos para el mismo workflow</p>
</li>
<li><p>Funciona al primer intento en 90% de casos</p>
</li>
<li><p>Configuraciones validadas y documentadas</p>
</li>
<li><p>Acceso a las últimas funcionalidades de n8n</p>
</li>
</ul>
<h2 id="heading-como-funciona-la-tecnologia-detras-de-la-magia">Cómo funciona: la tecnología detrás de la magia</h2>
<h3 id="heading-mcps-el-usb-de-las-integraciones-ai">MCPs: el "USB" de las integraciones AI</h3>
<p>Los <strong>Model Context Protocols</strong> son un estándar desarrollado por Anthropic que permite que los asistentes de IA accedan a herramientas externas de forma estandarizada. Es como un "USB" para conectar IA con cualquier sistema.</p>
<h3 id="heading-por-que-n8n-mcp-es-especial">Por qué n8n-MCP es especial</h3>
<p><strong>El problema fundamental</strong>: Los LLMs como Claude tienen conocimiento general sobre n8n, pero no conocen:</p>
<ul>
<li><p>Los nodos exactos disponibles en tu versión</p>
</li>
<li><p>Las propiedades específicas de cada nodo</p>
</li>
<li><p>Cómo han cambiado las APIs recientemente</p>
</li>
<li><p>Qué nodos nuevos se han añadido</p>
</li>
</ul>
<p><strong>La solución de n8n-MCP</strong>:</p>
<ul>
<li><p><strong>525+ nodos</strong> con documentación completa</p>
</li>
<li><p><strong>99% de cobertura</strong> de propiedades y esquemas</p>
</li>
<li><p><strong>Actualizaciones automáticas</strong> cada semana via GitHub Actions</p>
</li>
<li><p><strong>Base de datos optimizada</strong> con SQLite + FTS5 para búsquedas de 12ms</p>
</li>
</ul>
<h3 id="heading-que-informacion-tiene-claude-disponible">Qué información tiene Claude disponible</h3>
<p>Cuando usas n8n-MCP, Claude puede:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Buscar nodos por funcionalidad</span>
<span class="hljs-string">"¿Qué nodos puedo usar para trabajar con bases de datos?"</span>

<span class="hljs-comment">// Obtener documentación exacta</span>
<span class="hljs-string">"¿Cuáles son todas las propiedades del nodo HTTP Request?"</span>

<span class="hljs-comment">// Validar configuraciones</span>
<span class="hljs-string">"¿Esta configuración de Slack es correcta?"</span>

<span class="hljs-comment">// Encontrar ejemplos</span>
<span class="hljs-string">"¿Tienes ejemplos de cómo conectar Google Sheets con Notion?"</span>
</code></pre>
<h2 id="heading-configuracion-paso-a-paso-empieza-en-5-minutos">Configuración paso a paso: empieza en 5 minutos</h2>
<h3 id="heading-opcion-1-claude-desktop-mas-facil">Opción 1: Claude Desktop (más fácil)</h3>
<ol>
<li><p><strong>Instala Node.js</strong> si no lo tienes</p>
</li>
<li><p><strong>Crea/edita el archivo de configuración:</strong></p>
</li>
</ol>
<p><strong>macOS:</strong> <code>~/Library/Application Support/Claude/claude_desktop_config.json</code> <strong>Windows:</strong><code>%APPDATA%/Claude/claude_desktop_config.json</code></p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"mcpServers"</span>: {
    <span class="hljs-attr">"n8n-mcp"</span>: {
      <span class="hljs-attr">"command"</span>: <span class="hljs-string">"npx"</span>,
      <span class="hljs-attr">"args"</span>: [<span class="hljs-string">"n8n-mcp"</span>],
      <span class="hljs-attr">"env"</span>: {
        <span class="hljs-attr">"MCP_MODE"</span>: <span class="hljs-string">"stdio"</span>,
        <span class="hljs-attr">"LOG_LEVEL"</span>: <span class="hljs-string">"error"</span>
      }
    }
  }
}
</code></pre>
<ol start="3">
<li><p><strong>Reinicia Claude Desktop</strong></p>
</li>
<li><p><strong>Prueba</strong>: Pregunta "¿Qué nodos de n8n están disponibles para trabajar con email?"</p>
</li>
</ol>
<h3 id="heading-opcion-2-cursor">Opción 2: Cursor</h3>
<p>En configuración de MCP:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"mcpServers"</span>: {
    <span class="hljs-attr">"n8n-mcp"</span>: {
      <span class="hljs-attr">"command"</span>: <span class="hljs-string">"npx"</span>,
      <span class="hljs-attr">"args"</span>: [<span class="hljs-string">"-y"</span>, <span class="hljs-string">"n8n-mcp"</span>]
    }
  }
}
</code></pre>
<h3 id="heading-tenes-tu-propia-instancia-de-n8n">¿Tenés tu propia instancia de n8n?</h3>
<p>Si queres que Claude también pueda <strong>crear y ejecutar workflows</strong> en tu instancia:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"mcpServers"</span>: {
    <span class="hljs-attr">"n8n-mcp"</span>: {
      <span class="hljs-attr">"command"</span>: <span class="hljs-string">"npx"</span>,
      <span class="hljs-attr">"args"</span>: [<span class="hljs-string">"n8n-mcp"</span>],
      <span class="hljs-attr">"env"</span>: {
        <span class="hljs-attr">"N8N_API_KEY"</span>: <span class="hljs-string">"tu-api-key"</span>,
        <span class="hljs-attr">"N8N_BASE_URL"</span>: <span class="hljs-string">"https://tu-instancia.com"</span>
      }
    }
  }
}
</code></pre>
<h3 id="heading-verificacion-rapida">Verificación rápida</h3>
<p>Una vez configurado, prueba con:</p>
<ul>
<li><p>"¿Qué nodos puedo usar para trabajar con Google Sheets?"</p>
</li>
<li><p>"Muéstrame cómo configurar un HTTP Request"</p>
</li>
<li><p>"Crea un workflow simple que envíe un Slack cuando reciba un webhook"</p>
</li>
</ul>
<h3 id="heading-cuando-no-usar-n8n-mcp">¿Cuándo NO usar n8n-MCP?</h3>
<ul>
<li><p>Si solo necesitas automaciones súper simples (email → Slack)</p>
</li>
<li><p>Si tu equipo no está cómodo con herramientas técnicas</p>
</li>
<li><p>Si prefieres interfaces 100% visuales sin IA</p>
</li>
<li><p>Si trabajas en un entorno sin acceso a Claude/VS Code</p>
</li>
</ul>
<h3 id="heading-cuando-si-usar-n8n-mcp">¿Cuándo SÍ usar n8n-MCP?</h3>
<ul>
<li><p>✅ Construyes automaciones complejas regularmente</p>
</li>
<li><p>✅ Necesitas workflows que manejen múltiples sistemas</p>
</li>
<li><p>✅ Valoras la precisión y quieres evitar configuraciones incorrectas</p>
</li>
<li><p>✅ Trabajas con APIs y integraciones personalizadas</p>
</li>
<li><p>✅ Quieres aprovechar IA para acelerar desarrollo</p>
</li>
</ul>
<h2 id="heading-el-futuro-que-viene-despues">El futuro: qué viene después</h2>
<p>n8n-MCP es solo el comienzo. La tendencia hacia <strong>agentes autónomos</strong> significa que pronto veremos:</p>
<ul>
<li><p><strong>Workflows auto-optimizados</strong> que mejoran su rendimiento automáticamente</p>
</li>
<li><p><strong>Detección predictiva</strong> de problemas antes de que ocurran</p>
</li>
<li><p><strong>Integraciones multi-modal</strong> que procesan texto, imágenes, y audio</p>
</li>
<li><p><strong>Colaboración entre agentes</strong> donde múltiples MCPs trabajan juntos</p>
</li>
</ul>
<h2 id="heading-conclusion-vale-la-pena">Conclusión: ¿vale la pena?</h2>
<p><strong>Para desarrolladores y equipos técnicos</strong>: Absolutamente sí. La mejora en velocidad y precisión es dramática.</p>
<p><strong>Para empresas que automatizan regularmente</strong>: Es una ventaja competitiva clara.</p>
<p><strong>Para principiantes en n8n</strong>: Te ahorra meses de curva de aprendizaje.</p>
<p>n8n-MCP no solo hace que construir workflows sea más rápido – hace que sea más <strong>confiable, preciso y disfrutable</strong>. En un mundo donde la automatización inteligente es cada vez más crítica, tener herramientas que combinan la potencia de n8n con la inteligencia de IA moderna no es lujo: es necesidad.</p>
<p><strong>La automatización inteligente ya está acá. La pregunta es: ¿vas a aprovecharla o vas a seguir construyendo workflows a mano?</strong></p>
]]></content:encoded></item><item><title><![CDATA[Los subagentes de Claude Code: revolución en el desarrollo asistido por IA]]></title><description><![CDATA[Los subagentes de Claude Code representan un avance fundamental en herramientas de programación asistidas por IA, introduciendo por primera vez una arquitectura de asistentes especializados independientes que operan con contextos separados de 200,000...]]></description><link>https://blog.cloudacademy.ar/los-subagentes-de-claude-code-revolucion-en-el-desarrollo-asistido-por-ia</link><guid isPermaLink="true">https://blog.cloudacademy.ar/los-subagentes-de-claude-code-revolucion-en-el-desarrollo-asistido-por-ia</guid><category><![CDATA[claude.ai]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Fri, 01 Aug 2025 21:31:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754081268541/e9e18eb6-ea6b-41f0-9aaf-c47244507c7e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Los <strong>subagentes de Claude Code</strong> representan un avance fundamental en herramientas de programación asistidas por IA, introduciendo por primera vez una arquitectura de <strong>asistentes especializados independientes</strong> que operan con contextos separados de 200,000 tokens cada uno. Esta funcionalidad, lanzada oficialmente en <strong>julio de 2025</strong> junto con Claude 4, resuelve problemas críticos de "contaminación de contexto" mientras permite <strong>orquestación paralela de hasta 10 especialistas IA simultáneos</strong> para proyectos de desarrollo complejos.</p>
<p>Según la documentación oficial de Anthropic y reportes de la comunidad, los subagentes han logrado mejoras de productividad del <strong>300-400%</strong> en tareas complejas, con desarrolladores describiendo la experiencia como tener "un equipo de ingenieros especializados que nunca duerme" trabajando en paralelo en diferentes aspectos del mismo proyecto.</p>
<h2 id="heading-que-son-exactamente-los-subagentes-de-claude-code">Qué son exactamente los subagentes de Claude Code</h2>
<p>Los subagentes son <strong>asistentes de IA especializados configurables</strong> que funcionan como miembros independientes de un equipo de desarrollo virtual. Cada subagente opera con:</p>
<ul>
<li><p><strong>Contexto independiente de 200,000 tokens</strong> (equivalente a ~150,000 palabras)</p>
</li>
<li><p><strong>Prompt de sistema personalizado</strong> para especialización en dominios específicos</p>
</li>
<li><p><strong>Permisos granulares de herramientas</strong> (file system, Git, MCP servers, etc.)</p>
</li>
<li><p><strong>Reutilización entre proyectos</strong> y capacidad de compartir con equipos</p>
</li>
</ul>
<p><strong>Arquitectura técnica</strong>: Los subagentes se almacenan como archivos Markdown con metadatos YAML en dos ubicaciones:</p>
<ul>
<li><p><strong>Nivel de proyecto</strong>: <code>.claude/agents/</code> (mayor prioridad)</p>
</li>
<li><p><strong>Nivel de usuario</strong>: <code>~/.claude/agents/</code> (disponible globalmente)</p>
</li>
</ul>
<p>La configuración sigue esta estructura:</p>
<p>yaml</p>
<pre><code class="lang-yaml"><span class="hljs-meta">---</span>
<span class="hljs-attr">name:</span> <span class="hljs-string">security-auditor</span>
<span class="hljs-attr">description:</span> <span class="hljs-string">Especialista</span> <span class="hljs-string">en</span> <span class="hljs-string">auditorías</span> <span class="hljs-string">de</span> <span class="hljs-string">seguridad</span> <span class="hljs-string">que</span> <span class="hljs-string">DEBE</span> <span class="hljs-string">USARSE</span> <span class="hljs-string">para</span> <span class="hljs-string">cualquier</span> <span class="hljs-string">revisión</span> <span class="hljs-string">relacionada</span> <span class="hljs-string">con</span> <span class="hljs-string">vulnerabilidades</span> <span class="hljs-string">OWASP</span>
<span class="hljs-attr">tools:</span> <span class="hljs-string">file_read,</span> <span class="hljs-string">grep,</span> <span class="hljs-string">bash</span>
<span class="hljs-meta">---</span>
<span class="hljs-string">Eres</span> <span class="hljs-string">un</span> <span class="hljs-string">auditor</span> <span class="hljs-string">de</span> <span class="hljs-string">seguridad</span> <span class="hljs-string">experto</span> <span class="hljs-string">especializado</span> <span class="hljs-string">en</span> <span class="hljs-string">identificar</span> <span class="hljs-string">vulnerabilidades</span> <span class="hljs-string">críticas...</span>
</code></pre>
<h2 id="heading-funcionalidades-especificas-y-proposito">Funcionalidades específicas y propósito</h2>
<p>Los subagentes resuelven <strong>tres problemas fundamentales</strong> del desarrollo asistido por IA tradicional:</p>
<p><strong>Contaminación de contexto</strong>: Las versiones anteriores de Claude Code sufrían "ensuciamiento" del contexto cuando múltiples tareas no relacionadas se ejecutaban en el mismo hilo conversacional. Los subagentes mantienen contextos completamente separados.</p>
<p><strong>Falta de especialización</strong>: Un asistente generalista no puede optimizar para dominios específicos como auditoría de seguridad, testing automatizado o arquitectura de APIs. Los subagentes permiten configuración experta por área.</p>
<p><strong>Limitaciones de paralelización</strong>: Tareas interdependientes requerían ejecución secuencial. Los subagentes pueden trabajar simultáneamente en diferentes aspectos del mismo proyecto.</p>
<p><strong>Casos de uso principales identificados en la comunidad</strong>:</p>
<ul>
<li><p><strong>Revisor de código</strong>: Especializado en estándares OWASP, prácticas de seguridad</p>
</li>
<li><p><strong>Arquitecto backend</strong>: Diseño de APIs RESTful, microservicios, optimización de bases de datos</p>
</li>
<li><p><strong>Escritor de pruebas</strong>: Generación de suites comprehensivas (unit, integration, e2e)</p>
</li>
<li><p><strong>Debugger especializado</strong>: Resolución de problemas específicos del dominio del proyecto</p>
</li>
<li><p><strong>Auditor de seguridad</strong>: Análisis de vulnerabilidades y compliance</p>
</li>
<li><p><strong>Optimizador de rendimiento</strong>: Análisis de complejidad algorítmica y bottlenecks</p>
</li>
</ul>
<h2 id="heading-guia-practica-de-implementacion-paso-a-paso">Guía práctica de implementación paso a paso</h2>
<h3 id="heading-configuracion-inicial-paso-a-paso-con-capturas">Configuración inicial paso a paso con capturas</h3>
<p><strong>Paso 1</strong>: Acceder a la interfaz de subagentes</p>
<pre><code class="lang-bash">/agents
<span class="hljs-comment"># Despliega interfaz para crear, editar, y gestionar subagentes</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754083210422/b67d2b35-2b17-4dc9-9a1d-82f8ff04f0f7.png" alt class="image--center mx-auto" /></p>
<p><strong>Paso 2</strong>: Elegir ubicación del subagente Al seleccionar "Create new agent", aparece la primera configuración para elegir el scope:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754083235291/e17d8050-8b8b-47db-a00e-cc2b561fe130.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p><strong>Project</strong>: Disponible solo para el proyecto actual (recomendado para equipos)</p>
</li>
<li><p><strong>Personal</strong>: Disponible globalmente en todos los proyectos</p>
</li>
</ul>
<p><strong>Paso 3</strong>: Método de creación</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754083269795/a80f860f-8813-4332-a40d-4c91fbae6d22.png" alt class="image--center mx-auto" /></p>
<p>Se recomienda "Generate with Claude" para principiantes, que guía la creación automáticamente.</p>
<p><strong>Paso 4</strong>: Descripción del propósito del agente</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754083319714/3d84d74b-0e57-4b64-94a2-c81426bf17ad.png" alt class="image--center mx-auto" /></p>
<p>Aquí se define qué hace el agente y cuándo debe ser utilizado. Ejemplo: "Expert software engineer that helps review my code based on best practices..."</p>
<p><strong>Paso 5</strong>: Selección de herramientas</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754083371537/93756965-2a19-4845-9f20-3bf6818ac73d.png" alt class="image--center mx-auto" /></p>
<p>Opciones disponibles:</p>
<ul>
<li><p><strong>All tools</strong>: Acceso completo (recomendado para la mayoría)</p>
</li>
<li><p><strong>Read-only tools</strong>: Solo lectura de archivos</p>
</li>
<li><p><strong>Edit tools</strong>: Capacidades de edición</p>
</li>
<li><p><strong>Execution tools</strong>: Ejecución de comandos</p>
</li>
</ul>
<p><strong>Paso 6</strong>: Selección del modelo</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754083410217/eb91ebb9-2ab0-428f-84f0-0796fda39d0d.png" alt class="image--center mx-auto" /></p>
<p>Modelos disponibles:</p>
<ul>
<li><p><strong>Sonnet</strong>: Balance rendimiento/velocidad (recomendado)</p>
</li>
<li><p><strong>Haiku</strong>: Rápido y eficiente para tareas simples</p>
</li>
<li><p><strong>Inherit from parent</strong>: Usa el mismo modelo de la conversación principal</p>
</li>
</ul>
<p><strong>Paso 7</strong>: Personalización visual</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754083430414/738508fb-3d61-4014-9cf2-d4e66a54294a.png" alt class="image--center mx-auto" /></p>
<p>Permite asignar colores distintivos para identificar fácilmente diferentes agentes en la interfaz.</p>
<p><strong>Paso 8</strong>: Confirmación final</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754083451895/d41ca35d-4018-46d3-8a5f-6c3a4cb5233b.png" alt class="image--center mx-auto" /></p>
<p>La pantalla muestra:</p>
<ul>
<li><p><strong>Name</strong>: test-suite-generator</p>
</li>
<li><p><strong>Location</strong>: .claude/agents/<a target="_blank" href="http://test-suite-generator.md">test-suite-generator.md</a></p>
</li>
<li><p><strong>Tools</strong>: All tools</p>
</li>
<li><p><strong>Model</strong>: Sonnet</p>
</li>
<li><p><strong>Description</strong>: Uso del agente</p>
</li>
<li><p><strong>System prompt</strong>: Prompt completo del sistema</p>
</li>
</ul>
<p><strong>Paso 9</strong>: Configuración del archivo del subagente <strong>Ejemplo de configuración manual avanzada</strong>:</p>
<pre><code class="lang-markdown">---
name: backend-architect
description: Diseña APIs RESTful, arquitecturas de microservicios y esquemas de base de datos. USAR PROACTIVAMENTE para diseño de sistemas
<span class="hljs-section">tools: file<span class="hljs-emphasis">_read, file_</span>write, bash, grep
---</span>

Eres un arquitecto backend senior con experiencia en:
<span class="hljs-bullet">-</span> Diseño de APIs REST y GraphQL escalables
<span class="hljs-bullet">-</span> Patrones de microservicios y service mesh
<span class="hljs-bullet">-</span> Optimización de bases de datos y queries
<span class="hljs-bullet">-</span> Implementación de cache distribuido
<span class="hljs-bullet">-</span> Observabilidad y métricas de sistemas

Siempre considera:
<span class="hljs-bullet">-</span> Escalabilidad horizontal
<span class="hljs-bullet">-</span> Tolerancia a fallos
<span class="hljs-bullet">-</span> Principios de seguridad por diseño
<span class="hljs-bullet">-</span> Patrones de resiliencia (circuit breaker, retry, timeout)
</code></pre>
<p>Las capturas de pantalla revelan que la interfaz de Claude Code para crear subagentes es sorprendentemente intuitiva, siguiendo un wizard paso a paso que elimina la complejidad técnica inicial. El proceso está optimizado para desarrolladores de todos los niveles:</p>
<p><strong>Características destacadas observadas</strong>:</p>
<ul>
<li><p><strong>Interfaz terminal moderna</strong>: Diseño limpio con navegación clara usando teclas de dirección</p>
</li>
<li><p><strong>Generación asistida</strong>: Claude puede crear automáticamente el prompt del sistema basándose en una descripción simple</p>
</li>
<li><p><strong>Configuración granular</strong>: Control preciso sobre herramientas, modelos y ubicación sin código</p>
</li>
<li><p><strong>Preview en tiempo real</strong>: Visualización del nombre del agente antes de confirmar</p>
</li>
<li><p><strong>Validación automática</strong>: El sistema previene errores comunes en la configuración</p>
</li>
</ul>
<p><strong>Detalle del ejemplo "test-suite-generator"</strong>: Las capturas muestran la creación de un especialista en testing que demuestra la sophistication del sistema. El agente resultante incluye:</p>
<ul>
<li><p>Descripción clara de uso ("Use this agent when you need to create comprehensive test suites...")</p>
</li>
<li><p>Prompt del sistema complejo generado automáticamente ("You are a Test Engineering Specialist with deep expertise...")</p>
</li>
<li><p>Configuración de herramientas completa con advertencias de seguridad</p>
</li>
<li><p>Ubicación específica en <code>.claude/agents/</code><a target="_blank" href="http://test-suite-generator.md"><code>test-suite-generator.md</code></a></p>
</li>
</ul>
<p>Este nivel de detalle en la configuración explica por qué los subagentes logran especialización tan efectiva comparado con prompts ad-hoc.</p>
<h3 id="heading-workflows-practicos-avanzados">Workflows prácticos avanzados</h3>
<p><strong>Desarrollo full-stack paralelo</strong>:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Orquestación de 4 subagentes especializados</span>
&gt; Ejecuta desarrollo completo de e-commerce usando 4 subagentes en paralelo:
- backend-architect para APIs y microservicios
- frontend-developer para interfaz React
- security-auditor para revisión de vulnerabilidades  
- test-automator para suites de pruebas completas
</code></pre>
<p><strong>Resultado típico</strong>:</p>
<pre><code class="lang-plaintext">⏺ Task(Diseño arquitectura backend)
⎿ Done (17 herramientas · 56.6k tokens · 1m 34s)
⏺ Task(Implementación frontend React)  
⎿ Done (23 herramientas · 48.9k tokens · 1m 16s)
⏺ Task(Auditoría de seguridad)
⎿ Done (28 herramientas · 45.2k tokens · 1m 44s)
⏺ Task(Generación suite de pruebas)
⎿ Done (23 herramientas · 70.5k tokens · 2m 17s)
</code></pre>
<p><strong>Análisis de codebase masivo</strong>:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Análisis especializado por expertos</span>
&gt; Analiza el proyecto usando 4 expertos especializados:
- experto-rendimiento para bottlenecks y optimizaciones
- experto-seguridad para vulnerabilidades y compliance
- experto-arquitectura para deuda técnica y mejoras
- experto-testing para cobertura y calidad de pruebas
</code></pre>
<h3 id="heading-comandos-personalizados-slash-commands">Comandos personalizados (Slash Commands)</h3>
<p>Los subagentes se pueden automatizar creando comandos personalizados:</p>
<p><code>.claude/commands/</code><a target="_blank" href="http://fix-github-issue.md"><code>fix-github-issue.md</code></a>:</p>
<p>markdown</p>
<pre><code class="lang-markdown">Analiza y corrige el issue #$ARGUMENTS de GitHub siguiendo este workflow:

<span class="hljs-bullet">1.</span> Ejecutar <span class="hljs-code">`gh issue view $ARGUMENTS`</span> para obtener detalles
<span class="hljs-bullet">2.</span> Usar backend-architect para análisis de impacto arquitectural
<span class="hljs-bullet">3.</span> Usar security-auditor si involucra aspectos de seguridad
<span class="hljs-bullet">4.</span> Implementar corrección con test-automator generando pruebas
<span class="hljs-bullet">5.</span> Crear PR con descripción detallada

Delegar automáticamente a subagentes apropiados basándose en el tipo de issue.
</code></pre>
<p><strong>Uso</strong>: <code>/project:fix-github-issue 1234</code></p>
<h2 id="heading-revolucion-del-contexto-de-200000-tokens">Revolución del contexto de 200,000 tokens</h2>
<h3 id="heading-capacidades-tecnicas-del-contexto-ampliado">Capacidades técnicas del contexto ampliado</h3>
<p><strong>Equivalencias de capacidad</strong>:</p>
<ul>
<li><p><strong>200,000 tokens = ~150,000 palabras = 500+ páginas de documentación</strong></p>
</li>
<li><p><strong>Capacidad total efectiva</strong>: 2,000,000 tokens con 10 subagentes paralelos</p>
</li>
<li><p><strong>Recall del 98%</strong> a través de toda la ventana de contexto (Claude 2.1+)</p>
</li>
</ul>
<p><strong>Beneficios específicos para desarrollo</strong>:</p>
<p><strong>Análisis de codebases completos</strong>: Los subagentes pueden procesar repositorios masivos, incluyendo documentación técnica, bases de código completas, y declaraciones financieras como S-1s sin necesidad de chunking o compresión.</p>
<p><strong>Eliminación de compresión frecuente</strong>: Las versiones anteriores perdían contexto gradualmente, requiriendo resúmenes y compresión que introducían errores. Los subagentes mantienen contexto completo durante toda la sesión.</p>
<p><strong>Contexto aislado por especialidad</strong>: Un subagente security-auditor mantiene 200k tokens enfocados exclusivamente en aspectos de seguridad, sin contaminación de tareas de UI o performance.</p>
<p><strong>Memoria persistente en Opus 4</strong>: El modelo más avanzado puede crear y mantener archivos de memoria para proyectos que se extienden por días o semanas, recordando decisiones arquitecturales previas.</p>
<h3 id="heading-conclusion">Conclusión</h3>
<p>Los subagentes de Claude Code representan un cambio paradigmático hacia "equipos AI especializados" que operan como desarrolladores humanos especializados, cada uno con expertise profunda en su dominio y capacidad de mantener contexto completo durante sesiones extendidas. Esta arquitectura resuelve limitaciones fundamentales de herramientas AI tradicionales mientras introduce nuevas capacidades de orquestación paralela que prometen redefinir workflows de desarrollo de software en los próximos años.</p>
]]></content:encoded></item><item><title><![CDATA[Amazon S3 Vectors: La Revolución del Almacenamiento de Vectores en la Nube para DevOps y la IA Generativa]]></title><description><![CDATA[La explosión de la Inteligencia Artificial Generativa trajo nuevos desafíos y oportunidades, especialmente en el manejo de grandes volúmenes de datos vectoriales. Como profesionales de AWS, siempre estamos buscando soluciones que optimicen la infraes...]]></description><link>https://blog.cloudacademy.ar/amazon-s3-vectors-la-revolucion-del-almacenamiento-de-vectores-en-la-nube-para-devops-y-la-ia-generativa</link><guid isPermaLink="true">https://blog.cloudacademy.ar/amazon-s3-vectors-la-revolucion-del-almacenamiento-de-vectores-en-la-nube-para-devops-y-la-ia-generativa</guid><category><![CDATA[Devops]]></category><category><![CDATA[AI]]></category><category><![CDATA[S3]]></category><category><![CDATA[Amazon Bedrock]]></category><category><![CDATA[AWS]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Wed, 16 Jul 2025 12:59:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1752669802862/829837b5-b4ee-47e1-984a-e788cd258ce7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>La explosión de la Inteligencia Artificial Generativa trajo nuevos desafíos y oportunidades, especialmente en el manejo de grandes volúmenes de datos vectoriales. Como profesionales de AWS, siempre estamos buscando soluciones que optimicen la infraestructura, reduzcan costos y simplifiquen la operación. ¡Prepárense para conocer una innovación que va a cambiar la forma en que almacenamos y consultamos embeddings a escala: <strong>Amazon S3 Vectors</strong>! 🚀</p>
<p>Hasta ahora, el almacenamiento de embeddings vectoriales a menudo implicaba compromisos: o usabas bases de datos vectoriales especializadas con sus propios desafíos de gestión, o intentabas adaptar soluciones de almacenamiento de objetos con capas adicionales de complejidad y costo. Amazon S3 Vectors, presentado en AWS re:Invent 2024, es el primer almacenamiento de objetos en la nube con soporte nativo para vectores, diseñado para ofrecer un rendimiento de consulta en subsegundos y una reducción significativa de costos.</p>
<hr />
<h3 id="heading-que-es-amazon-s3-vectors-y-por-que-es-un-cambio-de-juego"><strong>¿Qué es Amazon S3 Vectors y por qué es un cambio de juego?</strong></h3>
<p>En esencia, Amazon S3 Vectors transforma S3 en una potente solución para el almacenamiento y la consulta de datos vectoriales. Esto es crucial para aplicaciones de IA generativa como Retrieval Augmented Generation (RAG), donde la capacidad de buscar rápidamente en vastos conjuntos de datos para contextualizar las respuestas del modelo es fundamental.</p>
<p>La principal ventaja es la <strong>simplicidad y la reducción de costos</strong>. Al integrar el soporte de vectores directamente en S3, AWS elimina la necesidad de infraestructuras complejas y costosas, permitiendo un ahorro de hasta el <strong>90%</strong> en el costo total de carga, almacenamiento y consulta de vectores.</p>
<hr />
<h3 id="heading-conceptos-clave-vector-buckets-e-indices-de-vectores"><strong>Conceptos Clave: Vector Buckets e Índices de Vectores</strong></h3>
<p>Amazon S3 Vectors introduce dos nuevos conceptos fundamentales:</p>
<ul>
<li><p><strong>Vector Buckets:</strong> Son los contenedores donde se almacenan tus datos vectoriales. A diferencia de los buckets S3 tradicionales, los Vector Buckets están optimizados específicamente para este tipo de datos.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670394645/28d1877a-c0c6-41e4-ad5d-e155314ae084.png" alt class="image--center mx-auto" /></p>
<p>  <em>Creación de un "vector bucket" en Amazon S3, optimizado para el almacenamiento de vectores.</em></p>
</li>
<li><p><strong>Índices de Vectores:</strong> Dentro de un Vector Bucket, la información se organiza en "<strong>índices de vectores</strong>". Cada índice puede contener millones de vectores y es donde se realizan las consultas eficientes. Puedes adjuntar metadatos a tus vectores para realizar consultas filtradas, lo que es invaluable para la búsqueda semántica.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670414917/069ac821-8a0a-42c1-9f0e-448db609f387.png" alt class="image--center mx-auto" /></p>
<p>  <em>Configuración de un "vector index", definiendo la dimensión y la métrica de distancia para la búsqueda de similitud.</em></p>
</li>
</ul>
<p>La interfaz de usuario es intuitiva, permitiendo una configuración rápida y sencilla, como se ve en las siguientes pantallas:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670438739/6d4dc7de-df15-42d5-b88c-b3789ff9191c.png" alt class="image--center mx-auto" /></p>
<p><em>Confirmación de la creación exitosa de un "vector bucket" y la opción de crear un índice de vectores.</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670459484/2da9c6a8-7e65-43fc-84ec-7f9e25fd7600.png" alt class="image--center mx-auto" /></p>
<p><em>Vista de los índices de vectores creados dentro de un "vector bucket".</em></p>
<hr />
<h3 id="heading-el-flujo-de-trabajo-de-documentos-a-busqueda-semantica"><strong>El Flujo de Trabajo: De Documentos a Búsqueda Semántica</strong></h3>
<p>El proceso es sorprendentemente lineal y eficiente:</p>
<ol>
<li><p><strong>Generación de Embeddings:</strong> Tus documentos o datos se transforman en embeddings vectoriales utilizando un modelo de embedding.</p>
</li>
<li><p><strong>Almacenamiento en S3 Vectors:</strong> Estos embeddings se almacenan directamente en tus Vector Buckets e Índices de Vectores en S3.</p>
</li>
<li><p><strong>Búsqueda Semántica:</strong> Los usuarios pueden realizar consultas de similitud a través del índice de vectores para encontrar los datos más relevantes.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670480290/283586ab-8105-44a4-b074-b6c28ad68634.png" alt class="image--center mx-auto" /></p>
<p><em>Diagrama del flujo de trabajo: de documentos a embeddings, almacenamiento en S3 Vectors y búsqueda semántica.</em></p>
<hr />
<h3 id="heading-integracion-profunda-con-el-ecosistema-aws"><strong>Integración Profunda con el Ecosistema AWS</strong></h3>
<p>Una de las mayores fortalezas de Amazon S3 Vectors es su <strong>integración nativa y profunda</strong> con otros servicios clave de AWS, lo que lo convierte en una pieza fundamental de tu pipeline de IA generativa:</p>
<ul>
<li><p><strong>Amazon Bedrock Knowledge Bases:</strong> Para aplicaciones RAG, S3 Vectors se integra directamente con las bases de conocimiento de Bedrock, actuando como el almacén subyacente para los embeddings, mejorando la precisión y relevancia de las respuestas generadas por los modelos de lenguaje grandes (LLMs).</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670498422/fbf22173-639f-4b5f-afda-7e7257b885b1.png" alt class="image--center mx-auto" /></p>
<p>  <em>Configuración del almacenamiento de datos en Amazon Bedrock Knowledge Bases, donde S3 Vectors es una opción recomendada.</em></p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670536751/20fe1082-7ba4-40d6-8807-261e0d9d3bf5.png" alt class="image--center mx-auto" /></p>
<p>  <em>Selección de Amazon S3 Vectors como almacén de vectores en Bedrock, destacando su optimización para el costo y la durabilidad.</em></p>
</li>
<li><p><strong>Amazon SageMaker:</strong> Puedes usar SageMaker para generar embeddings y luego almacenarlos en S3 Vectors, o para construir y entrenar modelos que utilicen estos datos vectoriales.</p>
</li>
<li><p><strong>Amazon OpenSearch Service:</strong> Para escenarios que requieren capacidades de búsqueda en tiempo real o híbridas (texto y vector), puedes exportar datos de S3 Vectors a Amazon OpenSearch Service. Esto permite equilibrar el costo del almacenamiento con la necesidad de un rendimiento de consulta ultra-rápido.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670564023/84d25b9b-fc98-4b6e-82b1-4dd35c1a4676.png" alt class="image--center mx-auto" /></p>
<p>  <em>Opción para exportar un índice de vectores de S3 a OpenSearch para capacidades de búsqueda avanzadas.</em></p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670585670/a1fb2776-369f-4fb7-8785-6e71968207fa.png" alt class="image--center mx-auto" /></p>
<p>  <em>Configuración para exportar un índice de vectores de S3 a un motor de vectores de OpenSearch, con detalles de cómo funciona la integración.</em></p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752670616516/e90dcf4d-dd23-4773-83be-24949f3314f1.png" alt class="image--center mx-auto" /></p>
<p>  <em>Historial de importación de vectores de S3 a OpenSearch, mostrando el estado de las operaciones.</em></p>
</li>
</ul>
<hr />
<h3 id="heading-implicaciones-para-devops"><strong>Implicaciones para DevOps</strong></h3>
<p>Para los equipos de DevOps, Amazon S3 Vectors significa:</p>
<ul>
<li><p><strong>Menos Infraestructura que Gestionar:</strong> Al aprovechar un servicio gestionado directamente desde S3, se reduce la carga de provisionar, escalar y mantener bases de datos vectoriales dedicadas.</p>
</li>
<li><p><strong>Costos Optimizados:</strong> La eficiencia en el almacenamiento y consulta se traduce directamente en menores facturas de AWS. 💰</p>
</li>
<li><p><strong>Integración Simplificada:</strong> La integración nativa con Bedrock y otros servicios de AWS agiliza el despliegue de aplicaciones de IA generativa, permitiendo a los equipos enfocarse en la lógica de negocio en lugar de la complejidad de la infraestructura de datos.</p>
</li>
<li><p><strong>Escalabilidad a Demanda:</strong> S3 es conocido por su escalabilidad masiva, y S3 Vectors hereda esta capacidad, permitiendo manejar petabytes de datos vectoriales sin intervención manual.</p>
</li>
</ul>
<hr />
<h3 id="heading-conclusion"><strong>Conclusión</strong></h3>
<p>Amazon S3 Vectors es un hito significativo en el almacenamiento de datos para la era de la IA generativa. Ofrece una solución nativa, rentable y altamente escalable para gestionar embeddings vectoriales, simplificando enormemente el panorama para los desarrolladores y equipos de DevOps que construyen aplicaciones inteligentes. Si estás trabajando con IA generativa o planeas hacerlo, S3 Vectors es una capacidad que definitivamente querrás explorar.</p>
<p>Actualmente en <strong>vista previa</strong> en varias regiones de AWS (incluyendo US East (N. Virginia), US East (Ohio), US West (Oregon), Europe (Frankfurt) y Asia Pacific (Sydney)), es el momento perfecto para experimentar con esta poderosa herramienta y ver cómo puede transformar tus flujos de trabajo de IA. ¡No te quedes atrás! 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Kiro: El IDE Agnóstico de AWS que Busca Revolucionar el Desarrollo de Software con IA y Especificaciones]]></title><description><![CDATA[En un ecosistema de desarrollo de software cada vez más saturado de asistentes de codificación con IA, Amazon Web Services (AWS) ha presentado una propuesta que busca ir un paso más allá. Se trata de Kiro, un nuevo Entorno de Desarrollo Integrado (ID...]]></description><link>https://blog.cloudacademy.ar/kiro-el-ide-agnostico-de-aws-que-busca-revolucionar-el-desarrollo-de-software-con-ia-y-especificaciones</link><guid isPermaLink="true">https://blog.cloudacademy.ar/kiro-el-ide-agnostico-de-aws-que-busca-revolucionar-el-desarrollo-de-software-con-ia-y-especificaciones</guid><category><![CDATA[Devops]]></category><category><![CDATA[AWS]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Tue, 15 Jul 2025 02:21:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1752545673466/5e22246b-8cfa-423d-885e-4dd9eaaa9cc7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En un ecosistema de desarrollo de software cada vez más saturado de asistentes de codificación con IA, Amazon Web Services (AWS) ha presentado una propuesta que busca ir un paso más allá. Se trata de <strong>Kiro</strong>, un nuevo Entorno de Desarrollo Integrado (IDE) agnóstico que, si bien utiliza la inteligencia artificial como motor, pone el foco en un concepto clave: el <strong>desarrollo guiado por especificaciones (spec-driven development)</strong>.</p>
<p>Kiro no es solo una herramienta para autocompletar código o responder preguntas en un chat. Su ambición es mucho mayor: orquestar todo el ciclo de vida del desarrollo de software, desde la concepción de la idea hasta la implementación en producción, manteniendo siempre la coherencia entre la documentación, el diseño y el código.</p>
<p>En este artículo, analizaremos en profundidad qué es Kiro, cuáles son sus características técnicas más destacadas, cómo funciona y qué lo diferencia de otras herramientas de IA para desarrolladores que ya existen en el mercado.</p>
<p><strong>¿Qué es Kiro y Cuál es su Filosofía?</strong></p>
<p>Kiro es un IDE basado en <strong>Code OSS</strong>, el proyecto de código abierto sobre el que se construye el popular Visual Studio Code. Esto significa que los desarrolladores que ya están familiarizados con VS Code se sentirán como en casa, pudiendo conservar sus configuraciones y extensiones compatibles con Open VSX.</p>
<p>Sin embargo, Kiro no es una simple bifurcación de VS Code. Es una reimaginación de cómo debería ser el desarrollo de software en la era de la IA generativa. La filosofía de Kiro se resume en su eslogan: "From vibe coding to viable code" (Del "código por intuición" al "código viable").</p>
<p>El "vibe coding" es ese proceso, cada vez más común gracias a herramientas como GitHub Copilot, en el que los desarrolladores generan rápidamente prototipos y fragmentos de código sin una planificación o documentación rigurosa. Si bien esto acelera la fase inicial, a menudo conduce a un "caos de codificación": software difícil de mantener, con deuda técnica y sin una documentación clara que refleje su estado actual.</p>
<p>Kiro ataca este problema de raíz con su enfoque "spec-driven". En lugar de empezar a escribir código de inmediato, Kiro guía al desarrollador para que primero defina claramente <strong>qué</strong> quiere construir. A partir de un simple <em>prompt</em> en lenguaje natural, Kiro genera un conjunto de documentos de especificación:</p>
<ul>
<li><p><a target="_blank" href="http://requirements.md"><code>requirements.md</code></a>: Define la visión del producto, las características y los usuarios objetivo, utilizando una sintaxis estructurada como EARS (Easy Approach to Requirements Syntax).</p>
</li>
<li><p><a target="_blank" href="http://design.md"><code>design.md</code></a>: Documenta la arquitectura técnica, el stack tecnológico, los flujos de la experiencia de usuario, las interfaces de TypeScript, los esquemas de bases de datos y los <em>endpoints</em> de la API.</p>
</li>
<li><p><a target="_blank" href="http://tasks.md"><code>tasks.md</code></a>: Desglosa la implementación en una lista de tareas concretas y ordenadas por dependencias.</p>
</li>
</ul>
<p>La clave de Kiro es que estos documentos no son artefactos estáticos que se crean y luego se olvidan. Son documentos vivos que se mantienen sincronizados con el código a lo largo de todo el proceso de desarrollo. Si un desarrollador modifica el código, puede pedirle a Kiro que actualice las especificaciones, y viceversa.</p>
<p><strong>Características Técnicas Clave de Kiro</strong></p>
<p>Para lograr esta simbiosis entre especificaciones y código, Kiro se apoya en una serie de características técnicas innovadoras:</p>
<ul>
<li><p><strong>IA Agnóstica y Modelos de Vanguardia</strong>: En su núcleo, Kiro utiliza agentes de IA para interpretar los <em>prompts</em>, generar las especificaciones, escribir el código y realizar otras tareas. Estos agentes están impulsados por los modelos de última generación de Anthropic, como <strong>Claude 3.5 Sonnet y Claude 3 Opus</strong>. Kiro permite al usuario elegir qué modelo utilizar para sus agentes, lo que demuestra una flexibilidad notable.</p>
</li>
<li><p><strong>Kiro Hooks</strong>: Esta es una de las características más potentes de Kiro. Los "hooks" son automatizaciones basadas en eventos que delegan tareas a un agente de IA en segundo plano. Por ejemplo, se puede configurar un hook para que, cada vez que se guarda un archivo, un agente de IA genere automáticamente las pruebas unitarias correspondientes, actualice la documentación o verifique si se cumplen ciertos estándares de codificación. Es como tener un desarrollador experimentado revisando tu trabajo y ocupándose de las tareas repetitivas.</p>
</li>
<li><p><strong>Agentes de IA Autónomos</strong>: A diferencia de los asistentes de chat pasivos, los agentes de Kiro pueden actuar de forma autónoma para completar proyectos complejos. Pueden leer y escribir archivos, ejecutar comandos en la terminal, navegar por la base de código y tomar decisiones para llevar a cabo una tarea de principio a fin. El desarrollador puede elegir entre un modo "supervisado", donde el agente solicita aprobación para cada cambio, o un modo más autónomo.</p>
</li>
<li><p><strong>Comprensión Multimodal y Contexto Enriquecido</strong>: Kiro puede procesar una amplia variedad de entradas para construir un entendimiento profundo del proyecto. Acepta archivos, código base, documentos, imágenes, mapas de repositorios, <em>diffs</em> de Git, salidas de la terminal y URLs. Además, es compatible con <strong>servidores MCP (Managed Context Provider)</strong>, lo que le permite conectarse a fuentes de datos externas y privadas (como la documentación interna de una empresa) para enriquecer el contexto de sus agentes de IA.</p>
</li>
</ul>
<p><strong>Comparativa con Otras Herramientas de IA para Desarrollo</strong></p>
<p>El panorama de las herramientas de codificación con IA es cada vez más competitivo. ¿Dónde se sitúa Kiro frente a sus rivales?</p>
<ul>
<li><p><strong>Kiro vs. GitHub Copilot y Amazon Q Developer</strong>: Mientras que Copilot y Q se centran principalmente en la asistencia a nivel de código (autocompletado, chat, depuración), Kiro aspira a gestionar todo el flujo de trabajo. Su enfoque en la generación y mantenimiento de especificaciones lo diferencia claramente de estas herramientas.</p>
</li>
<li><p><strong>Kiro vs. Cursor y Windsurf</strong>: Cursor y Windsurf son IDEs que también han adoptado un enfoque "AI-first". Sin embargo, los análisis sugieren que el diferenciador clave de Kiro es su formalización del "spec-driven development" y la potencia de los "Kiro Hooks" para la automatización. Mientras que Cursor y Windsurf también son agnósticos en cuanto al código, la metodología estructurada de Kiro para la planificación y la documentación es su principal argumento de venta.</p>
</li>
</ul>
<p><strong>Disponibilidad y Precios</strong></p>
<p>Kiro se encuentra actualmente en una fase de <strong>vista previa pública</strong> y se puede descargar de forma gratuita desde su sitio web, <a target="_blank" href="http://kiro.dev">kiro.dev</a>, para macOS, Windows y Linux. Durante este período, el uso es gratuito con ciertos límites.</p>
<p>La empresa ha anunciado sus planes de precios futuros, que incluirán tres niveles:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752545632784/ba179cc7-9947-4a0e-a4fb-a052e01647de.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p><strong>Free</strong>: Con 50 interacciones de agente al mes.</p>
</li>
<li><p><strong>Pro</strong>: Por 19 dólares al mes por usuario, con 1,000 interacciones.</p>
</li>
<li><p><strong>Pro+</strong>: Por 39 dólares al mes por usuario, con 3,000 interacciones.</p>
</li>
</ul>
<p><strong>Conclusión: ¿El Futuro del Desarrollo de Software?</strong></p>
<p>Kiro representa una visión audaz y bien fundamentada sobre el futuro del desarrollo de software. En lugar de simplemente acelerar la escritura de código, Kiro busca mejorar la calidad, la mantenibilidad y la colaboración en los proyectos de software.</p>
<p>Su enfoque en el desarrollo guiado por especificaciones, combinado con la potencia de los agentes de IA autónomos y los "hooks" de automatización, tiene el potencial de resolver uno de los problemas más persistentes de la industria: la desconexión entre la documentación y la implementación.</p>
<p>Si bien aún es pronto para saber si Kiro logrará la adopción masiva que busca, su lanzamiento es, sin duda, una de las propuestas más interesantes y técnicamente sólidas que hemos visto en el campo de las herramientas de desarrollo con IA. Para los equipos y desarrolladores que buscan no solo velocidad, sino también orden y calidad en sus proyectos, Kiro es una herramienta a la que definitivamente habrá que seguir de cerca.</p>
]]></content:encoded></item><item><title><![CDATA[Todo lo que necesitas saber antes de usar EKS Auto Mode]]></title><description><![CDATA[AWS sacó hace poco una nueva función de EKS con el nombre de “AWS EKS Auto Mode”, la cual promete simplificar significativamente la gestión de nodos en clusters de Amazon EKS.En este artículo, vamos a analizar qué es, sus beneficios y, lo más importa...]]></description><link>https://blog.cloudacademy.ar/todo-lo-que-necesitas-saber-antes-de-usar-eks-auto-mode</link><guid isPermaLink="true">https://blog.cloudacademy.ar/todo-lo-que-necesitas-saber-antes-de-usar-eks-auto-mode</guid><category><![CDATA[AWS]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[EKS]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Tue, 21 Jan 2025 19:33:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1737486647675/da727ff9-011d-43dd-9122-34dc082828bb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AWS sacó hace poco una nueva función de EKS con el nombre de “AWS EKS Auto Mode”, la cual promete simplificar significativamente la gestión de nodos en clusters de Amazon EKS.<br />En este artículo, vamos a analizar qué es, sus beneficios y, lo más importante, las consideraciones clave antes de implementarlo en tu infraestructura.</p>
<h2 id="heading-que-es-eks-auto-mode">¿Qué es EKS Auto Mode?</h2>
<p>EKS Auto Mode es la respuesta de AWS a una antigua demanda de la comunidad de Kubernetes: la automatización en la gestión de nodos. Esta característica gestiona automáticamente el escalado de los nodos EKS en un cluster de Amazon EKS, lo que resulta especialmente útil para equipos que buscan una solución "hands-off" (con mínima intervención manual).</p>
<h2 id="heading-estructura-de-costos-lo-que-necesitas-saber">Estructura de Costos: Lo que Necesitas Saber</h2>
<p>Cuando implementas EKS Auto Mode, hay que considerar varios componentes en la estructura de costos:</p>
<h3 id="heading-1-costos-base">1. Costos Base</h3>
<h4 id="heading-tarifa-del-cluster-eks">Tarifa del Cluster EKS</h4>
<p>La tarifa base depende de la versión de Kubernetes que utilices:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737487114198/57ac7519-b542-49d2-ab7f-7467ea82c7f4.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-tarifa-de-eks-auto-mode">Tarifa de EKS Auto Mode</h4>
<p>Además de la tarifa base, <strong>hay un costo adicional por hora para las instancias EC2 gestionadas por EKS Auto Mode.</strong> Por ejemplo, en la región us-east-1, estos son los costos adicionales para instancias de uso general populares:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737487127667/8cbe5458-420b-4b25-84ca-19e1d794827a.png" alt class="image--center mx-auto" /></p>
<p>Como podes ver, hay tarifas adicionales de gestión que varían según el tipo de instancia EC2 utilizada.</p>
<h3 id="heading-2-costos-adicionales-que-permanecen">2. Costos Adicionales que Permanecen</h3>
<ul>
<li><p><strong>Almacenamiento</strong>:</p>
<ul>
<li><p>Volúmenes raíz de las instancias EC2</p>
</li>
<li><p>Volúmenes EBS adicionales (gp3 o io1)</p>
</li>
<li><p>Cargos por capacidad y IOPS</p>
</li>
</ul>
</li>
<li><p><strong>Networking</strong>:</p>
<ul>
<li><p>Direcciones IP elásticas</p>
</li>
<li><p>Transferencia de datos entre AZs y regiones</p>
</li>
<li><p>Componentes de VPC</p>
</li>
</ul>
</li>
<li><p><strong>Otros Costos</strong>:</p>
<ul>
<li><p>Fargate (si se utiliza)</p>
</li>
<li><p>Add-ons (charts de Helm, Route 53, integraciones de terceros)</p>
</li>
</ul>
</li>
</ul>
<h2 id="heading-limitaciones-importantes-con-instancias-spot">Limitaciones Importantes con Instancias Spot</h2>
<p>Una de las consideraciones más importantes es la integración con instancias spot. Aunque EKS Auto Mode sí soporta instancias spot, presenta algunas limitaciones significativas:</p>
<ol>
<li><p><strong>No hay Integración Flexible</strong>: No puedes mezclar instancias spot y bajo demanda en un mismo grupo de nodos.</p>
</li>
<li><p><strong>Configuración Separada</strong>: Requiere crear grupos de nodos separados para:</p>
<ul>
<li><p>Instancias On-Demand</p>
</li>
<li><p>Instancias Spot —&gt; No es administrado por auto-mode</p>
</li>
</ul>
</li>
</ol>
<p>Esto significa más overhead en términos de gestión y configuración, algo que debes considerar en tu arquitectura.</p>
<h2 id="heading-preguntas-frecuentes-sobre-eks-auto-mode">Preguntas Frecuentes sobre EKS Auto Mode</h2>
<h3 id="heading-opciones-de-compra-de-instancias-ec2">Opciones de Compra de Instancias EC2</h3>
<p><strong><em>¿Se pueden aprovechar las diferentes opciones de compra de instancias de Amazon EC2 con EKS Auto Mode?</em></strong></p>
<p>Sí, EKS Auto Mode es compatible con:</p>
<ul>
<li><p>Instancias On-Demand</p>
</li>
<li><p>Compute Savings Plans</p>
</li>
<li><p>Instancias Spot</p>
</li>
</ul>
<h3 id="heading-comparacion-con-karpenter-y-aws-autoscaler">Comparación con Karpenter y AWS Autoscaler</h3>
<p><strong><em>¿Es EKS Auto Mode similar a Karpenter gestionado?</em></strong></p>
<p>No son exactamente lo mismo. EKS Auto Mode ofrece funcionalidades adicionales:</p>
<ul>
<li><p>Gestión y parcheo de complementos core de EKS (CoreDNS, kube-proxy, VPC CNI)</p>
</li>
<li><p>Gestión de controladores EBS CSI</p>
</li>
<li><p>Gestión de controladores de balanceador de carga AWS</p>
</li>
</ul>
<p><strong><em>¿Se puede usar AWS Autoscaler con EKS Auto Mode?</em></strong></p>
<p>EKS Auto Mode utiliza Karpenter para el autoescalado de cómputo, lo que significa:</p>
<ul>
<li><p>Aprovisionamiento y escalado automático de instancias EC2 según demanda</p>
</li>
<li><p>El escalado horizontal de pods (HPA) requiere configuración manual del usuario</p>
</li>
</ul>
<h3 id="heading-gestion-de-clusters">Gestión de Clusters</h3>
<p><strong><em>¿Se puede habilitar EKS Auto Mode en clusters actuales?</em></strong></p>
<p>Sí, es posible habilitar EKS Auto Mode en clusters existentes. AWS proporciona documentación oficial para la implementación, aunque se recomienda utilizar Infrastructure as Code (IaC) para este proceso en lugar de hacerlo manualmente.</p>
<p><strong>¿Se puede deshabilitar una vez habilitado?</strong></p>
<p>Sí, AWS proporciona documentación oficial detallada sobre el proceso de deshabilitación.</p>
<h2 id="heading-gestion-de-iam-simplificada">Gestión de IAM Simplificada</h2>
<p>Una ventaja significativa es la simplificación en la gestión de IAM:</p>
<ol>
<li><p><strong>Aprovisionamiento Automático</strong>:</p>
<ul>
<li><p>Roles IAM para instancias EC2</p>
</li>
<li><p>Políticas predefinidas con privilegios mínimos</p>
</li>
<li><p>Gestión de permisos para add-ons core</p>
</li>
</ul>
</li>
<li><p><strong>Flexibilidad</strong>:</p>
<ul>
<li><p>Permite modificar roles y políticas según necesidades</p>
</li>
<li><p>Compatible con AWS Management Console, CLI y SDK</p>
</li>
</ul>
</li>
</ol>
<h2 id="heading-soporte-para-infraestructura-como-codigo">Soporte para Infraestructura como Código</h2>
<p>Para equipos que utilizan Terraform:</p>
<ul>
<li><p>Disponible desde la versión v5.79.0</p>
</li>
<li><p>Soporte para módulos aws-terraform desde v20.31.0</p>
</li>
</ul>
<h2 id="heading-cuando-usar-eks-auto-mode">¿Cuándo Usar EKS Auto Mode?</h2>
<p>EKS Auto Mode es ideal para:</p>
<ol>
<li><p>Equipos que prefieren menos gestión manual de la infraestructura</p>
</li>
<li><p>Proyectos que no requieren configuraciones complejas de instancias spot</p>
</li>
<li><p>Organizaciones que buscan simplificar la gestión de IAM y add-ons</p>
</li>
</ol>
<h2 id="heading-conclusion">Conclusión</h2>
<p>EKS Auto Mode representa un paso significativo hacia la abstracción de la gestión de Kubernetes en AWS. Si bien simplifica muchos aspectos de la administración del cluster, es importante considerar sus limitaciones, especialmente en lo relacionado con instancias spot y costos asociados. La decisión de implementarlo debe basarse en tus necesidades específicas de escalado, presupuesto y recursos de administración disponibles.</p>
]]></content:encoded></item><item><title><![CDATA[Sandbox Accounts for Events en AWS para entornos temporales seguros]]></title><description><![CDATA[En el ámbito de la computación en la nube, contar con entornos temporales y controlados se convirtió en una necesidad clave para capacitar equipos, realizar hackatones o pruebas de desarrollo. Sin embargo, administrar múltiples cuentas de AWS para es...]]></description><link>https://blog.cloudacademy.ar/sandbox-accounts-for-events-en-aws-para-entornos-temporales-seguros</link><guid isPermaLink="true">https://blog.cloudacademy.ar/sandbox-accounts-for-events-en-aws-para-entornos-temporales-seguros</guid><category><![CDATA[AWS]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[Developer]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Thu, 16 Jan 2025 03:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1737119436163/fd1263e0-d41f-4c8a-a332-376442a014b9.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En el ámbito de la computación en la nube, contar con entornos temporales y controlados se convirtió en una necesidad clave para capacitar equipos, realizar hackatones o pruebas de desarrollo. Sin embargo, administrar múltiples cuentas de AWS para estos fines puede ser una tarea compleja y propensa a errores.</p>
<p>Para abordar este desafío, AWS Labs desarrolló <a target="_blank" href="https://github.com/awslabs/sandbox-accounts-for-events"><strong>Sandbox Accounts for Events</strong></a>, una solución que automatiza la creación y gestión de cuentas temporales de AWS para eventos como talleres y hackatones. Esta herramienta permite a los organizadores configurar y entregar cuentas temporales con facilidad, asegurando que sean eliminadas o reiniciadas una vez finalizadas.</p>
<p>En este artículo, vamos a explorar qué es esta solución, cómo instalarla y cómo configurarla para aprovechar al máximo sus capacidades.</p>
<h2 id="heading-que-es-sandbox-accounts-for-events"><strong>¿Qué es Sandbox Accounts for Events?</strong></h2>
<p><strong>Sandbox Accounts for Events</strong> es un sistema que permite asignar cuentas temporales de AWS a varios usuarios al mismo tiempo. A través de una interfaz gráfica fácil de usar, los administradores pueden distribuir cuentas a los participantes y controlar su uso mediante una funcionalidad de "arrendamientos" o leases temporales.</p>
<p>El backend de la solución se basa en el proyecto <strong>Disposable Cloud Environment™ (DCE)</strong>, que se encarga de gestionar los recursos asociados, limpiar las cuentas al finalizar el arrendamiento y garantizar que los costos estén dentro de los límites establecidos. Esto permite a las organizaciones controlar tanto la seguridad como los presupuestos durante los eventos.</p>
<h3 id="heading-principales-caracteristicas"><strong>Principales características</strong></h3>
<ul>
<li><p><strong>Gestión de cuentas temporales:</strong> Permite crear y asignar cuentas temporales a múltiples usuarios autenticados.</p>
</li>
<li><p><strong>Control de gastos:</strong> Configura presupuestos máximos por cuenta para evitar costos inesperados.</p>
</li>
<li><p><strong>Eliminación automática:</strong> Utiliza AWS Nuke para limpiar las cuentas después de su expiración.</p>
</li>
<li><p><strong>Escalabilidad:</strong> Puede manejar múltiples usuarios simultáneamente, ideal para grandes eventos.</p>
</li>
</ul>
<h2 id="heading-casos-de-uso"><strong>Casos de uso</strong></h2>
<p><strong>Sandbox Accounts for Events</strong> es ideal para una amplia gama de escenarios, incluyendo:</p>
<ol>
<li><p><strong>Talleres educativos:</strong> Proporciona un entorno controlado para que los participantes aprendan a usar servicios de AWS.</p>
</li>
<li><p><strong>Hackatones:</strong> Ofrece cuentas aisladas y temporales para equipos que desarrollan soluciones innovadoras durante competencias.</p>
</li>
<li><p><strong>Pruebas y experimentos:</strong> Facilita la experimentación en entornos separados del entorno de producción, reduciendo riesgos.</p>
</li>
<li><p><strong>Capacitación interna:</strong> Equipos de desarrollo o investigación pueden acceder a entornos temporales para probar nuevas ideas.</p>
</li>
</ol>
<h2 id="heading-instalacion-de-sandbox-accounts-for-events"><strong>Instalación de Sandbox Accounts for Events</strong></h2>
<p>A continuación, te muestro cómo instalar y configurar esta herramienta en tu cuenta de AWS. El proceso es simple, pero requiere algunos pasos previos.</p>
<h3 id="heading-prerrequisitos"><strong>Prerrequisitos</strong></h3>
<p>Antes de empezar, necesitas tener lo siguiente:</p>
<ol>
<li><p><strong>Una cuenta de AWS:</strong> Es preferible usar una cuenta vinculada a AWS Organizations para un mejor control.</p>
</li>
<li><p><strong>Herramientas necesarias:</strong></p>
<ul>
<li><p><strong>AWS CLI:</strong> <a target="_blank" href="https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html">Instrucciones de instalación</a>.</p>
</li>
<li><p><strong>GNU Make:</strong> Instrucciones de instalación.</p>
</li>
<li><p><strong>Git:</strong> <a target="_blank" href="https://git-scm.com/">Descargar Git</a>.</p>
</li>
</ul>
</li>
<li><p><strong>Bucket de S3:</strong> Vas a necesitar un bucket para almacenar los artefactos de despliegue.</p>
</li>
</ol>
<h3 id="heading-pasos-de-instalacion"><strong>Pasos de instalación</strong></h3>
<p><strong>1- Clona el repositorio</strong><br />Abrí tu terminal y ejecuta:</p>
<pre><code class="lang-plaintext">git clone https://github.com/awslabs/sandbox-accounts-for-events.git
cd sandbox-accounts-for-events
</code></pre>
<p><strong>2- Crea un bucket de S3</strong><br />Este bucket va a almacenar los archivos necesarios para la implementación:</p>
<pre><code class="lang-plaintext">aws s3 mb s3://&lt;nombre-de-tu-bucket&gt;
</code></pre>
<p><strong>3- Construye los artefactos</strong><br />Compila los artefactos necesarios ejecutando:</p>
<pre><code class="lang-plaintext">make build
</code></pre>
<p><strong>4- Despliega la solución</strong><br />Implementa la aplicación en tu cuenta de AWS:</p>
<pre><code class="lang-plaintext">make deploy BUCKET_NAME=&lt;nombre-de-tu-bucket&gt;
</code></pre>
<p><strong>5- Configura el frontend</strong><br />Una vez completada la implementación, vas a tener una URL para el frontend de la aplicación. Esta URL puede ser compartida con los usuarios para que se registren y accedan a sus cuentas temporales.</p>
<h2 id="heading-configuracion-avanzada"><strong>Configuración avanzada</strong></h2>
<h3 id="heading-integracion-con-aws-organizations"><strong>Integración con AWS Organizations</strong></h3>
<p>Aunque esta herramienta puede usarse sin AWS Organizations, se recomienda su integración para un mejor control. AWS Organizations permite:</p>
<ul>
<li><p>Limitar el acceso a servicios y regiones específicas mediante políticas SCP (Service Control Policies).</p>
</li>
<li><p>Administrar las cuentas sandbox desde una unidad organizativa centralizada.</p>
</li>
<li><p>Implementar medidas de seguridad avanzadas para proteger los entornos.</p>
</li>
</ul>
<h3 id="heading-definir-limites-de-tiempo-y-presupuesto"><strong>Definir límites de tiempo y presupuesto</strong></h3>
<p>Al configurar la solución, podes ajustar la duración máxima de los arrendamientos y establecer presupuestos por cuenta. Esto asegura que los recursos sean liberados automáticamente una vez que se alcanza el tiempo límite o el presupuesto asignado.</p>
<h2 id="heading-mejores-practicas-de-seguridad"><strong>Mejores prácticas de seguridad</strong></h2>
<p>Es importante seguir las siguientes recomendaciones para garantizar la seguridad al utilizar esta herramienta:</p>
<ol>
<li><p><strong>Mantén el software actualizado:</strong> Las versiones más recientes del proyecto solucionan vulnerabilidades como <strong>CVE-2023-50928</strong>, que permitía a usuarios autenticados acceder a cuentas vacías.</p>
</li>
<li><p><strong>Monitorea el uso:</strong> Utiliza herramientas como AWS CloudWatch para supervisar el uso de las cuentas temporales y asegurarte de que no excedan los presupuestos.</p>
</li>
<li><p><strong>Limita los accesos:</strong> Configura políticas de IAM estrictas para evitar que los usuarios accedan a recursos no autorizados.</p>
</li>
</ol>
<h2 id="heading-enlace-al-repositorio"><strong>Enlace al repositorio</strong></h2>
<p>Consulta el repositorio oficial para obtener más detalles y acceder a actualizaciones:<br /><a target="_blank" href="https://github.com/awslabs/sandbox-accounts-for-events"><strong>Sandbox Accounts for Events en GitHub</strong></a>.</p>
<h2 id="heading-conclusion"><strong>Conclusión</strong></h2>
<p><strong>Sandbox Accounts for Events</strong> es una herramienta poderosa para gestionar entornos temporales en AWS. Su capacidad de automatizar la creación, asignación y limpieza de cuentas permite a los organizadores centrarse en el contenido de los eventos, en lugar de en la administración de los recursos.</p>
<p>Con esta solución, podes ofrecer experiencias de aprendizaje y desarrollo seguras y escalables, optimizando tanto la seguridad como los costos.</p>
]]></content:encoded></item><item><title><![CDATA[¡Así que querés ser DevOps! Ejercicios para este 2025 🚀]]></title><description><![CDATA[Si andas explorando el mundo DevOps, probablemente te hayas dado cuenta de que hay MUCHÍSIMAS tecnologías por aprender. Encontré un repo súper interesante en GitHub que te va a encantar - está lleno de ejercicios prácticos y recursos que te van a fac...]]></description><link>https://blog.cloudacademy.ar/asi-que-queres-ser-devops-ejercicios-para-este-2025</link><guid isPermaLink="true">https://blog.cloudacademy.ar/asi-que-queres-ser-devops-ejercicios-para-este-2025</guid><category><![CDATA[Devops]]></category><category><![CDATA[EKS]]></category><category><![CDATA[AWS]]></category><category><![CDATA[SRE]]></category><category><![CDATA[Docker]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Wed, 08 Jan 2025 15:50:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1736351730044/7734869f-81ac-4b05-b282-c5089d64aad5.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Si andas explorando el mundo DevOps, probablemente te hayas dado cuenta de que hay MUCHÍSIMAS tecnologías por aprender. Encontré un repo súper interesante en GitHub que te va a encantar - está lleno de ejercicios prácticos y recursos que te van a facilitar el camino.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/NotHarshhaa/into-the-devops/tree/master">https://github.com/NotHarshhaa/into-the-devops/tree/master</a></div>
<p> </p>
<h2 id="heading-por-que-trabajar-como-devopssre">¿Por qué trabajar como DevOps/SRE?</h2>
<p>Antes de sumergirnos en el mar de tecnologías, hay que tener algo claro: DevOps no es solo aprender herramientas - es toda una forma de pensar y trabajar que une desarrollo y operaciones. Es como ser el puente entre quienes crean el software y quienes lo mantienen funcionando. ¡Y sí, se paga bastante bien! 😉</p>
<h2 id="heading-las-herramientas-que-realmente-importan">Las herramientas que realmente importan</h2>
<p>El repo que encontré es una mina de oro con más de 860 ejercicios. Pero tranquilo, no necesitas dominarlo todo para empezar. Aquí te dejo lo más jugoso:</p>
<h3 id="heading-lo-basico-pero-super-importante">Lo básico (pero súper importante)</h3>
<ul>
<li><p><strong>Linux</strong>: El rey indiscutible de los servidores. Si no lo conoces, por aquí hay que empezar.</p>
</li>
<li><p><strong>Git</strong>: Donde guardamos todo nuestro código. Sin esto no vas a ningún lado.</p>
</li>
<li><p><strong>Docker</strong>: La magia que hace que todo funcione igual en todas partes.</p>
</li>
</ul>
<h3 id="heading-para-automatizar-todo">Para automatizar todo</h3>
<ul>
<li><p><strong>Jenkins</strong>: El mayordomo que hace todo el trabajo pesado por ti.</p>
</li>
<li><p><strong>Kubernetes</strong>: El director de orquesta de tus contenedores. Suena intimidante, pero una vez que le agarras el truco, ¡es genial!</p>
</li>
<li><p><strong>Ansible</strong>: Para automatizar esas tareas repetitivas que todos odiamos.</p>
</li>
</ul>
<h3 id="heading-la-nube">La nube ☁️</h3>
<ul>
<li><p><strong>AWS, Azure y GCP</strong>: Los tres grandes del cloud. AWS es como el hermano mayor que todos conocen.</p>
</li>
<li><p><strong>Terraform</strong>: Para crear infraestructura escribiendo código. ¡Es como jugar Minecraft pero en modo profesional!</p>
</li>
</ul>
<h3 id="heading-para-saber-si-todo-funciona-bien">Para saber si todo funciona bien</h3>
<ul>
<li><p><strong>Prometheus</strong>: Tu detector de problemas personal.</p>
</li>
<li><p><strong>Elastic Stack</strong>: Para almacenar logs</p>
</li>
</ul>
<h2 id="heading-por-donde-empezar-sin-volverse-loco">Por dónde empezar (sin volverse loco)</h2>
<p>Lo mejor de este repo es que puedes ir a tu ritmo. No necesitas convertirte en expert@ en todo de la noche a la mañana. De hecho, es mejor que no lo intentes - tu cerebro te lo agradecerá.</p>
<h2 id="heading-tips-para-no-morir-en-el-intento">Tips para no morir en el intento</h2>
<ol>
<li><p>Empieza por lo básico: Linux y Git. Son como el ABC del DevOps.</p>
</li>
<li><p>Échale un ojo a AWS - todo el mundo lo usa y hay toneladas de recursos gratis para aprender.</p>
</li>
<li><p>Juega con Docker - es divertido y super útil.</p>
</li>
<li><p>No te asustes con Kubernetes al principio - ya llegará su momento.</p>
</li>
<li><p>Aprende a automatizar cosas simples primero - la satisfacción de ver algo funcionando solo es increíble.</p>
</li>
</ol>
<h2 id="heading-para-cerrar">Para cerrar...</h2>
<p>¿Parece mucho? Sí. ¿Vale la pena? ¡Totalmente! El truco está en no querer aprenderlo todo de golpe. Es como comerse un elefante - hay que ir bocado a bocado 🐘</p>
<p>Lo más importante es empezar y divertirse en el proceso. DevOps es un viaje largo, pero con recursos como este repo, al menos tienes un buen mapa para no perderte.</p>
]]></content:encoded></item><item><title><![CDATA[The Twelve-Factor App: Una Metodología para Construir Aplicaciones Cloud Native]]></title><description><![CDATA[En el mundo del desarrollo de software moderno, la construcción de aplicaciones nativas para la nube (cloud-native) se convirtió en un estándar de la industria. La metodología Twelve-Factor App, originalmente formulada por los desarrolladores de Hero...]]></description><link>https://blog.cloudacademy.ar/the-twelve-factor-app-una-metodologia-para-construir-aplicaciones-cloud-native</link><guid isPermaLink="true">https://blog.cloudacademy.ar/the-twelve-factor-app-una-metodologia-para-construir-aplicaciones-cloud-native</guid><category><![CDATA[Devops]]></category><category><![CDATA[twelve factor app]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Developer]]></category><category><![CDATA[Devops articles]]></category><category><![CDATA[ECS]]></category><category><![CDATA[EKS]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Wed, 27 Nov 2024 22:12:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732745353946/5a927cb8-ca27-48a4-b9bc-ca957ec79d6d.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En el mundo del desarrollo de software moderno, la construcción de aplicaciones nativas para la nube (cloud-native) se convirtió en un estándar de la industria. La metodología Twelve-Factor App, originalmente formulada por los desarrolladores de Heroku, proporciona un conjunto de mejores prácticas para crear aplicaciones que funcionan de manera óptima en entornos cloud.</p>
<p>Este artículo está basado en las siguientes fuentes oficiales:</p>
<ul>
<li><p>Sitio web oficial: <a target="_blank" href="https://12factor.net/">https://12factor.net/</a></p>
</li>
<li><p>Repositorio GitHub: <a target="_blank" href="https://github.com/twelve-factor/twelve-factor">https://github.com/twelve-factor/twelve-factor</a></p>
</li>
<li><p>Blog oficial: <a target="_blank" href="https://12factor.net/blog">https://12factor.net/blog</a></p>
</li>
</ul>
<h2 id="heading-los-doce-factores">Los Doce Factores</h2>
<h3 id="heading-1-codebase-base-de-codigo">1. CodeBase (Base de Código)</h3>
<p><strong>Principio</strong>: Una base de código versionada en control de revisión, múltiples despliegues.</p>
<ul>
<li><p>Correlación uno a uno entre el repositorio y la aplicación</p>
</li>
<li><p>Mismo código base para todos los entornos</p>
</li>
<li><p>Múltiples despliegues representan diferentes instancias de la misma aplicación</p>
</li>
</ul>
<h3 id="heading-2-dependencies-dependencias">2. Dependencies (Dependencias)</h3>
<p><strong>Principio</strong>: Declarar y aislar dependencias explícitamente.</p>
<ul>
<li><p>Declaración explícita de todas las dependencias</p>
</li>
<li><p>Uso de sistemas de gestión de dependencias</p>
</li>
<li><p>No dependencias implícitas del sistema</p>
</li>
</ul>
<h3 id="heading-3-config-configuracion">3. Config (Configuración)</h3>
<p><strong>Principio</strong>: Almacenar la configuración en el entorno.</p>
<ul>
<li><p>Separación estricta de configuración y código</p>
</li>
<li><p>Variables de entorno como configuración</p>
</li>
<li><p>No credenciales en el código</p>
</li>
</ul>
<h3 id="heading-4-backing-services-servicios-de-respaldo">4. Backing Services (Servicios de Respaldo)</h3>
<p><strong>Principio</strong>: Tratar los servicios de respaldo como recursos adjuntos.</p>
<ul>
<li><p>Servicios externos tratados como recursos</p>
</li>
<li><p>Intercambiables sin cambios en el código</p>
</li>
<li><p>Base de datos, colas, servicios de correo, etc.</p>
</li>
</ul>
<h3 id="heading-5-build-release-run-construccion-liberacion-ejecucion">5. Build, Release, Run (Construcción, Liberación, Ejecución)</h3>
<p><strong>Principio</strong>: Separación estricta entre las etapas de construcción y ejecución.</p>
<ul>
<li><p>Etapa de construcción: transformar código en bundle</p>
</li>
<li><p>Etapa de liberación: combinar bundle con configuración</p>
</li>
<li><p>Etapa de ejecución: correr la aplicación</p>
</li>
</ul>
<h3 id="heading-6-processes-procesos">6. Processes (Procesos)</h3>
<p><strong>Principio</strong>: Ejecutar la aplicación como uno o más procesos sin estado.</p>
<ul>
<li><p>Procesos sin estado y que no comparten nada</p>
</li>
<li><p>Los datos persistentes se almacenan en servicios de respaldo</p>
</li>
<li><p>No sesiones sticky</p>
</li>
</ul>
<h3 id="heading-7-port-binding-vinculacion-de-puertos">7. Port Binding (Vinculación de Puertos)</h3>
<p><strong>Principio</strong>: Exportar servicios mediante vinculación de puertos.</p>
<ul>
<li><p>La aplicación es completamente autónoma</p>
</li>
<li><p>Expone servicios vía puerto</p>
</li>
<li><p>No depende de servidores web en tiempo de ejecución</p>
</li>
</ul>
<h3 id="heading-8-concurrency-concurrencia">8. Concurrency (Concurrencia)</h3>
<p><strong>Principio</strong>: Escalar mediante el modelo de procesos.</p>
<ul>
<li><p>Procesos como primera clase ciudadana</p>
</li>
<li><p>Diseño para manejar cargas diversas</p>
</li>
<li><p>Escalado horizontal de procesos</p>
</li>
</ul>
<h3 id="heading-9-disposability-desechabilidad">9. Disposability (Desechabilidad)</h3>
<p><strong>Principio</strong>: Maximizar la robustez con inicio rápido y apagado gracioso.</p>
<ul>
<li><p>Procesos desechables</p>
</li>
<li><p>Inicio rápido</p>
</li>
<li><p>Apagado gracioso cuando reciben SIGTERM</p>
</li>
</ul>
<h3 id="heading-10-devprod-parity-paridad-devprod">10. Dev/Prod Parity (Paridad Dev/Prod)</h3>
<p><strong>Principio</strong>: Mantener desarrollo, staging y producción lo más similares posible.</p>
<ul>
<li><p>Minimizar gaps entre entornos</p>
</li>
<li><p>Mismo backing services en todos los entornos</p>
</li>
<li><p>Mismo código y configuraciones (con valores diferentes)</p>
</li>
</ul>
<h3 id="heading-11-logs-registros">11. Logs (Registros)</h3>
<p><strong>Principio</strong>: Tratar los logs como flujos de eventos.</p>
<ul>
<li><p>Logs como flujos de eventos</p>
</li>
<li><p>No gestionar archivos de log</p>
</li>
<li><p>Delegar a servicios de agregación</p>
</li>
</ul>
<h3 id="heading-12-admin-processes-procesos-de-administracion">12. Admin Processes (Procesos de Administración)</h3>
<p><strong>Principio</strong>: Ejecutar tareas de administración/gestión como procesos únicos.</p>
<ul>
<li><p>Procesos admin como parte del código</p>
</li>
<li><p>Mismo entorno que procesos regulares</p>
</li>
<li><p>Código admin versionado con la aplicación</p>
</li>
</ul>
<h2 id="heading-relaciones-entre-los-factores">Relaciones entre los Factores</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732745182440/4bdb695b-6a55-4ad7-a140-e339c5253fa0.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-beneficios-de-aplicar-los-twelve-factors">Beneficios de Aplicar los Twelve-Factors</h2>
<ol>
<li><p><strong>Portabilidad</strong></p>
<ul>
<li><p>Aplicaciones que pueden ejecutarse en cualquier proveedor cloud</p>
</li>
<li><p>Minimización de dependencias con el entorno</p>
</li>
<li><p>Facilidad de migración entre plataformas</p>
</li>
<li><p>Reducción del vendor lock-in</p>
</li>
</ul>
</li>
<li><p><strong>Escalabilidad</strong></p>
<ul>
<li><p>Arquitectura que soporta crecimiento horizontal</p>
</li>
<li><p>Procesamiento distribuido eficiente</p>
</li>
<li><p>Mejor manejo de cargas variables</p>
</li>
<li><p>Optimización de recursos</p>
</li>
</ul>
</li>
<li><p><strong>Mantenibilidad</strong></p>
<ul>
<li><p>Código más limpio y organizado</p>
</li>
<li><p>Separación clara de responsabilidades</p>
</li>
<li><p>Reducción de la deuda técnica</p>
</li>
<li><p>Facilitación del onboarding de nuevos desarrolladores</p>
</li>
</ul>
</li>
<li><p><strong>Desarrollo Ágil</strong></p>
<ul>
<li><p>Flujos de trabajo optimizados</p>
</li>
<li><p>Despliegues más rápidos y seguros</p>
</li>
<li><p>CI/CD simplificado</p>
</li>
<li><p>Reducción del tiempo de desarrollo</p>
</li>
</ul>
</li>
<li><p><strong>Confiabilidad</strong></p>
<ul>
<li><p>Sistemas más robustos</p>
</li>
<li><p>Recuperación automática de fallos</p>
</li>
<li><p>Mejor observabilidad</p>
</li>
<li><p>Gestión eficiente de logs y monitoreo</p>
</li>
</ul>
</li>
</ol>
<h2 id="heading-desafios-comunes">Desafíos Comunes</h2>
<ol>
<li><p><strong>Transición Cultural</strong></p>
<ul>
<li><p>Cambio en la mentalidad de desarrollo</p>
</li>
<li><p>Adopción de nuevas prácticas</p>
</li>
<li><p>Resistencia al cambio</p>
</li>
</ul>
</li>
<li><p><strong>Complejidad Técnica</strong></p>
<ul>
<li><p>Curva de aprendizaje inicial</p>
</li>
<li><p>Necesidad de nuevas herramientas</p>
</li>
<li><p>Refactorización de aplicaciones existentes</p>
</li>
</ul>
</li>
<li><p><strong>Inversión Inicial</strong></p>
<ul>
<li><p>Tiempo de capacitación</p>
</li>
<li><p>Recursos para la transformación</p>
</li>
<li><p>Posible impacto en la velocidad inicial de desarrollo</p>
</li>
</ul>
</li>
</ol>
<p>La metodología Twelve-Factor App proporciona un marco sólido para construir aplicaciones modernas que son:</p>
<ul>
<li><p>Nativas para la nube</p>
</li>
<li><p>Escalables</p>
</li>
<li><p>Mantenibles</p>
</li>
<li><p>Portables</p>
</li>
</ul>
<p>Esta metodología no solo define principios técnicos, sino que también establece un estándar para la cultura DevOps moderna. Al seguir estos principios, las organizaciones pueden:</p>
<ul>
<li><p>Reducir costos operativos</p>
</li>
<li><p>Mejorar la calidad del software</p>
</li>
<li><p>Aumentar la velocidad de entrega</p>
</li>
<li><p>Facilitar la innovación</p>
</li>
</ul>
<p>¿Preguntas? ¿Comentarios? Comparte tus experiencias implementando estos principios en tus proyectos.</p>
<hr />
<p><em>Este artículo forma parte de una serie sobre la implementación de Twelve-Factor App en AWS. Síguenos para no perderte los próximos artículos donde profundizaremos en cada factor.</em></p>
]]></content:encoded></item><item><title><![CDATA[Cómo Integrar SonarQube en AWS CodePipeline]]></title><description><![CDATA[En este artículo, te mostraré cómo integrar SonarQube en un pipeline de AWS CodePipeline. SonarQube es una herramienta poderosa para análisis de código estático que detecta problemas de calidad y vulnerabilidades de seguridad en tu código. A continua...]]></description><link>https://blog.cloudacademy.ar/como-integrar-sonarqube-en-aws-codepipeline</link><guid isPermaLink="true">https://blog.cloudacademy.ar/como-integrar-sonarqube-en-aws-codepipeline</guid><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Wed, 27 Nov 2024 22:02:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1725367027548/5c276eb5-2b2b-4a1d-8f89-73b42e028d02.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>En este artículo, te mostraré cómo integrar SonarQube en un pipeline de AWS CodePipeline. SonarQube es una herramienta poderosa para análisis de código estático que detecta problemas de calidad y vulnerabilidades de seguridad en tu código. A continuación, explico cómo hacerlo con ejemplos para proyectos en Java, Node.js, PHP, Go (Golang) y Python.</p>
<h2 id="heading-1-configurar-sonarqube">1. Configurar SonarQube</h2>
<p>Antes de comenzar, asegúrate de tener una instancia de SonarQube en ejecución. Puedes configurar SonarQube en un servidor dedicado o utilizar una instancia de EC2 en AWS. Si prefieres, también puedes utilizar SonarCloud, que es la versión en la nube de SonarQube (requiere suscripción).</p>
<h2 id="heading-2-crear-un-proyecto-en-sonarqube">2. Crear un Proyecto en SonarQube</h2>
<ul>
<li><p>Inicia sesión en tu instancia de SonarQube.</p>
</li>
<li><p>Crea un proyecto nuevo y genera un token de autenticación. Este token se utilizará para integrar SonarQube en tu pipeline de AWS CodePipeline.</p>
</li>
</ul>
<h2 id="heading-3-configurar-aws-codebuild">3. Configurar AWS CodeBuild</h2>
<p>La integración de SonarQube se realiza durante la fase de construcción en CodeBuild. Aquí es donde ejecutarás el escaneo de SonarQube.</p>
<h3 id="heading-a-modificar-buildspecyml">a. Modificar <code>buildspec.yml</code></h3>
<p>El archivo <code>buildspec.yml</code> debe configurarse para ejecutar el análisis de SonarQube utilizando un plugin o un script.</p>
<h3 id="heading-ejemplos-por-lenguaje">Ejemplos por Lenguaje</h3>
<h3 id="heading-java-maven"><strong>Java (Maven)</strong></h3>
<pre><code class="lang-plaintext">version: 0.2

phases:
  install:
    commands:
      - echo "Instalando dependencias..."
      - mvn install -DskipTests=true
  build:
    commands:
      - echo "Ejecutando análisis de SonarQube..."
      - mvn sonar:sonar \
          -Dsonar.projectKey=my_project_key \
          -Dsonar.host.url=http://&lt;SONARQUBE_URL&gt;:9000 \
          -Dsonar.login=&lt;SONARQUBE_TOKEN&gt;
  post_build:
    commands:
      - echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
  files:
    - target/**
  discard-paths: yes
</code></pre>
<p>Reemplaza <code>&lt;SONARQUBE_URL&gt;</code> con la URL de tu instancia de SonarQube y <code>&lt;SONARQUBE_TOKEN&gt;</code> con el token generado.</p>
<h3 id="heading-nodejs"><strong>Node.js</strong></h3>
<pre><code class="lang-plaintext">version: 0.2

phases:
  install:
    commands:
      - echo "Instalando SonarScanner..."
      - npm install -g sonarqube-scanner
  build:
    commands:
      - echo "Ejecutando análisis de SonarQube..."
      - sonarqube-scanner \
          -Dsonar.projectKey=my_project_key \
          -Dsonar.sources=. \
          -Dsonar.host.url=http://&lt;SONARQUBE_URL&gt;:9000 \
          -Dsonar.login=&lt;SONARQUBE_TOKEN&gt;
  post_build:
    commands:
      - echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
  files:
    - coverage/*
  discard-paths: yes
</code></pre>
<p>Este ejemplo instala el SonarScanner para Node.js y ejecuta el análisis.</p>
<h3 id="heading-php"><strong>PHP</strong></h3>
<pre><code class="lang-plaintext">version: 0.2

phases:
  install:
    commands:
      - echo "Instalando Composer..."
      - curl -sS https://getcomposer.org/installer | php
      - php composer.phar install
  build:
    commands:
      - echo "Ejecutando análisis de SonarQube..."
      - sonar-scanner \
          -Dsonar.projectKey=my_project_key \
          -Dsonar.sources=. \
          -Dsonar.host.url=http://&lt;SONARQUBE_URL&gt;:9000 \
          -Dsonar.login=&lt;SONARQUBE_TOKEN&gt;
  post_build:
    commands:
      - echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
  files:
    - build/
  discard-paths: yes
</code></pre>
<p>En PHP, SonarScanner se ejecuta después de instalar las dependencias con Composer.</p>
<h3 id="heading-golang-go"><strong>Golang (Go)</strong></h3>
<pre><code class="lang-plaintext">version: 0.2

phases:
  install:
    commands:
      - echo "Instalando Go y dependencias..."
      - wget https://golang.org/dl/go1.16.3.linux-amd64.tar.gz
      - tar -C /usr/local -xzf go1.16.3.linux-amd64.tar.gz
      - export PATH=$PATH:/usr/local/go/bin
      - go mod download
  build:
    commands:
      - echo "Ejecutando análisis de SonarQube..."
      - sonar-scanner \
          -Dsonar.projectKey=my_project_key \
          -Dsonar.sources=. \
          -Dsonar.host.url=http://&lt;SONARQUBE_URL&gt;:9000 \
          -Dsonar.login=&lt;SONARQUBE_TOKEN&gt;
  post_build:
    commands:
      - echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
  files:
    - bin/*
  discard-paths: yes
</code></pre>
<p>En Go, SonarScanner se ejecuta después de descargar las dependencias.</p>
<h3 id="heading-python"><strong>Python</strong></h3>
<pre><code class="lang-plaintext">version: 0.2

phases:
  install:
    commands:
      - echo "Instalando SonarScanner..."
      - pip install sonar-scanner
  build:
    commands:
      - echo "Ejecutando análisis de SonarQube..."
      - sonar-scanner \
          -Dsonar.projectKey=my_project_key \
          -Dsonar.sources=. \
          -Dsonar.host.url=http://&lt;SONARQUBE_URL&gt;:9000 \
          -Dsonar.login=&lt;SONARQUBE_TOKEN&gt;
  post_build:
    commands:
      - echo "Build completado. Revisando resultados de SonarQube..."
artifacts:
  files:
    - reports/*
  discard-paths: yes
</code></pre>
<p>En Python, SonarScanner se instala y ejecuta utilizando <code>pip</code>.</p>
<h2 id="heading-4-configurar-aws-codepipeline">4. Configurar AWS CodePipeline</h2>
<h3 id="heading-a-fase-de-construccion">a. Fase de construcción</h3>
<p>Dentro de CodePipeline, añade una fase de construcción que utilice el proyecto de CodeBuild donde has configurado el análisis de SonarQube.</p>
<ol>
<li><p><strong>Crear/editar tu pipeline de CodePipeline:</strong></p>
<ul>
<li><p>Añade una fase de construcción si no tienes una.</p>
</li>
<li><p>Configura la acción de construcción para que use el proyecto de CodeBuild que configuraste en el paso anterior.</p>
</li>
</ul>
</li>
</ol>
<h3 id="heading-b-resultados-del-analisis">b. Resultados del análisis</h3>
<p>SonarQube almacenará los resultados del análisis en su base de datos y proporcionará un tablero de control donde podrás revisar los problemas de calidad del código y las vulnerabilidades.</p>
<h2 id="heading-5-configurar-notificaciones-y-gestion-de-calidad-opcional">5. Configurar Notificaciones y Gestión de Calidad (Opcional)</h2>
<p>Puedes configurar SonarQube para que notifique al equipo de desarrollo si se encuentran problemas críticos o errores en el código. SonarQube también se puede configurar para establecer un "quality gate" que debe pasarse antes de permitir que el código se despliegue.</p>
<h2 id="heading-6-ejemplo-con-docker-opcional">6. Ejemplo con Docker (Opcional)</h2>
<p>Si prefieres ejecutar el análisis de SonarQube a través de un contenedor Docker en lugar de usar Maven, Node.js, PHP, Go o Python directamente, puedes usar un enfoque como este en tu <code>buildspec.yml</code>:</p>
<pre><code class="lang-plaintext">version: 0.2

phases:
  install:
    commands:
      - echo "Instalando Docker..."
      - yum install -y docker
      - service docker start
  build:
    commands:
      - echo "Ejecutando análisis de SonarQube usando Docker..."
      - docker run --rm -e SONAR_HOST_URL="http://&lt;SONARQUBE_URL&gt;:9000" -e SONAR_LOGIN="&lt;SONARQUBE_TOKEN&gt;" -v "$(pwd):/usr/src" sonarsource/sonar-scanner-cli
artifacts:
  files:
    - sonar-scanner-report.html
  discard-paths: yes
</code></pre>
<p>Este ejemplo utiliza el contenedor Docker oficial de SonarScanner para realizar el análisis.</p>
<h2 id="heading-7-integracion-con-otros-sistemas">7. Integración con Otros Sistemas</h2>
<p>SonarQube tiene integraciones con herramientas de CI/CD, Jira, GitHub, Bitbucket, etc. Puedes utilizar estas integraciones para reportar automáticamente problemas de calidad o bloquear merges en tus repositorios si el análisis no cumple con el estándar de calidad.</p>
<p>Integrar SonarQube en tu pipeline de AWS CodePipeline te permite ejecutar análisis de calidad de código de manera automatizada. CodeBuild es el componente que realiza el escaneo de SonarQube, y puedes configurar tu <code>buildspec.yml</code> para ejecutar el análisis según tus necesidades. La integración de SonarQube en tu pipeline te ayudará a mantener un alto estándar de calidad en tu código y detectar posibles vulnerabilidades de seguridad antes de que lleguen a producción.</p>
]]></content:encoded></item><item><title><![CDATA[ECS + Flask APP]]></title><description><![CDATA[Te guiaré paso a paso para crear un clúster de ECS (Elastic Container Service) en AWS y desplegar la aplicación Flask con Apache utilizando la imagen Docker que creaste.
1. Configuración Inicial

Instala AWS CLI: Si aún no tienes la AWS CLI instalada...]]></description><link>https://blog.cloudacademy.ar/ecs-flask-app</link><guid isPermaLink="true">https://blog.cloudacademy.ar/ecs-flask-app</guid><category><![CDATA[AWS]]></category><category><![CDATA[ECS]]></category><category><![CDATA[Python]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Developer]]></category><category><![CDATA[Devops articles]]></category><category><![CDATA[development]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Cloud Computing]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Wed, 27 Nov 2024 03:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724954320314/3d7e00b0-159d-42be-b904-37b40ab8d438.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Te guiaré paso a paso para crear un clúster de ECS (Elastic Container Service) en AWS y desplegar la aplicación Flask con Apache utilizando la imagen Docker que creaste.</p>
<h3 id="heading-1-configuracion-inicial">1. Configuración Inicial</h3>
<ol>
<li><p><strong>Instala AWS CLI</strong>: Si aún no tienes la AWS CLI instalada, sigue las instrucciones de <a target="_blank" href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html">AWS CLI Installation Guide</a>.</p>
</li>
<li><p><strong>Configura AWS CLI</strong>: Ejecuta <code>aws configure</code> y proporciona tus credenciales de AWS (Access Key ID, Secret Access Key, región, y formato de salida).</p>
</li>
<li><p><strong>Crea un Repositorio en ECR</strong>: Para almacenar la imagen Docker, debes crear un repositorio en Amazon ECR (Elastic Container Registry).</p>
<pre><code class="lang-bash"> aws ecr create-repository --repository-name flask-app --region your-region
</code></pre>
<p> Reemplaza <code>your-region</code> por tu región de AWS.</p>
</li>
<li><p><strong>Inicia Sesión en ECR</strong>: Usa el siguiente comando para autenticar Docker en ECR.</p>
<pre><code class="lang-bash"> aws ecr get-login-password --region your-region | docker login --username AWS --password-stdin &lt;aws-account-id&gt;.dkr.ecr.your-region.amazonaws.com
</code></pre>
</li>
<li><p><strong>Construye y Suba la Imagen a ECR</strong>:</p>
<ul>
<li><p>Construye la imagen Docker.</p>
<pre><code class="lang-bash">  docker build -t flask-app .
</code></pre>
</li>
<li><p>Etiqueta la imagen con la URL de tu repositorio de ECR.</p>
<pre><code class="lang-bash">  docker tag flask-app:latest &lt;aws-account-id&gt;.dkr.ecr.your-region.amazonaws.com/flask-app:latest
</code></pre>
</li>
<li><p>Sube la imagen a ECR.</p>
<pre><code class="lang-bash">  docker push &lt;aws-account-id&gt;.dkr.ecr.your-region.amazonaws.com/flask-app:latest
</code></pre>
</li>
</ul>
</li>
</ol>
<h3 id="heading-2-crear-el-cluster-de-ecs">2. Crear el Clúster de ECS</h3>
<ol>
<li><p><strong>Crea el Clúster</strong>: Puedes crear un clúster ECS usando Fargate o EC2. Aquí usaremos Fargate.</p>
<pre><code class="lang-bash"> aws ecs create-cluster --cluster-name flask-cluster
</code></pre>
</li>
</ol>
<h3 id="heading-3-crear-una-tarea-de-ecs">3. Crear una Tarea de ECS</h3>
<ol>
<li><p><strong>Define la Tarea de ECS</strong>: La tarea es la definición de cómo se ejecutará tu contenedor. Puedes crear una definición de tarea JSON o usar la CLI. Aquí un ejemplo de un archivo JSON para la definición de tarea.</p>
<p> Crea un archivo llamado <code>task-definition.json</code> con el siguiente contenido:</p>
<pre><code class="lang-json"> {
   <span class="hljs-attr">"family"</span>: <span class="hljs-string">"flask-task"</span>,
   <span class="hljs-attr">"networkMode"</span>: <span class="hljs-string">"awsvpc"</span>,
   <span class="hljs-attr">"containerDefinitions"</span>: [
     {
       <span class="hljs-attr">"name"</span>: <span class="hljs-string">"flask-container"</span>,
       <span class="hljs-attr">"image"</span>: <span class="hljs-string">"&lt;aws-account-id&gt;.dkr.ecr.your-region.amazonaws.com/flask-app:latest"</span>,
       <span class="hljs-attr">"portMappings"</span>: [
         {
           <span class="hljs-attr">"containerPort"</span>: <span class="hljs-number">80</span>,
           <span class="hljs-attr">"hostPort"</span>: <span class="hljs-number">80</span>,
           <span class="hljs-attr">"protocol"</span>: <span class="hljs-string">"tcp"</span>
         }
       ],
       <span class="hljs-attr">"essential"</span>: <span class="hljs-literal">true</span>
     }
   ],
   <span class="hljs-attr">"requiresCompatibilities"</span>: [<span class="hljs-string">"FARGATE"</span>],
   <span class="hljs-attr">"cpu"</span>: <span class="hljs-string">"256"</span>,
   <span class="hljs-attr">"memory"</span>: <span class="hljs-string">"512"</span>,
   <span class="hljs-attr">"executionRoleArn"</span>: <span class="hljs-string">"arn:aws:iam::&lt;aws-account-id&gt;:role/ecsTaskExecutionRole"</span>,
   <span class="hljs-attr">"networkConfiguration"</span>: {
     <span class="hljs-attr">"awsvpcConfiguration"</span>: {
       <span class="hljs-attr">"subnets"</span>: [<span class="hljs-string">"subnet-xxxxxxxx"</span>],
       <span class="hljs-attr">"securityGroups"</span>: [<span class="hljs-string">"sg-xxxxxxxx"</span>],
       <span class="hljs-attr">"assignPublicIp"</span>: <span class="hljs-string">"ENABLED"</span>
     }
   }
 }
</code></pre>
</li>
<li><p><strong>Registrar la Definición de Tarea</strong>: Usa el siguiente comando para registrar la definición de tarea.</p>
<pre><code class="lang-bash"> aws ecs register-task-definition --cli-input-json file://task-definition.json
</code></pre>
</li>
</ol>
<h3 id="heading-4-crear-un-servicio-ecs">4. Crear un Servicio ECS</h3>
<ol>
<li><p><strong>Crear el Servicio ECS</strong>: El servicio ECS se encarga de ejecutar y mantener tu tarea. Usa el siguiente comando para crear un servicio que ejecute la tarea.</p>
<pre><code class="lang-bash"> aws ecs create-service \
 --cluster flask-cluster \
 --service-name flask-service \
 --task-definition flask-task \
 --desired-count 1 \
 --launch-type FARGATE \
 --network-configuration <span class="hljs-string">"awsvpcConfiguration={subnets=[subnet-xxxxxxxx],securityGroups=[sg-xxxxxxxx],assignPublicIp=ENABLED}"</span>
</code></pre>
</li>
</ol>
<h3 id="heading-5-configuracion-de-balanceador-de-carga-opcional">5. Configuración de Balanceador de Carga (Opcional)</h3>
<p>Si necesitas un balanceador de carga (por ejemplo, ALB), sigue estos pasos adicionales:</p>
<ol>
<li><p><strong>Crea un Application Load Balancer (ALB)</strong> desde la consola de EC2 y configura un grupo de destino que apunte a tus tareas ECS.</p>
</li>
<li><p><strong>Asocia el ALB con el Servicio ECS</strong> en la definición del servicio utilizando el ARN del ALB.</p>
</li>
</ol>
<h3 id="heading-6-acceder-a-la-aplicacion">6. Acceder a la Aplicación</h3>
<p>Una vez que el servicio esté corriendo, puedes acceder a la aplicación Flask a través de la IP pública asignada a la tarea o mediante el DNS del Load Balancer si configuraste uno.</p>
<h3 id="heading-resumen">Resumen</h3>
<ul>
<li><p><strong>Sube la imagen Docker a ECR</strong>.</p>
</li>
<li><p><strong>Crea un clúster de ECS</strong>.</p>
</li>
<li><p><strong>Define y registra la tarea</strong> que ejecuta el contenedor.</p>
</li>
<li><p><strong>Crea un servicio ECS</strong> para mantener la tarea en ejecución.</p>
</li>
<li><p><strong>(Opcional) Configura un balanceador de carga</strong> para manejar el tráfico a las tareas.</p>
</li>
</ul>
<p>Con esto deberías tener tu aplicación Flask desplegada y accesible en AWS ECS.</p>
]]></content:encoded></item><item><title><![CDATA[Configuramos SSH en Dockerfile para acceder a pods en EKS]]></title><description><![CDATA[Cuando trabajas en aplicaciones PHP dentro de un contenedor Docker, puede haber situaciones en las que necesites acceso SSH directo al contenedor. Esto te permite inspeccionar archivos, ejecutar comandos, o realizar configuraciones rápidas que pueden...]]></description><link>https://blog.cloudacademy.ar/configuramos-ssh-en-dockerfile-para-acceder-a-pods-en-eks</link><guid isPermaLink="true">https://blog.cloudacademy.ar/configuramos-ssh-en-dockerfile-para-acceder-a-pods-en-eks</guid><category><![CDATA[ssh]]></category><category><![CDATA[Security]]></category><category><![CDATA[Devops]]></category><category><![CDATA[AWS]]></category><category><![CDATA[EKS]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Developer]]></category><category><![CDATA[Devops articles]]></category><category><![CDATA[development]]></category><dc:creator><![CDATA[Matias Martinez]]></dc:creator><pubDate>Tue, 22 Oct 2024 03:00:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724800564765/272da00c-8fc8-4074-bb20-45c3474f3628.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Cuando trabajas en aplicaciones PHP dentro de un contenedor Docker, puede haber situaciones en las que necesites acceso SSH directo al contenedor. Esto te permite inspeccionar archivos, ejecutar comandos, o realizar configuraciones rápidas que pueden ser más fáciles de manejar desde la línea de comandos. A continuación, te mostraré cómo instalar SSH en un contenedor Docker para una aplicación PHP y te explicaré algunos casos en los que esto puede ser útil.</p>
<h4 id="heading-casos-comunes-donde-se-necesita-ssh-en-un-contenedor-docker"><strong>Casos Comunes donde se Necesita SSH en un Contenedor Docker</strong></h4>
<ol>
<li><p><strong>Depuración en Producción</strong>: A veces, cuando un entorno de producción no funciona como se espera, el acceso SSH puede ser una herramienta poderosa para depurar en tiempo real.</p>
</li>
<li><p><strong>Ejecución de Comandos Manuales</strong>: Si necesitas ejecutar scripts manualmente o comandos de mantenimiento dentro del contenedor.</p>
</li>
<li><p><strong>Acceso a Archivos de Configuración</strong>: Si necesitas modificar archivos de configuración directamente en el contenedor para ajustar comportamientos de la aplicación o del servidor.</p>
</li>
<li><p><strong>Automatización Limitada</strong>: En escenarios donde la automatización no cubre todos los casos, el acceso SSH permite realizar ajustes manuales temporales.</p>
</li>
</ol>
<h3 id="heading-dockerfile-para-instalar-ssh-en-una-aplicacion-php"><strong>Dockerfile para Instalar SSH en una Aplicación PHP</strong></h3>
<p>A continuación, te dejo un ejemplo de cómo configurar SSH en tu contenedor Docker para una aplicación PHP. Este Dockerfile instala el servidor SSH y configura un acceso de usuario root con contraseña.</p>
<pre><code class="lang-plaintext"># Usar una imagen base de Ubuntu 20.04
FROM ubuntu:20.04

# Instalar actualizaciones y dependencias
RUN apt-get update &amp;&amp; apt-get install -y \
    apache2 \
    php \
    libapache2-mod-php \
    openssh-server

# Crear el directorio para el proceso de SSH
RUN mkdir /var/run/sshd

# Configurar la contraseña del usuario root (cambia 'your_password' por tu contraseña deseada)
RUN echo 'root:your_password' | chpasswd

# Permitir acceso root a través de SSH
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# Ajustar la configuración de PAM para SSH
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

# Habilitar módulos de Apache y limpiar la instalación
RUN a2enmod rewrite &amp;&amp; apt-get clean

# Exponer el puerto 22 para SSH y el puerto 80 para Apache
EXPOSE 22 80

# Iniciar el servicio SSH y Apache
CMD service apache2 start &amp;&amp; /usr/sbin/sshd -D
</code></pre>
<h3 id="heading-explicacion-del-dockerfile"><strong>Explicación del Dockerfile:</strong></h3>
<ul>
<li><p><strong>Instalación de SSH</strong>: La línea <code>apt-get install -y openssh-server</code> instala el servidor SSH en el contenedor.</p>
</li>
<li><p><strong>Directorio SSH</strong>: El comando <code>mkdir /var/run/sshd</code> crea el directorio necesario para que el servicio SSH funcione.</p>
</li>
<li><p><strong>Contraseña del root</strong>: El comando <code>echo 'root:your_password' | chpasswd</code> establece una contraseña para el usuario root. Asegúrate de cambiar <code>your_password</code> por una contraseña segura.</p>
</li>
<li><p><strong>Permitir Acceso Root por SSH</strong>: Modificamos el archivo de configuración de SSH para permitir el acceso al usuario root con contraseña.</p>
</li>
<li><p><strong>Ajustes de PAM</strong>: Este ajuste permite que el servicio SSH funcione correctamente en entornos Docker.</p>
</li>
<li><p><strong>Exposición del Puerto 22</strong>: SSH utiliza el puerto 22, así que lo exponemos en el contenedor.</p>
</li>
</ul>
<h3 id="heading-deployment-de-kubernetes-para-la-aplicacion-php-con-ssh"><strong>Deployment de Kubernetes para la Aplicación PHP con SSH</strong></h3>
<p>Ahora, veamos cómo configurar un Deployment en Kubernetes que incluya la ejecución de SSH junto con Apache:</p>
<pre><code class="lang-plaintext">apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-ssh-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-ssh
  template:
    metadata:
      labels:
        app: php-ssh
    spec:
      containers:
      - name: php-ssh-container
        image: tu-imagen:latest
        ports:
        - containerPort: 80  # Puerto para Apache
        - containerPort: 22  # Puerto para SSH
        command: ["/bin/sh", "-c"]
        args:
          - service apache2 start &amp;&amp; /usr/sbin/sshd -D;
        resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "200m"
            memory: "256Mi"
</code></pre>
<h3 id="heading-explicacion-del-deployment"><strong>Explicación del Deployment:</strong></h3>
<ul>
<li><p><strong>Especificación del Contenedor</strong>: Usamos una imagen Docker que incluye Apache y SSH configurado.</p>
</li>
<li><p><strong>Comando y Argumentos</strong>: Iniciamos tanto el servidor Apache como el servidor SSH cuando el contenedor se ejecuta.</p>
</li>
<li><p><strong>Puertos</strong>: Exponemos tanto el puerto 80 (para Apache) como el puerto 22 (para SSH) en el contenedor.</p>
</li>
</ul>
<p>Configurar SSH en un contenedor Docker para una aplicación PHP puede ser muy útil en varios escenarios de depuración y mantenimiento. Este artículo te proporciona una guía paso a paso para instalar y configurar SSH en tu contenedor y luego desplegarlo en un clúster Kubernetes. Sin embargo, es importante recordar que el acceso SSH a contenedores en producción debe ser utilizado con precaución y siempre asegurando el entorno con contraseñas seguras y controles de acceso adecuados.</p>
<p>Este método puede ser particularmente útil para tareas de administración rápida o depuración que requieren acceso directo al contenedor. Sin embargo, siempre es recomendable automatizar y mantener buenas prácticas de seguridad en tus entornos de contenedores y Kubernetes.</p>
]]></content:encoded></item></channel></rss>