DEV Community

Cover image for Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python
Afu Tse (Chainiz)
Afu Tse (Chainiz)

Posted on

Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python

¿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

👉 Repositorio en GitHub

💡 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
Enter fullscreen mode Exit fullscreen mode

⚙️ 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Ejemplo con flags de CDK:

cdk deploy   -c db_username=demo_admin   -c bastion_allow_cidr=203.0.113.5/32
Enter fullscreen mode Exit fullscreen mode

🏗️ Desplegando el stack

Sigue el flujo estándar de CDK:

cdk bootstrap aws://<ACCOUNT_ID>/<REGION>  # solo una vez
cdk synth
cdk deploy
Enter fullscreen mode Exit fullscreen mode

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

  1. 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>
    
  1. 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();'
Enter fullscreen mode Exit fullscreen mode

Para obtener la contraseña desde Secrets Manager:

aws secretsmanager get-secret-value   --secret-id <DbSecretArn>   --query 'SecretString'   --output text | jq -r '.password'
Enter fullscreen mode Exit fullscreen mode

🧩 Cargando el dataset AdventureWorks

El repositorio incluye database/adventureworks.sql.

Puedes cargarlo así:

psql -h "$PGHOST" -U "$PGUSER" -d "$DB_NAME" -f adventureworks.sql
Enter fullscreen mode Exit fullscreen mode

Verifica las tablas:

psql -h "$PGHOST" -U "$PGUSER" -d "$DB_NAME" -c '\dn'
psql -h "$PGHOST" -U "$PGUSER" -d "$DB_NAME" -c '\dt humanresources.*'
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)