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ística | Descripción |
|---|---|
| 🔄 Reutilizable | Infraestructura modular con clases, funciones y constructos |
| 🧠 Más expresivo | Lógica condicional, loops, constantes, etc. |
| 🧱 Abstracciones de alto nivel | Constructos para recursos como Bucket, Function, Vpc |
| 🚀 Productivo | IDEs, autocompletado y testing |
| 📦 Ecosistema | +200 constructos y librerías (@aws-cdk/aws-*) |
| 🔐 Seguridad | Compatible 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
| Nivel | Descripción | Ejemplo |
|---|---|---|
| L1 | Bajo nivel: mapeo directo a CloudFormation | CfnBucket, CfnInstance |
| L2 | Abstracción común con buenas prácticas | Bucket, Instance |
| L3 | Soluciones 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, oassertionsde 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
| Herramienta | Integración con CDK |
|---|---|
| CodePipeline | CDK Pipelines (aws-cdk/pipelines) |
| Secrets Manager | Acceso seguro a secretos (Secret.from*) |
| IAM | Permisos explícitos en constructos |
| VPC / SG | Red privada, grupos de seguridad |
| API Gateway | LambdaRestApi, 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ística | CDK | Terraform | CloudFormation |
|---|---|---|---|
| Lenguaje | TS, Python, Java, Go | HCL (propietario) | YAML/JSON |
| Multi-cloud | ❌ Solo AWS | ✅ Sí | ❌ Solo AWS |
| Modularidad | ✅ Alta | ✅ Alta | ⚠️ Limitada |
| Productividad | ✅ Alta | ✅ Alta | ⚠️ Media |
| Ecosistema | Nativo de AWS | Muy amplio | Limitado |
🧠 Buenas prácticas
-
Usa constructos L2/L3 por defecto
-
Evita lógica compleja en stacks (
for,ifexcesivos) -
Mantén constructos reusables en carpetas o librerías (
lib/,constructs/) -
Usa
cdk diffantes de cadadeploy -
Activa
terminationProtectionsi es producción -
Usa
context.jsonpara valores sensibles por entorno
🎓 Preguntas tipo certificación
-
¿Qué genera el comando
cdk synth?- ✅ Una plantilla de CloudFormation
-
¿Qué ventaja tiene CDK frente a CloudFormation?
- ✅ Usa lenguajes de programación y es más expresivo
-
¿Puedo definir múltiples stacks en una misma app?
- ✅ Sí, es común
-
¿Cuál es el nivel de constructo que encapsula varios recursos?
- ✅ L3