July 31, 2025

CDK

📘 ¿Qué es AWS CDK?

AWS CDK (Cloud Development Kit) es un framework de infraestructura como código (IaC) que permite definir recursos de AWS usando lenguajes de programación modernos como:

  • TypeScript

  • Python

  • Java

  • C#

  • Go

🔁 Genera CloudFormation automáticamente desde código orientado a objetos.


🧩 Ventajas clave

CaracterísticaDescripción
🔄 ReutilizableInfraestructura modular con clases, funciones y constructos
🧠 Más expresivoLógica condicional, loops, constantes, etc.
🧱 Abstracciones de alto nivelConstructos para recursos como Bucket, Function, Vpc
🚀 ProductivoIDEs, autocompletado y testing
📦 Ecosistema+200 constructos y librerías (@aws-cdk/aws-*)
🔐 SeguridadCompatible con CDK Pipelines, IAM, secrets, etc.

📦 Arquitectura general de CDK

 Código (TS/Python/Java)

 Constructos (L1, L2, L3)

 Stack (definición de recursos)

 Synthesize → CloudFormation Template (YAML/JSON)

 Deploy → AWS Resources
  • Constructos: Clases que encapsulan recursos

  • Stack: Unidad de despliegue (como una plantilla de CFN)

  • App: Conjunto de stacks


🧱 Niveles de Constructos

NivelDescripciónEjemplo
L1Bajo nivel: mapeo directo a CloudFormationCfnBucket, CfnInstance
L2Abstracción común con buenas prácticasBucket, Instance
L3Soluciones completas (constructos compuestos)aws-cdk/aws-ecs-patterns

🚀 Comandos principales de la CLI

# Inicializar app CDK
cdk init app --language typescript

# Compilar (TS → JS) y sintetizar template CFN
cdk synth

# Previsualizar cambios
cdk diff

# Desplegar stack
cdk deploy

# Eliminar stack
cdk destroy

📚 Ejemplo completo (TypeScript)

🪣 Crear un S3 Bucket y Lambda en CDK (TS)

import * as cdk from 'aws-cdk-lib';
import { Stack, StackProps } from 'aws-cdk-lib';
import { Bucket } from 'aws-cdk-lib/aws-s3';
import { Function, Runtime, Code } from 'aws-cdk-lib/aws-lambda';
import { Construct } from 'constructs';

export class MyStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const bucket = new Bucket(this, 'MyBucket', {
      versioned: true,
    });

    const fn = new Function(this, 'MyLambda', {
      runtime: Runtime.NODEJS_18_X,
      handler: 'index.handler',
      code: Code.fromAsset('lambda'),
      environment: {
        BUCKET_NAME: bucket.bucketName,
      }
    });

    bucket.grantReadWrite(fn); // Permisos automáticos
  }
}

🧪 Testing (unitario y snapshot)

  • Usando jest, pytest, o assertions de CDK
test('Bucket creado', () => {
  const app = new App();
  const stack = new MyStack(app, 'TestStack');
  expectCDK(stack).to(haveResource('AWS::S3::Bucket'));
});

🔐 Integración con otras herramientas

HerramientaIntegración con CDK
CodePipelineCDK Pipelines (aws-cdk/pipelines)
Secrets ManagerAcceso seguro a secretos (Secret.from*)
IAMPermisos explícitos en constructos
VPC / SGRed privada, grupos de seguridad
API GatewayLambdaRestApi, HttpApi, VpcLink

📤 Despliegue multiambiente

Usa contextos y entornos (dev, prod, etc.)

env: {
  account: process.env.CDK_DEFAULT_ACCOUNT,
  region: process.env.CDK_DEFAULT_REGION
}

También puedes usar perfiles de AWS con:

cdk deploy --profile prod

🌎 CDK vs Terraform vs CloudFormation

CaracterísticaCDKTerraformCloudFormation
LenguajeTS, Python, Java, GoHCL (propietario)YAML/JSON
Multi-cloud❌ Solo AWS✅ Sí❌ Solo AWS
Modularidad✅ Alta✅ Alta⚠️ Limitada
Productividad✅ Alta✅ Alta⚠️ Media
EcosistemaNativo de AWSMuy amplioLimitado

🧠 Buenas prácticas

  • Usa constructos L2/L3 por defecto

  • Evita lógica compleja en stacks (for, if excesivos)

  • Mantén constructos reusables en carpetas o librerías (lib/, constructs/)

  • Usa cdk diff antes de cada deploy

  • Activa terminationProtection si es producción

  • Usa context.json para valores sensibles por entorno


🎓 Preguntas tipo certificación

  1. ¿Qué genera el comando cdk synth?

    • ✅ Una plantilla de CloudFormation
  2. ¿Qué ventaja tiene CDK frente a CloudFormation?

    • ✅ Usa lenguajes de programación y es más expresivo
  3. ¿Puedo definir múltiples stacks en una misma app?

    • ✅ Sí, es común
  4. ¿Cuál es el nivel de constructo que encapsula varios recursos?

    • ✅ L3

📚 Recursos útiles