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
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 (![]() |
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.
This content originally appeared on DEV Community and was authored by Afu Tse (Chainiz)