Crear una base PostgreSQL para una aplicación

AWSBeginner
Practicar Ahora

Introducción

Una aplicación de pedidos necesita una base relacional para guardar pedidos de clientes. En este laboratorio crearás una base PostgreSQL privada con Amazon RDS, te conectarás con un cliente SQL estándar y configurarás la aplicación para usar el nuevo endpoint.

Debes conocer las subredes VPC, los grupos de seguridad y las conexiones de aplicaciones de los cursos anteriores de VPC y EC2. El entorno incluye la red, la aplicación y AWS CLI configurada. No necesitas una cuenta personal de AWS. Al terminar eliminarás la base.

Relación con certificaciones

Este laboratorio ofrece práctica introductoria sobre los siguientes temas de examen.

Crear la base de la aplicación

En este paso crearás una instancia PostgreSQL privada en la red de bases de datos preparada.

Amazon RDS administra instancias de bases relacionales. PostgreSQL es el motor que almacena tablas y ejecuta SQL. AWS CLI administra el recurso RDS; un cliente SQL se conecta al motor para trabajar con los datos. Crear una instancia RDS y consultar una tabla son operaciones distintas.

AWS Management Console ayuda a explorar servicios e inspeccionar recursos. La CLI sirve para consultas precisas, operaciones repetibles y automatización, aunque su sintaxis requiere práctica. Este curso usa Terminal y AWS View preparados. AWS View muestra los recursos del laboratorio y los resultados de la aplicación; es independiente de AWS Management Console.

Entra al directorio de trabajo y carga los ajustes de conexión suministrados:

cd /home/labex/project
source database.env

DB_SECURITY_GROUP_ID identifica las reglas preparadas de acceso a la red de la base. PGSERVICEFILE y PGPASSFILE indican al cliente PostgreSQL dónde encontrar los archivos habituales de conexión y contraseña. Mantén privados los archivos de contraseñas; no hace falta mostrar su contenido.

Inspecciona el grupo de subredes DB preparado:

aws rds \
  describe-db-subnet-groups \
  --db-subnet-group-name orders-subnets \
  --query 'DBSubnetGroups[].{Name:DBSubnetGroupName,VPC:VpcId,Subnets:Subnets[].SubnetIdentifier}'

Un grupo de subredes DB identifica las subredes VPC disponibles para ubicar RDS. Este grupo contiene subredes privadas de bases de datos en dos zonas de disponibilidad. Tener dos subredes no activa por sí solo una implementación Multi-AZ.

Crea la instancia:

aws rds \
  create-db-instance \
  --db-instance-identifier orders-db \
  --db-instance-class db.t3.micro \
  --engine postgres \
  --engine-version 16.15 \
  --allocated-storage 20 \
  --master-username orders_admin \
  --master-user-password "$(cat db-password.txt)" \
  --db-name orders \
  --db-subnet-group-name orders-subnets \
  --vpc-security-group-ids "$DB_SECURITY_GROUP_ID" \
  --no-publicly-accessible \
  --backup-retention-period 0 \
  --query 'DBInstance.{Identifier:DBInstanceIdentifier,Status:DBInstanceStatus,Engine:Engine}'

El identificador de instancia orders-db nombra el recurso RDS; el nombre de base de datos orders nombra la base PostgreSQL que contiene. db.t3.micro elige la clase de instancia y 20 solicita almacenamiento en GiB. El acceso privado mantiene las conexiones de la aplicación dentro de la red preparada. La retención de copias automáticas está desactivada en este ejercicio breve; otro laboratorio enseñará un snapshot manual.

$(cat db-password.txt) proporciona la contraseña preparada sin imprimirla. No pegues contraseñas en notas ni capturas.

Espera a que esté disponible y consulta el endpoint de conexión:

aws rds \
  wait db-instance-available \
  --db-instance-identifier orders-db
aws rds \
  describe-db-instances \
  --db-instance-identifier orders-db \
  --query 'DBInstances[0].{Identifier:DBInstanceIdentifier,Database:DBName,Status:DBInstanceStatus,Endpoint:Endpoint}'

Espera la base orders, el estado available y el puerto PostgreSQL 5432. El endpoint es la dirección con la que los clientes seleccionan esta instancia. AWS View debe mostrar orders-db como base primaria. Todavía no existe una tabla de pedidos.

Conectar el cliente SQL y la aplicación

En este paso probarás el motor y dirigirás la aplicación a su endpoint.

psql es el cliente estándar de línea de comandos de PostgreSQL. El servicio preparado orders-db guarda los datos de conexión de la instancia recién creada. Un nombre de servicio es una entrada práctica de configuración del cliente, no un recurso AWS.

Una conexión PostgreSQL privada necesita un endpoint accesible y un puerto permitido

Diagrama conceptual: Una conexión PostgreSQL privada necesita un endpoint accesible y un puerto permitido.

Consulta el motor:

psql \
  "service=orders-db" \
  --command 'SELECT current_database(), current_user;'

Espera la base orders y el usuario orders_admin. Este resultado procede de una conexión a la base, no de metadatos del recurso RDS. RDS administra el host de la base; las aplicaciones se conectan con el protocolo de base de datos, no mediante SSH al host.

Obtén el endpoint de RDS. --query selecciona un campo, --output text devuelve un valor simple y $(...) del shell lo guarda en DB_ENDPOINT:

DB_ENDPOINT=$(aws rds \
  describe-db-instances \
  --db-instance-identifier orders-db \
  --query 'DBInstances[0].Endpoint.Address' \
  --output text)

Inspecciona la configuración de la aplicación:

cat app-config.json

read_host selecciona la base para consultas y write_host la selecciona para cambios. Por ahora ambos deben usar el primario. password_file remite a un archivo privado en lugar de incluir la contraseña en este documento JSON.

Usa jq, una herramienta de edición JSON, para establecer ambos campos de host. Escribe un archivo nuevo y reemplaza la configuración cuando la edición termine correctamente:

jq \
  --arg host "$DB_ENDPOINT" \
  '.read_host = $host | .write_host = $host' \
  app-config.json > app-config.new
mv app-config.new app-config.json

Prueba la conexión de la aplicación:

curl \
  --silent \
  --show-error \
  --fail \
  http://127.0.0.1:8080/application/connection

Espera database igual a orders, user igual a orders_admin y read_only igual a false. El primario permite escrituras, pero este laboratorio solo establece la conexión. La lista de pedidos de AWS View seguirá sin estar disponible hasta crear una tabla; la construirás en el siguiente laboratorio. Conexión PostgreSQL primaria en AWS View

El ejemplo muestra la aplicación conectada a la base primaria orders y el endpoint nativo de RDS. La tabla de pedidos aún no existe. Tus identificadores de recursos pueden ser diferentes.

AWS Console: RDS

Ejemplo de la consola oficial: Endpoint y Port en Connectivity & security corresponden a Endpoint.Address y Endpoint.Port de la CLI. El ejemplo oficial usa MySQL y 3306; este laboratorio usa PostgreSQL y 5432 con el endpoint de tu comando. No copies el hostname ni el puerto del ejemplo. Continúa en Terminal y AWS View sin iniciar sesión en AWS.

Source: AWS RDS guide.

Eliminar la instancia de base de datos

En este paso eliminarás la base temporal conservando la aplicación y la red preparadas.

Elimina tu instancia sin conservar un snapshot final:

aws rds \
  delete-db-instance \
  --db-instance-identifier orders-db \
  --skip-final-snapshot \
  --query 'DBInstance.DBInstanceIdentifier'

--skip-final-snapshot descarta la base del ejercicio sin guardar una copia de recuperación. Para datos importantes, decide cómo preservar una copia antes de eliminar la instancia.

Espera la eliminación e inspecciona el inventario:

aws rds \
  wait db-instance-deleted \
  --db-instance-identifier orders-db
aws rds \
  describe-db-instances \
  --query 'DBInstances[].DBInstanceIdentifier'

Espera []. AWS View no debe mostrar ninguna base. El antiguo endpoint de la aplicación ya no tiene una base detrás, por lo que un fallo de conexión tras eliminarla es normal. Conserva el grupo de subredes, los grupos de seguridad y los archivos suministrados.

Resumen

Creaste una instancia RDS PostgreSQL privada, distinguiste su identificador del nombre de base y consultaste el endpoint. Usaste psql para consultar el motor y conectaste una aplicación al mismo primario. Por último eliminaste la instancia conservando la red preparada.

El siguiente laboratorio crea una tabla de pedidos y utiliza SQL para guardar y consultar pedidos de clientes.