¿Te gustaría tener tu propia base de datos PostgreSQL en AWS sin gastar mucho (o casi nada)?
En este post te mostraré cómo crear un entorno completo con VPC, Bastion Host y Amazon RDS PostgreSQL, todo usando AWS CDK con Python — y aprovechando al máximo el Free Tier de AWS.
🎯 Objetivo
Desplegar un entorno seguro, reproducible y económico para tus pruebas, demos o proyectos personales, utilizando el poder de Infrastructure as Code (IaC) con AWS CDK.
🚀 ¿Por qué usar AWS CDK?
El AWS CDK (Cloud Development Kit) te permite definir infraestructura en código, combinando la potencia de CloudFormation con la comodidad de Python.
Con CDK puedes:
- Crear y eliminar entornos fácilmente.
- Versionar tu infraestructura en Git.
- Automatizar despliegues reproducibles.
Nuestro proyecto creará lo siguiente:
✅ Una VPC con subredes públicas y privadas en dos zonas de disponibilidad.
✅ Un Bastion Host (EC2 t3.nano
) para acceder de forma segura.
✅ Una instancia de PostgreSQL 17 en RDS (db.t3.micro
, 20 GB GP3, cifrado y backups diarios).
✅ Integración opcional con Secrets Manager para contraseñas seguras.
✅ Outputs de CloudFormation con los datos de conexión.
🧰 Pre-requisitos
Antes de empezar, asegúrate de tener:
- Python 3.9+
-
Node.js 16+ y el CLI de CDK (
npm install -g aws-cdk
) - Credenciales AWS con permisos para EC2, RDS, VPC, Secrets Manager y CloudFormation
- (Opcional) Conexión a internet para descargar el dataset de AdventureWorks
💡 Si
cdk init
no te creó el entorno virtual, puedes hacerlo manualmente:python3 -m venv .venv
📁 Estructura del proyecto
.
├── app.py # Punto de entrada de CDK
├── aws_cdk_rds/
│ └── aws_cdk_rds_stack.py # Definición del stack
├── database/
│ └── adventureworks.sql # Dataset opcional
├── script/
│ └── psql.sh # Script para cargar datos en PostgreSQL
└── README.md / README.es.md # Documentación
⚙️ Configuración del entorno
Activa el entorno virtual e instala las dependencias:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Parámetros personalizables
Puedes pasar configuraciones por variables de entorno o contexto de CDK:
Parámetro | Valor por defecto | Descripción |
---|---|---|
DB_NAME |
adventureworks |
Nombre de la base de datos inicial |
DB_USERNAME |
dbadmin |
Usuario maestro |
DB_PASSWORD |
(auto-generado) | Contraseña (se puede crear en Secrets Manager) |
BASTION_ALLOW_CIDR |
0.0.0.0/0 |
IPs que pueden acceder al Bastion (⚠️ Restringe esto) |
DB_ALLOWED_CIDR |
(ninguno) | IPs con acceso directo a PostgreSQL (opcional) |
Ejemplo con variables de entorno:
export DB_USERNAME=demo_admin
export BASTION_ALLOW_CIDR=203.0.113.5/32
cdk deploy
Ejemplo con flags de CDK:
cdk deploy -c db_username=demo_admin -c bastion_allow_cidr=203.0.113.5/32
🏗️ Desplegando el stack
Sigue el flujo estándar de CDK:
cdk bootstrap aws://<ACCOUNT_ID>/<REGION> # solo una vez
cdk synth
cdk deploy
Al finalizar, anota los outputs que verás en consola:
- DbEndpoint y DbPort → Datos de conexión.
- BastionId → ID de la instancia EC2.
- DbSecretArn → ARN del secreto en Secrets Manager (si se generó automáticamente).
🔐 Accediendo a la base de datos
-
Conéctate al Bastion Host
- SSH:
ssh -i <tu-clave.pem> ec2-user@<bastion-public-ip>
-
AWS SSM Session Manager:
aws ssm start-session --target <BastionId> --region <REGION>
-
Lanza
psql
export PGHOST=<DbEndpoint>
export PGPORT=<DbPort>
export PGUSER=<DB_USERNAME>
export PGPASSWORD='<PASSWORD>'
psql -h "$PGHOST" -U "$PGUSER" -d "$DB_NAME" -c 'SELECT version();'
Para obtener la contraseña desde Secrets Manager:
aws secretsmanager get-secret-value --secret-id <DbSecretArn> --query 'SecretString' --output text | jq -r '.password'
🧩 Cargando el dataset AdventureWorks
El repositorio incluye database/adventureworks.sql
.
Puedes cargarlo así:
psql -h "$PGHOST" -U "$PGUSER" -d "$DB_NAME" -f adventureworks.sql
Verifica las tablas:
psql -h "$PGHOST" -U "$PGUSER" -d "$DB_NAME" -c '\dn'
psql -h "$PGHOST" -U "$PGUSER" -d "$DB_NAME" -c '\dt humanresources.*'
También puedes usar el script script/psql.sh
para automatizar este paso.
🧹 Limpieza de recursos
Cuando termines, no olvides destruir el stack para evitar costos:
cdk destroy
Esto eliminará la instancia RDS, el bastion host, los secretos y toda la VPC creada.
🧠 Consejos útiles
- 🔒 ¿Timeout al conectar por SSH? Verifica que tu IP esté en
BASTION_ALLOW_CIDR
. - 🧱 ¿No conecta PostgreSQL? Asegúrate de que el Bastion puede acceder al puerto 5432.
- 🗝️ ¿Olvidaste la contraseña? Recupera el secreto desde AWS Secrets Manager.
🏁 Conclusión
Con menos de 250 líneas de Python, creamos una infraestructura completa, reutilizable y económica para PostgreSQL en AWS. Perfecta para laboratorios, talleres o pruebas de concepto.
Desde aquí, puedes ampliar el stack:
- Añadir instancias de aplicación o Lambdas dentro de la VPC.
- Activar métricas avanzadas o backups con mayor retención.
- Automatizar la carga de datos con CodeBuild o SSM Automation.
💬 Si te gustó este tutorial o extendiste el proyecto, ¡cuéntame en los comentarios!
Me encantaría conocer tu experiencia desplegando con AWS CDK y PostgreSQL.
Top comments (0)