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áxim…


This content originally appeared on DEV Community and was authored by Afu Tse (Chainiz)

¿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

⚙️ 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

  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();'

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.


This content originally appeared on DEV Community and was authored by Afu Tse (Chainiz)


Print Share Comment Cite Upload Translate Updates
APA

Afu Tse (Chainiz) | Sciencx (2025-10-13T02:16:46+00:00) Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python. Retrieved from https://www.scien.cx/2025/10/13/hands-on-despliega-una-base-de-datos-postgresql-bastion-vpc-con-aws-cdk-y-python/

MLA
" » Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python." Afu Tse (Chainiz) | Sciencx - Monday October 13, 2025, https://www.scien.cx/2025/10/13/hands-on-despliega-una-base-de-datos-postgresql-bastion-vpc-con-aws-cdk-y-python/
HARVARD
Afu Tse (Chainiz) | Sciencx Monday October 13, 2025 » Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python., viewed ,<https://www.scien.cx/2025/10/13/hands-on-despliega-una-base-de-datos-postgresql-bastion-vpc-con-aws-cdk-y-python/>
VANCOUVER
Afu Tse (Chainiz) | Sciencx - » Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2025/10/13/hands-on-despliega-una-base-de-datos-postgresql-bastion-vpc-con-aws-cdk-y-python/
CHICAGO
" » Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python." Afu Tse (Chainiz) | Sciencx - Accessed . https://www.scien.cx/2025/10/13/hands-on-despliega-una-base-de-datos-postgresql-bastion-vpc-con-aws-cdk-y-python/
IEEE
" » Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python." Afu Tse (Chainiz) | Sciencx [Online]. Available: https://www.scien.cx/2025/10/13/hands-on-despliega-una-base-de-datos-postgresql-bastion-vpc-con-aws-cdk-y-python/. [Accessed: ]
rf:citation
» Hands-On: Despliega una base de datos PostgreSQL + Bastion + VPC con AWS CDK y Python | Afu Tse (Chainiz) | Sciencx | https://www.scien.cx/2025/10/13/hands-on-despliega-una-base-de-datos-postgresql-bastion-vpc-con-aws-cdk-y-python/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.