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
BucketNameque 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.yamlResultado 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 desplegarResultado 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 deployIntegració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.json4. 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ípicasEjecuta:
aws cloudformation create-stack \
--stack-name quota-validation \
--template-body file://quota-template.yamlResultado esperado:ValidationError - Service quota exceeded for EC2-VPC: Requested 100, available 5Para 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 accountSolució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=trueConsideraciones 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/UpdateStackson 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
- Habilitá validaciones en todos los entornos: Incluso en desarrollo, ya que el costo de corregir errores temprano es mínimo.
- Integra con tu pipeline: Usá
cdk validateoaws cloudformation create-change-setcomo pasos previos acdk deploy/aws cloudformation update-stack. - Parseá errores estructurados: En automatizaciones, usá herramientas como
jqoyqpara extraerlogicalIdypathy corregir automáticamente (ej: generar nombres válidos para S3). - Documentá excepciones: Si deshabilitás validaciones en algún caso, documentá el motivo y el riesgo en tu runbook.
- Monitoreá eventos: Configurá alarmas en CloudWatch para errores de validación recurrentes (ej:
AWS/CloudFormationcon métricaStackEventsde tipoValidationError).
Errores comunes y cómo evitarlos
| Error | Causa | Solución |
|---|---|---|
