byandrev's blog

8 min readRead in English

Cómo crear una base de datos PostgreSQL en AWS RDS

Crear la instancia

Consola

Entra al servicio Aurora and RDS y haz clic en Create database.

El dashboard de Aurora and RDS
El dashboard de Aurora and RDS

Dos cosas que decidir primero:

  • Creation method. Yo uso Create with full configuration. La opción rápida esconde ajustes que vas a necesitar más adelante de todos modos.
  • Engine. Elegí PostgreSQL. El resto del post asume Postgres y el puerto 5432. Para MySQL el flujo es el mismo, el puerto es 3306.

Eligiendo PostgreSQL como motor
Eligiendo PostgreSQL como motor

Después AWS te pide Express configuration o Full configuration. Express elige por ti el tamaño de la instancia y la red. Full te deja elegir a ti. Para aprender, Express está bien. Para algo que vas a conservar, usa Full y así sabes por qué estás pagando.

Elige el DB instance size. Esta es la parte que cuesta dinero, así que revisa las opciones del free tier antes de hacer clic.

RDS cobra por hora mientras la instancia exista, la consultes o no. Si estás siguiendo este post para aprender, decide ahora que la vas a borrar cuando termines.

Seleccionando el tamaño de la instancia
Seleccionando el tamaño de la instancia

Define el usuario y la contraseña maestros. Anótalos ahora. Cambiarlos después se puede, pero es molesto.

Configuración de usuario y contraseña maestros
Configuración de usuario y contraseña maestros

CLI

Lo mismo en un solo comando:

bash
aws rds create-db-instance \
  --db-instance-identifier my-postgres-db \
  --engine postgres \
  --db-instance-class db.t4g.micro \
  --allocated-storage 20 \
  --master-username postgres \
  --master-user-password 'CHANGE_ME' \
  --publicly-accessible

Aquí la contraseña se va directo al historial de tu shell. Léela desde una variable de entorno o un gestor de secretos si te importa, y debería importarte.

Las clases de instancia no están disponibles en todas las regiones ni para todas las versiones del motor, así que db.t4g.micro te puede fallar. Revisa cuál es la clase elegible para el free tier antes de ejecutar esto.

La creación tarda unos minutos. Bloquea hasta que esté lista:

bash
aws rds wait db-instance-available --db-instance-identifier my-postgres-db

Hacerla accesible desde fuera de la VPC

Por defecto la base de datos solo acepta conexiones desde dentro de su VPC. Tu laptop no está dentro de la VPC.

Consola

Modifica la instancia, ve a Connectivity y pon Public access en Publicly accessible. RDS le asigna entonces una IP pública a la base de datos. Los recursos de fuera de la VPC pueden conectarse, y los de dentro siguen pudiendo.

Activando el acceso público en la instancia
Activando el acceso público en la instancia

CLI

bash
aws rds modify-db-instance \
  --db-instance-identifier my-postgres-db \
  --publicly-accessible \
  --apply-immediately

Sin --apply-immediately el cambio espera a la siguiente ventana de mantenimiento.

De cualquier forma, esto solo no basta. El acceso público abre la puerta, el security group decide quién pasa.

Abrir el puerto en el security group

Si la conexión se queda colgada después de activar el acceso público, el puerto está cerrado.

Consola

Ve a Security group rules en la página de la base de datos y haz clic en una de las reglas de entrada. Eso te lleva a Security Groups. Selecciona el grupo asociado a tu base de datos, luego Edit inbound rules y añade:

  • Type: PostgreSQL
  • Port: 5432
  • Source: tu IP

Las reglas del security group asociado a la base de datos
Las reglas del security group asociado a la base de datos

Añadiendo una regla de entrada para el puerto 5432
Añadiendo una regla de entrada para el puerto 5432

CLI

Primero busca el security group asociado a la base de datos:

bash
aws rds describe-db-instances \
  --db-instance-identifier my-postgres-db \
  --query 'DBInstances[0].VpcSecurityGroups[0].VpcSecurityGroupId' \
  --output text

Después añade la regla con tu propia IP:

bash
aws ec2 authorize-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --protocol tcp \
  --port 5432 \
  --cidr 203.0.113.42/32

Usa tu propia IP con /32, no 0.0.0.0/0. 0.0.0.0/0 significa que todo internet puede llegar a tu base de datos, y los bots escanean puertos de bases de datos abiertos todo el tiempo. Tu contraseña sería lo único que queda ahí en medio.

Si tu IP de casa cambia, vas a tener que actualizar la regla otra vez. Esa molestia es el precio de que no te escaneen.

Conectarte desde tu máquina

Consola

En la página de la base de datos, abre Connect using y elige Endpoints. Copia el endpoint y el puerto.

El endpoint y el puerto de la base de datos
El endpoint y el puerto de la base de datos

CLI

bash
aws rds describe-db-instances \
  --db-instance-identifier my-postgres-db \
  --query 'DBInstances[0].Endpoint.[Address,Port]' \
  --output text

Ahora conecta

bash
psql -h <tu-endpoint>.rds.amazonaws.com -p 5432 -U postgres -d postgres

-U es el usuario maestro que definiste, -d es el nombre de la base de datos. Si no creaste ninguna, Postgres te deja en la base postgres por defecto.

Conectado a la base de datos con psql
Conectado a la base de datos con psql

Si se queda colgado sin error, es el security group, no las credenciales. Las credenciales malas fallan rápido, los puertos bloqueados dan timeout.

Bórrala cuando termines

Detener la instancia no basta. Una instancia de RDS detenida sigue cobrando por almacenamiento y backups.

Si la base de datos era solo para aprender, bórrala:

bash
aws rds delete-db-instance \
  --db-instance-identifier my-postgres-db \
  --skip-final-snapshot \
  --delete-automated-backups

--skip-final-snapshot significa que tus datos desaparecen sin copia. Eso es lo que quieres para una base de prueba y lo último que quieres para cualquier otra cosa.

En la consola: selecciona la instancia, Actions, Delete, desmarca la opción del snapshot final y escribe la frase de confirmación.

Dos cosas más que siguen cobrando cuando la instancia ya no está: los snapshots manuales que hiciste y cualquier snapshot final que decidieras conservar. Revisa también la sección Snapshots.

La parte que yo no publicaría

Acceso público más una contraseña no es un setup de producción. Para algo real, la base de datos se queda privada y llegas a ella desde dentro de la VPC: una instancia EC2, un bastion host o una VPN. Yo usé acceso público porque necesitaba consultar la base desde mi propia máquina mientras construía, y pienso apagarlo.

Frequently asked questions

¿Puedo conectarme a RDS sin hacerlo público?

Sí, y es la mejor opción. Coloca una instancia de EC2 en la misma VPC y abre un túnel SSH a través de ella, o usa AWS Systems Manager Session Manager para no exponer tampoco un puerto SSH. De esta manera, tu computadora se comunica con la base de datos a través de ese túnel y la base de datos permanece privada.

¿Necesito reiniciar la instancia después de cambiar el acceso público?

No. El cambio se aplica sin necesidad de reiniciar, pero no es instantáneo.

¿Debería usar RDS o Aurora?

RDS ejecuta PostgreSQL o MySQL estándar. Aurora es el motor de almacenamiento propio de AWS con el mismo protocolo de transmisión, mejor para escalar lecturas y más costoso en tamaños pequeños. Para un proyecto personal o una primera base de datos, RDS básico es la respuesta.

Comments