Docs / Architect Labs / Lab 21

Lab 21 — IaC con Guardrails

Pipeline de 4 pasos para generar infraestructura como código con Terraform, protegido por guardrails y code_rules que impiden configuraciones inseguras como buckets públicos o security groups abiertos.

Setup

Nivel: Full-Stack

Duración estimada: 40 minutos. Features: pipeline, dry-run, guardrails, code_rules, .architect.md, reports.

bash
mkdir -p ~/architect-labs/lab-21 && cd ~/architect-labs/lab-21
git init && mkdir -p terraform pipelines reports
# Instalar tfsec si disponible
which tfsec || echo "tfsec no instalado — los scans se simularán"

Configuración

.architect.md

markdown
# Terraform Conventions

## Estructura
- main.tf, variables.tf, outputs.tf, versions.tf por módulo
- Nombres de recursos en snake_case (aws_security_group.api_ingress)
- Variables con description y type obligatorios

## Obligatorio
- Tags en TODOS los recursos: Environment, Project, ManagedBy="terraform"
- Encryption at rest siempre habilitado
- Lifecycle prevent_destroy en recursos de datos
- Variables sin valores default para secrets

## Prohibido
- No hardcodear IPs, ARNs, o account IDs
- No usar default VPC
- No security groups con 0.0.0.0/0 ingress
- No S3 buckets con ACL public
- No imágenes Docker sin tag fijo (:latest prohibido)

.architect.yaml

yaml
llm:
  model: openai/gpt-4.1
  api_base: http://localhost:4000/v1
  api_key_env: LITELLM_API_KEY

guardrails:
  protected_files:
    - "*.tfstate"
    - "*.tfstate.backup"
    - ".terraform.lock.hcl"
    - "backend.tf"
  code_rules:
    - pattern: 'acl\s*=\s*"public'
      message: "S3 buckets must not be public"
      severity: block
    - pattern: 'cidr_blocks\s*=\s*\["0\.0\.0\.0/0"\]'
      message: "Do not open security groups to 0.0.0.0/0"
      severity: block
    - pattern: 'image\s*=\s*"[^:]*"$'
      message: "Docker images must have explicit tag"
      severity: warn
    - pattern: ':latest'
      message: "Do not use :latest tag"
      severity: warn
  blocked_commands:
    - "terraform apply"
    - "terraform destroy"
    - "kubectl delete"
    - "aws s3 rm"
  max_files_modified: 15

skills:
  auto_discover: true
bash
git add -A && git commit -m "initial: terraform project structure"

Precaución

Los blocked_commands incluyen terraform apply y terraform destroy. Architect puede generar y planificar IaC, pero nunca ejecutar cambios directamente en infraestructura.

Paso 1: Pipeline de generación IaC

pipelines/iac-generate.yaml

yaml
name: iac-generation
steps:
  - name: generate
    agent: build
    task: >
      Genera archivos Terraform en terraform/ para:
      - VPC con 2 subnets (pública y privada)
      - Security Group para una API (solo puertos 443 y 80 desde CIDRs específicos)
      - Redis ElastiCache cluster en la subnet privada
      - S3 bucket para logs (privado, encriptado, versionado)
      - IAM role para la aplicación con permisos mínimos

      Genera: main.tf, variables.tf, outputs.tf, versions.tf
      Sigue las convenciones de .architect.md.
      Todos los recursos deben tener tags: Environment, Project, ManagedBy.
    checkpoint: true

  - name: validate
    agent: build
    task: >
      Revisa los archivos Terraform generados en terraform/.
      Verifica:
      1. Todas las variables tienen type y description
      2. Todos los recursos tienen tags requeridos
      3. No hay CIDRs hardcodeados
      4. Security groups no usan 0.0.0.0/0
      5. S3 buckets son privados y encriptados
      Si encuentras violaciones, corrígelas.
      Escribe VALIDATION_RESULTS.md con lo encontrado.
    checkpoint: true

  - name: security-scan
    agent: build
    task: >
      Analiza los archivos Terraform en terraform/ buscando:
      1. Recursos sin encryption at rest
      2. Security groups demasiado permisivos
      3. IAM policies demasiado amplias
      4. Recursos accesibles desde internet que no deberían
      Corrige los findings de severidad HIGH.
      Documenta en SECURITY_SCAN.md.
    checkpoint: true

  - name: document
    agent: build
    task: >
      Genera terraform/README.md con:
      - Qué recursos se crean y su propósito
      - Variables requeridas con descripción
      - Outputs disponibles
      - Diagrama de infraestructura (formato mermaid)
      - Instrucciones de uso (init, plan, apply)

Paso 2: Dry run

bash
architect pipeline pipelines/iac-generate.yaml \
  --config .architect.yaml \
  --dry-run

Paso 3: Ejecutar

bash
architect pipeline pipelines/iac-generate.yaml \
  --config .architect.yaml \
  --confirm-mode yolo \
  --report-file reports/iac-pipeline.json

Paso 4: Verificar

bash
# Listar archivos generados
ls terraform/

# Verificar que NO hay 0.0.0.0/0
grep -rn "0.0.0.0/0" terraform/ || echo "OK: sin CIDRs abiertos"

# Verificar que NO hay buckets públicos
grep -rn "public" terraform/ | grep -i acl || echo "OK: sin buckets públicos"

# Verificar tags
grep -c "tags" terraform/main.tf

# Ver README generado
cat terraform/README.md

# Ver report
cat reports/iac-pipeline.json | python -m json.tool | head -30

Paso 5: Probar guardrails en acción

Intenta que Architect genere IaC insegura:

bash
architect run "Añade un security group en terraform/main.tf que permita \
  todo el tráfico desde 0.0.0.0/0 en todos los puertos." \
  --config .architect.yaml \
  --confirm-mode yolo

Resultado esperado: El code_rule bloquea 0.0.0.0/0.

bash
architect run "Crea un S3 bucket con ACL public-read para servir \
  assets estáticos." \
  --config .architect.yaml \
  --confirm-mode yolo

Resultado esperado: El code_rule bloquea acl = "public.

Consejo

Los code_rules de Terraform son especialmente útiles en equipos grandes donde quieres garantizar compliance de seguridad independientemente de quién genere la IaC.

Siguiente lab

Lab 22: Docs-as-Code Pipeline — Código cambia, docs se actualizan automáticamente.

END OF DOCUMENT

¿Necesitas más? Volver a la Librería →