Uso de AWS RDS con Node.js y Express.js

El RDS de Amazon proporciona una manera fácil de configurar una base de datos con una amplia gama de tecnologías de bases de datos relacionales. En este artículo, utilizaremos AWS RDS con Node.js.

Introducción

No es una exageración decir que la información y los datos manejan el mundo. Casi cualquier aplicación, desde las redes sociales y los sitios web de comercio electrónico hasta las sencillas aplicaciones de seguimiento de tiempo y dibujo, se basa en la tarea muy básica y fundamental de almacenar y recuperar datos para funcionar como se espera.

El Servicio de base de datos relacional (RDS) de Amazon proporciona una manera fácil de configurar una base de datos en la nube utilizando cualquiera de una amplia gama de tecnologías de bases de datos. En este artículo, configuraremos una base de datos en RDS y almacenaremos datos en ella con una aplicación Node.

Requisitos previos

Servicios web de Amazon

Servicios web de Amazon (AWS) proporciona una colección de herramientas para construir aplicaciones en la nube. Como RDS es un servicio de AWS, necesitaremos configurar una cuenta de AWS.

AWS tiene un nivel gratuito para muchas cosas increíbles, y RDS no es una excepción: puede usar 750 horas (31 días) al mes de uso de la base de datos db.t2.micro de forma gratuita durante 12 meses.

Cartero

Cartero es una herramienta útil para crear y enviar solicitudes. Usaremos esto en la mitad de Nodo del artículo para probar el código que hemos escrito.

Postman es opcional y, en realidad, puede usar cualquier herramienta para probar el punto final, incluso su navegador de Internet.

Configuración de una instancia de RDS

Primero, vamos a crear nuestro clúster de instancias RDS. Dirígete a AWS e iniciar sesión.

Una vez que haya iniciado sesión, haga clic en 'Servicios' en la parte superior izquierda y luego busque 'RDS'. Se le presentará una página que se parece a esto:

setting_up_rds_instance

En el menú de la izquierda, seleccione 'Bases de datos'. Esto normalmente mostraría una lista de clústeres de instancias de RDS que hemos creado, pero aún no tenemos ninguno.

Para crear uno, haga clic en el botón naranja 'Crear base de datos'. Se le debe presentar una página que se parece a:

create_rds_database

AWS ha introducido recientemente un método 'Easy create' para crear nuevas instancias de RDS, así que usemos eso.

En 'Tipo de motor' usaremos 'Amazon Aurora', que es el motor de base de datos propio de Amazon optimizado para RDS. Para la edición, dejaremos este conjunto en 'Amazon Aurora con compatibilidad con MySQL 5.6'.

En 'Tamaño de instancia de base de datos', seleccione la opción 'Dev/Test': este es un tipo de instancia menos potente (y más económico), pero sigue siendo más que suficiente para lo que lo necesitamos.

El 'Identificador de clúster de base de datos' es el nombre del clúster de base de datos que estamos creando. Llamemos a la nuestra my-node-database por ahora.

Para el nombre de usuario maestro, déjelo como admin. Finalmente, tenemos la opción de tener una contraseña maestra generada automáticamente. Para facilitar este tutorial, configuremos el nuestro.

¡Asegúrese de que sea seguro ya que este es el nombre de usuario y la contraseña maestros!

Finalmente, desplácese hacia abajo y haga clic en 'Crear base de datos'. Se tarda unos minutos en aprovisionar completamente una instancia de RDS:

create_rds_database

Antes de comenzar con nuestra aplicación Node, debemos asegurarnos de que podamos conectarnos a la instancia. Seleccione la instancia que acaba de crear (será la opción que termina en instance-1) y tome nota del valor en 'Endpoint'.

En el lado derecho, debajo de 'Grupos de seguridad de VPC', haga clic en el enlace; esto lo llevará al grupo de seguridad que se configuró para la base de datos. Los grupos de seguridad son esencialmente reglas de firewall en cuanto a quién tiene y quién no puede hacer conexiones a un recurso.

Actualmente, este está configurado para permitir solo conexiones de recursos que tienen el mismo grupo de seguridad.

Seleccionando el menú desplegable 'Acciones' en la parte superior, navegue hasta 'Editar reglas de entrada'. En este cuadro de diálogo, haga clic en 'Agregar regla'. Para la nueva regla, en 'Tipo', seleccione 'Todo el tráfico'. En 'Fuente', seleccione 'En cualquier lugar'.

Deberías terminar con algo que se vea así:

edit_inbound_rules

Regrese a RDS y 'Modifique' la instancia. Aquí, en la sección 'Red y seguridad', bajo 'Accesibilidad pública', queremos seleccionar 'Sí' - esto nos permite conectarnos a la base de datos desde nuestras máquinas - de lo contrario necesitaríamos poner nuestra aplicación en una instancia EC2, que no es el enfoque de este artículo.

¡Su instancia de RDS ahora debería estar lista para funcionar! Escribamos un código para interactuar con él.

Aplicación de nodo

Para interactuar con nuestra aplicación, vamos a crear una API muy simple que nos permita almacenar perfiles de usuario a través de Express.js. Antes de hacer eso, necesitamos crear una tabla dentro de nuestra instancia de RDS para almacenar datos.

Vamos a crear una carpeta, pasar a ella e inicializar una aplicación Node.js en blanco con la configuración predeterminada:

1
2
3
$ mkdir node-rds
$ cd node-rds
$ npm init -y

Luego, instalemos las dependencias requeridas:

1
2
$ npm install express --save
$ npm install mysql --save

Y finalmente, queremos crear dos archivos JavaScript: uno de ellos será nuestra aplicación Express, el otro será un script de un solo uso para crear una tabla en nuestra base de datos:

1
2
$ touch index.js
$ touch dbseed.js

Script de creación de tablas

Comencemos con el archivo dbseed.js:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
const mysql = require('mysql');

const con = mysql.createConnection({
    host: "<DB_ENDPOINT>",
    user: "admin",
    password: "<DB_PASSWORD>"
});

con.connect(function(err) {
    if (err) throw err;
    console.log("Connected!");
    con.end();
});

Asegúrese de cambiar <DB_ENDPOINT> por el punto final que anotamos anteriormente y complete la contraseña. Lo que hará este fragmento de código es intentar conectarse a la base de datos; si tiene éxito, ejecutará una función anónima que registra '¡Conectado!', y luego cerrará la conexión de inmediato.

Podemos verificar rápidamente si está configurado correctamente ejecutando:

1
$ node dbseed.js

La aplicación debería devolver '¡Conectado!'. Si no es así, es probable que haya un problema con la configuración de seguridad. Vuelva a la configuración de RDS y asegúrese de haber hecho todo correctamente.

Ahora que sabemos que definitivamente podemos conectarnos a nuestra base de datos, necesitamos crear una tabla. Modifiquemos nuestra función anónima:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
con.connect(function(err) {
    if (err) throw err;

    con.query('CREATE DATABASE IF NOT EXISTS main;');
    con.query('USE main;');
    con.query('CREATE TABLE IF NOT EXISTS users(id int NOT NULL AUTO_INCREMENT, username varchar(30), email varchar(255), age int, PRIMARY KEY(id));', function(error, result, fields) {
        console.log(result);
    });
    con.end();
});

El resultado esperado debería ser algo como:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
OkPacket {
  fieldCount: 0,
  affectedRows: 0,
  insertId: 0,
  serverStatus: 2,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

Ahora que tenemos una tabla con la que trabajar, configuremos la aplicación Express para insertar y recuperar datos de nuestra base de datos.

Insertar punto final de usuario

Escribamos una solicitud POST para la creación de usuarios en nuestro archivo index.js:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
app.post('/users', (req, res) => {
    if (req.query.username && req.query.email && req.query.age) {
        console.log('Request received');
        con.connect(function(err) {
            con.query(`INSERT INTO main.users (username, email, age) VALUES ('${req.query.username}', '${req.query.email}', '${req.query.age}')`, function(err, result, fields) {
                if (err) res.send(err);
                if (result) res.send({username: req.query.username, email: req.query.email, age: req.query.age});
                if (fields) console.log(fields);
            });
        });
    } else {
        console.log('Missing a parameter');
    }
});

Lo que hace este código es bastante sencillo: empaqueta la información de la solicitud POST y la inserta en una consulta. Esta consulta creará un usuario en la base de datos de RDS y registrará los resultados.

Vamos a comprobar si funciona:

1
$ node index.js

En Postman queremos crear una solicitud POST a nuestro servidor. Ingresemos los parámetros requeridos y enviemos la solicitud:

postman_request_to_rds

Deberíamos recuperar los mismos datos, lo que significa que está funcionando correctamente y nuestro punto final ha insertado un usuario.

Obtener el punto final de los usuarios

Diseñemos un punto final GET simple para una forma más fácil de usar para verificar los resultados. Debajo del controlador de solicitudes POST, hagamos otro controlador:

1
2
3
4
5
6
7
8
app.get('/users', (req, res) => {
    con.connect(function(err) {
        con.query(`SELECT * FROM main.users`, function(err, result, fields) {
            if (err) res.send(err);
            if (result) res.send(result);
        });
    });
});

En su navegador, navegue hasta localhost:3000/users y se le deberían presentar todos los usuarios insertados.

¿Qué sigue? {#qué sigue}

Proteja su base de datos

Anteriormente, hicimos que nuestra instancia de RDS fuera de acceso público y con un grupo de seguridad completamente abierto. Podría configurar en EC2 y comenzar a reforzar la seguridad en su instancia eliminando el acceso público y bloqueando su seguridad grupo.

También debe echar un vistazo a la base de código: es funcional, pero puede ser vulnerable a ataques como la inyección de SQL. Vale la pena dedicar tiempo para asegurarse de que los usuarios no puedan realizar acciones en su base de datos. que no pretendes.

Experimento con lectura/escritura

Si profundiza un poco más en RDS, puede configurar instancias específicamente para leer o escribir; esto puede ayudar a proteger su instancia, pero también si está tratando con muchas operaciones de base de datos, esto puede ayudar a optimizar el rendimiento de sus bases de datos. .

Pruebe diferentes configuraciones {#pruebediferentes configuraciones}

Usamos AWS' 'Easy create' para crear nuestra base de datos; vale la pena regresar y probar las diversas configuraciones con las que puede configurar RDS para satisfacer sus necesidades particulares.

¡Termine su instancia de RDS!

Si no planea continuar usando su instancia de RDS, ¡asegúrese de terminarla! De lo contrario, acumulará una factura considerable en un mes.

Conclusión

Ha creado una instancia de RDS y la ha rellenado con datos a través de un extremo de Node/Express. Este es un gran trampolín para saltar a aplicaciones web más complejas que almacenan y sirven datos para sus usuarios, y con los datos creciendo meteóricamente como un bien valioso, este es un buen momento para pensar con qué tipo de datos desea operar. .

Para finalizar, recuerde que cualquier dato que almacene es su deber de protegerlo. ¡Asegúrese siempre de comprender cómo crear una aplicación segura antes de comenzar a poner los datos personales de las personas en ella!