Introducción

Cada minuto que esperás a que falle un despliegue para enterarte de un error simple (como un nombre de bucket S3 inválido o un límite de cuota excedido) se traduce en tiempo perdido y costos innecesarios. AWS CloudFormation ahora valida tus stacks antes de provisionar recursos en operaciones de CreateStack y UpdateStack, usando las mismas reglas que ya existían para Change Sets. Esto significa que errores como conflictos de nombres, buckets S3 no vacíos o cuotas de servicio excedidas se detectan en segundos, sin necesidad de esperar a que el stack se cree y luego haga rollback.

En CDK, las validaciones se integran directamente en cdk deploy y cdk validate, mostrando informes estructurados que herramientas automatizadas e incluso agentes de IA pueden consumir para corregir problemas sobre la marcha. En esta guía, vas a implementar estas validaciones en tres escenarios comunes: despliegues manuales con la CLI, pipelines de CI/CD con AWS CLI, y despliegues con CDK.

Qué es y para qué sirve

Validación pre-despliegue es un conjunto de checks automáticos que AWS CloudFormation ejecuta antes de crear o actualizar recursos en un stack. Estos checks cubren:
  • Errores de sintaxis en propiedades de recursos (por ejemplo, un BucketName que no cumple con los requisitos de S3)
  • Conflictos de nombres entre recursos en el mismo stack
  • Cuotas de servicio excedidas (por ejemplo, intentar crear 100 VPC cuando tu cuenta solo permite 5)
  • Conflictos con AWS Config (por ejemplo, agregar reglas a un account donde el recorder no está habilitado)
  • Repositorios ECR no listos para borrar (contienen imágenes)

El resultado de estas validaciones se reporta en la consola, la CLI y la API, permitiéndote corregir errores antes de que se provisione un solo recurso. Para equipos de DevOps y SRE, esto reduce significativamente el tiempo de feedback loop desde minutos/hasta segundos, especialmente en pipelines automatizados donde cada falla implica re-ejecutar trabajos completos.

Prerequisitos

Antes de empezar, asegurate de tener:

  • AWS CLI instalada y configurada con credenciales válidas (versión >= 2.13.0)
  aws --version
  # aws-cli/2.13.0 Python/3.11.6 Linux/5.15.0-105-generic exe/x86_64.ubuntu.22
  
  • AWS CDK instalado (versión >= 2.120.0) si vas a usar CDK
  npm install -g aws-cdk
  cdk --version
  # 2.120.0 (build 0000000)
  
  • Permisos IAM: cloudformation:CreateStack, cloudformation:UpdateStack, cloudformation:DescribeStackEvents, cloudformation:DescribeStacks
  • Región AWS donde CloudFormation esté disponible (excluyendo China). Verificá la lista oficial:
  aws ec2 describe-regions --query "Regions[?ServiceName=='cloudformation'].RegionName" --output text
  

Guía paso a paso

1. Validar un stack manualmente antes de crearlo

Crea un archivo template.yaml con un bucket S3 que no cumple con las reglas de nombrado (debe ser DNS compatible):

AWSTemplateFormatVersion: '2010-09-01'
Resources:
  MyBrokenBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "invalid bucket name!"  # ¡espacios y caracteres inválidos!

Ejecuta el despliegue y observá cómo la validación falla antes de que se cree el stack:

aws cloudformation create-stack \
  --stack-name demo-bucket-validation \
  --template-body file://template.yaml
Resultado esperado:
{
  "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/demo-bucket-validation/abcdef-1234-5678",
  "ResponseMetadata": { ... }
}

Pero en la consola o CLI, verás un error similar a:

ValidationError - Property BucketName for resource MyBrokenBucket does not match pattern ^[a-z0-9][a-z0-9-.]{1,61}[a-z0-9]$: "invalid bucket name!"
¿Dónde ver el error?
  • CLI: aws cloudformation describe-stack-events --stack-name demo-bucket-validation
  • Consola: Navegá a CloudFormation > Stacks > demo-bucket-validation > Events > Operation ID > Deployment validations

2. Validar en un pipeline de CI/CD con Change Sets

En entornos automatizados, usá Change Sets para validar antes de desplegar. Crea un change-set.yaml:

AWSTemplateFormatVersion: '2010-09-01'
Resources:
  MyECRRepo:
    Type: AWS::ECR::Repository
    Properties:
      RepositoryName: "my-app"

Ejecutá estos comandos en tu pipeline (ejemplo en GitHub Actions):

# Crear Change Set (validación automática)
aws cloudformation create-change-set \
  --stack-name demo-ecr-validation \
  --change-set-name initial \
  --template-body file://change-set.yaml

# Verificar errores en el Change Set
aws cloudformation describe-change-set \
  --stack-name demo-ecr-validation \
  --change-set-name initial \
  --query 'ChangeSet.Changes[?Status==`Failed`]'
Resultado esperado:

Si el repositorio ECR existe pero no está vacío, verás:

[
  {
    "ResourceChange": {
      "Action": "Remove",
      "ResourceType": "AWS::ECR::Repository",
      "LogicalResourceId": "MyECRRepo",
      "Status": "Failed",
      "StatusReason": "Repository contains images"
    }
  }
]
Corrección: Borrá las imágenes del repo antes de intentar el cambio, o usá Force en la política de eliminación (no recomendado para producción).

3. Validar con CDK y obtener informes estructurados

Si usás CDK, las validaciones se integran directamente en cdk deploy y cdk validate. Crea un stack CDK en TypeScript (lib/demo-stack.ts):

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';

export class DemoStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new s3.Bucket(this, 'MyBucket', {
      bucketName: 'invalid-name!', // Nombre inválido para S3
    });
  }
}

Ejecuta:

cdk synth  # Genera el template CloudFormation (sin validar aún)
cdk validate   # Valida el stack SIN desplegar
Resultado esperado:
{
  "status": "FAILED",
  "errors": [
    {
      "type": "ValidationError",
      "message": "Property BucketName for resource MyBucket does not match pattern ^[a-z0-9][a-z0-9-.]{1,61}[a-z0-9]$",
      "logicalId": "MyBucket",
      "path": "/Resources/MyBucket/Properties/BucketName"
    }
  ],
  "warnings": []
}

Para desplegar (si todo está válido):

cdk deploy
Integración con CI/CD:

En tu pipeline, podés usar cdk validate como paso previo a cdk deploy y parsear el JSON para tomar decisiones automatizadas:

# Ejemplo en GitHub Actions
- name: Validar stack con CDK
  run: |
    cdk validate > validation-report.json
    jq 'if .status == "FAILED" then exit 1 else exit 0 end' validation-report.json

4. Deshabilitar validaciones (cuando sea necesario)

En casos puntuales, podés desactivar las validaciones para una operación específica. Usá el parámetro --disable-validation en CLI o DisableValidation en API:

aws cloudformation create-stack \
  --stack-name force-deploy-example \
  --template-body file://template.yaml \
  --disable-validation  # ¡Úsalo con cuidado!
Alternativa con CDK:

En CDK, podés desactivar validaciones por stack usando contextual providers:

const app = new cdk.App();
new DemoStack(app, 'DemoStack', {
  context: {
    '@aws-cdk/aws-cloudformation:disableValidation': true,
  },
});
Advertencia: Deshabilitar validaciones puede llevar a despliegues fallidos o recursos inconsistentes. Úsalo solo en entornos de desarrollo o cuando estés seguro de que la validación es redundante.

5. Validar cuotas de servicio y configuraciones avanzadas

Las nuevas validaciones incluyen checks de cuotas y conflictos con AWS Config. Proba esto:

AWSTemplateFormatVersion: '2010-09-01'
Resources:
  TooManyVPCs:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: "10.0.0.0/16"
      # Simulamos exceder cuota (la mayoría de accounts permiten 5 VPC)
      # En realidad, no creamos 100 para no fallar el ejemplo
      Tags:
        - Key: "Count"
          Value: "100"  # Esto excedería cuotas típicas

Ejecuta:

aws cloudformation create-stack \
  --stack-name quota-validation \
  --template-body file://quota-template.yaml
Resultado esperado:
ValidationError - Service quota exceeded for EC2-VPC: Requested 100, available 5
Para AWS Config:

Si tu template incluye reglas pero el recorder no está habilitado:

Resources:
  ConfigRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: "required-tags"
      Source:
        Owner: "AWS"
        SourceIdentifier: "required-tags"

El error será:

ValidationError - AWS Config Recorder conflict: no active recorder found in account
Solución: Habilitá el recorder primero:
aws configservice put-configuration-recorder \
  --configuration-recorder name=default,roleArn=arn:aws:iam::123456789012:role/aws-config-role \
  --recording-group allSupported=true,includeGlobalResourceTypes=true

Consideraciones y buenas prácticas

Limitaciones conocidas

  • Regiones excluidas: China (cn-north-1, cn-northwest-1) no soportan estas validaciones aún.
  • Validaciones parciales: Algunos recursos personalizados (Custom Resources) pueden no ser validados completamente.
  • Efecto en Change Sets: Las validaciones en CreateStack/UpdateStack son similares a las de Change Sets, pero no idénticas. Por ejemplo, las cuotas de servicio solo se validan en operaciones directas de stack.

Alternativas y complementos

  • AWS CloudFormation Guard: Para políticas personalizadas más allá de las validaciones estándar.
  • CDK Nag: Para validaciones adicionales en CDK usando reglas de seguridad y best practices.
  • AWS Config: Para validaciones continuas post-despliegue (ej: asegurarte de que un bucket sea privado).

Buenas prácticas para equipos

  1. Habilitá validaciones en todos los entornos: Incluso en desarrollo, ya que el costo de corregir errores temprano es mínimo.
  2. Integra con tu pipeline: Usá cdk validate o aws cloudformation create-change-set como pasos previos a cdk deploy/aws cloudformation update-stack.
  3. Parseá errores estructurados: En automatizaciones, usá herramientas como jq o yq para extraer logicalId y path y corregir automáticamente (ej: generar nombres válidos para S3).
  4. Documentá excepciones: Si deshabilitás validaciones en algún caso, documentá el motivo y el riesgo en tu runbook.
  5. Monitoreá eventos: Configurá alarmas en CloudWatch para errores de validación recurrentes (ej: AWS/CloudFormation con métrica StackEvents de tipo ValidationError).

Errores comunes y cómo evitarlos

ErrorCausaSolución
BLOCK56Nombre de bucket no cumple con DNSUsá BLOCK57 en CDK o generá un nombre válido
BLOCK58Intentás crear más recursos que tu cuota permiteRevisá BLOCK59 y solicitá un aumento
BLOCK60Intentás agregar reglas sin recorder activoHabilitá el recorder con BLOCK61
BLOCK62Intentás borrar un repo con imágenesBorrá las imágenes primero o usá BLOCK63 en la política de eliminación (solo para testing)
BLOCK64CDK deshabilitó validacionesVerificá tu contexto o remové la flag BLOCK65
## Conclusión

Las validaciones pre-despliegue en AWS CloudFormation y CDK son un cambio de paradigma para equipos de infraestructura: detectás errores antes de que se provisionen recursos, reduciendo ciclos de feedback de minutos a segundos. Esto es especialmente valioso en pipelines automatizados donde cada falla implica re-ejecutar trabajos completos y en despliegues con IA donde los agentes pueden corregir problemas sobre la marcha.

En esta guía:

  • Validaste stacks manualmente con aws cloudformation create-stack
  • Integraste validaciones en pipelines con Change Sets
  • Usaste cdk validate para obtener informes estructurados en CDK
  • Aprendiste a deshabilitar validaciones solo cuando sea necesario
  • Identificaste limitaciones y errores comunes con soluciones prácticas
Próximos pasos:
  1. Implementá validaciones en tu pipeline de CI/CD actual.
  2. Usá cdk validate en tus stacks CDK antes de cdk deploy.
  3. Configurá alertas en CloudWatch para errores de validación recurrentes.

FIN

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *