- Notifications
You must be signed in to change notification settings - Fork0
curso-serverless-lambda-APIGateway/crud-mysql-rds
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
- Inicialización del proyecto
- Creacón de instancia MySQL con RDS en AWS
- Creación de la tabla
- Configurar security groups desde serverles.yml
- Archivo de configuración para crear la conexión a la base de datos
- Obtener todos los registros
- Obtener un registro
- Añadir un registro
- Actualizar un registro
- Eliminar un registro
Creamos el proyecto mediante el comando
sls create -t aws-nodejs -n curso-sls-crud-rds
Iniciamos node con
npm init -y
Instalamos las dependencias que vamos a utilizar:
npm install --save mysql querystring serverless-offline
Creamos la instancia a través de la consola AWS dentro del servicio RDS como MySQL.
- Establecemos el id de la instancia, usuario y contraseña.
- Elegimos free tier y mantenemos los parámetros por defecto.
- Establecemos que la base de datos sea pública dentro de los parámetros de configuración avanzados para poder trabajar con ella desde un cliente local. En este caso será necesario dar acceso a nuestra máquina mediante el security group por defecto que se ha establecido.
En la lambda, en la pestaña de permisos, creamos un nuevo rol y establecemos la vpc, al menos dos subnets y el security group. Necesitaremos los IDs en el siguiente punto para automatizar este paso en la creación de nuevas lambdas.
Desde un cliente MySQL creamos la tabla:
CREATEDATABASEIF NOT EXISTS curso_sls;CREATETABLEcurso_sls.todos ( idINTPRIMARY KEYNOT NULL AUTO_INCREMENT, todoVARCHAR(100)NOT NULL, created_atTIMESTAMPNULL);
Dentro del archivoserverless.yml en la sección deprovider añadimos los datos de la vpc:
provider:name:awsruntime:nodejs12.xvpc:securityGroupIds: -sg-0f1a58e62dd6456c0subnetIds: -subnet-05565f251be671231 -subnet-0cec29573390f4ed7
Creamos un nuevo archivoconnection.js.
- Definimos las constantes que almacenarán los parámetros para poder realizar la conexión a la base de datos:
constmysql=require('mysql')constconfigDB={host:'curso-sls-rds-mysql.cfuld5lbzlxg.us-east-1.rds.amazonaws.com',user:'curso_sls',password:'secret12',port:'3306',database:'curso_sls',debug:true}
- Definimos la función que realizará la conexión:
functioninitializeConnection(config){functionaddDisconnectHandler(connection){connection.on("error",function(error){if(errorinstanceofError){if(error.code==="PROTOCOL_CONNECTION_LOST"){console.error(error.stack);console.log("Lost connection. Reconnecting...");initializeConnection(connection.config);}elseif(error.fatal){throwerror;}}});}constconnection=mysql.createConnection(config);// Add handlers.addDisconnectHandler(connection);connection.connect();returnconnection;}
- Instanciamos la conexión y la exportamos:
constconnection=initializeConnection(configDB);module.exports=connection;
Para organizar mejor nuestro código, creamos una nueva carpetacrud y dentro de ella el archivotodos.js que incluirá todas las funciones referentes a la tablatodos.
- Establecemos las constantes necesarias para trabajar con la base de datos:
constconnection=require('../connection');constqueryString=require('querystring');
- Definimos la función que realizará la consulta y devolverá los datos:
module.exports.findAll=(event,context,callback)=>{context.callbackWaitsForEmptyEventLoop=false;constsql='SELECT * FROM todos';connection.query(sql,(error,rows)=>{if(error){callback({statusCode:500,body:JSON.stringify(error)})}else{callback(null,{statusCode:200,body:JSON.stringify({todos:rows})})}})};
- Definimos la función dentro del archivoserverless.yml
functions:findAll:handler:crud/todos.findAllevents: -http:path:todosmethod:get
- Creamos una nueva función entodos.js
module.exports.findOne=(event,context,callback)=>{context.callbackWaitsForEmptyEventLoop=false;constsql='SELECT * FROM todos WHERE id = ?';connection.query(sql,[event.pathParameters.todoId],(error,row)=>{if(error){callback({statusCode:500,body:JSON.stringify(error)})}else{callback(null,{statusCode:200,body:JSON.stringify({todo:row})})}})};
- Añadimos la nueva función al archivoserverless.yml
findOne:handler:crud/todos.findOneevents: -http:path:todos/{todoId}method:get
- Creamos la función para añadir un registro dentro del archivotodos.js
module.exports.create=(event,context,callback)=>{context.callbackWaitsForEmptyEventLoop=false;constbody=queryString.parse(event['body']);constdata={todo:body.todo}constsql='INSERT INTO todos SET ?';connection.query(sql,[data],(error,result)=>{if(error){callback({statusCode:500,body:JSON.stringify(error)})}else{callback(null,{statusCode:200,body:JSON.stringify({res:`Tarea insertada correctamente con id${result.insertId}`})})}})};
- Actualizamos el parámetrofunctions dentro del archivoserverless.yml para incluir la función que acabamos de definir:
create:handler:crud/todos.createevents: -http:path:todosmethod:post
- Añadimos la nueva función al archivotodos.js
module.exports.update=(event,context,callback)=>{context.callbackWaitsForEmptyEventLoop=false;constbody=queryString.parse(event['body']);constsql='UPDATE todos SET todo = ? WHERE id = ?';connection.query(sql,[body.todo,event.pathParameters.todoId],(error,result)=>{if(error){callback({statusCode:500,body:JSON.stringify(error)})}else{callback(null,{statusCode:200,body:JSON.stringify({res:`Tarea actualizada correctamente`})})}})};
- Actualizamosfunctionsserverless.yml para incluir la nueva función
update:handler:crud/todos.updateevents: -http:path:todos/{todoId}method:put
- Añadimos la nueva función al archivotodos.js
module.exports.delete=(event,context,callback)=>{context.callbackWaitsForEmptyEventLoop=false;constsql='DELETE FROM todos WHERE id = ?';connection.query(sql,[event.pathParameters.todoId],(error,result)=>{if(error){callback({statusCode:500,body:JSON.stringify(error)})}else{callback(null,{statusCode:200,body:JSON.stringify({res:`Tarea eliminada correctamente`})})}})};
- Actualizamosfunctions enserverless.yml para incluir la nueva función
delete:handler:crud/todos.deleteevents: -http:path:todos/{todoId}method:delete
About
Resources
Uh oh!
There was an error while loading.Please reload this page.