- Notifications
You must be signed in to change notification settings - Fork0
curso-serverless-lambda-APIGateway/crud-dynamo-express
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
- Instalación de express y serverless-http
- Creación básica de una ruta
- Configuración para utilizar DynamoDB
- Instalación y configuración de dynamoDB y body-parser
- Añadir un registro a DynamoDb
- Recuperar todos los registros
- Recuperar un registro por userId
- Trabajar con DynamoDB en local
Utilizaremos express y serverless-http para gestionar las llamadas http a nuestra lambda
npm install --save express serverless-http
'use strict';constserverless=require('serverless-http');constexpress=require('express');constapp=express();app.get('/',(req,res)=>{res.send('Hola Mundo con ExpressJS');});module.exports.generic=serverless(app)
Para garantizar el acceso de la lambda a DynamoDB debemos configurar el archivoserverless.yml
- Definimos el nombre de la tabla que vamos a utilizar
custom:tableName:'users-table-${self:provider.stage}'
- Habilitamos permisos para que la lambda pueda interactuar con DynamoDB
provider:name:awsruntime:nodejs12.xstage:deviamRoleStatements: -Effect:AllowAction: -dynamodb:Query -dynamodb:Scan -dynamodb:GetItem -dynamodb:PutItem -dynamodb:UpdateItem -dynamodb:DeleteItemResource: -{ "Fn::GetAtt": ["UsersDynamoDBTable", "Arn"] }environment:USERS_TABLE:${self:custom.tableName}
- Definimos la tabla
resources:Resources:UsersDynamoDBTable:Type:'AWS::DynamoDB::Table'Properties:AttributeDefinitions: -AttributeName:userIdAttributeType:SKeySchema: -AttributeName:userIdKeyType:HASHProvisionedThroughput:ReadCapacityUnits:1WriteCapacityUnits:1TableName:${self:custom.tableName}
Instalamos el sdk de AWS y body-parser mediante npm
npm install --save aws-sdk body-parser
En el archivohandler.js establecemos las constantes para poder utilizar estas librerías
constAWS=require('aws-sdk');constbodyParser=require('body-parser');constdynamoDB=newAWS.DynamoDB.DocumentClient()app.use(bodyParser.urlencoded({extended:true}));
En el archivohandler.js obtenemos el nombre de la tabla de la variable de entorno:
constUSERS_TABLE=process.env.USERS_TABLE;
modificamos el post para insertar el nuevo registro en la tabla
app.post('/users',(req,res)=>{const{userId, name}=req.body;constparams={TableName:USERS_TABLE,Item:{ userId, name}};dynamoDB.put(params,(error)=>{if(error){console.log(error);res.status(400).json({error:'No se ha podido crear el usuario'});}else{res.json({ userId, name})}})});
Para obtener todos los registros de dynamo, creamos una nueva ruta:
app.get('/users',(req,res)=>{constparams={TableName:USERS_TABLE,};dynamoDB.scan(params,(error,result)=>{if(error){console.log(error);req.status(400).json({error:'No se ha podido acceder a los usuarios'});}else{const{Items}=resultres.json({succes:true,message:'Usuarios cargados correctamente',users:Items});};});});
Para obtener un registro en concreto, creamos la nueva ruta:
app.get('/users/:userId',(req,res)=>{constparams={TableName:USERS_TABLE,Key:{userId:req.params.userId}};dynamoDB.get(params,(error,result)=>{if(error){console.log(error);res.status(400).json({error:'No se ha podido acceder al usuario'});}if(result.Item){const{userId, name}=result.Item;res.json({userId, name});}else{res.status(404).json({error:'Usuario no encontrado'});};})});
Para poder trabajar en local debemos instalar serverless-offline y serverles-dynamodb-local
npm install --save-dev serverless-offline serverless-dynamodb-local
Dentro del archivoserverless.yml debemos modificar la seccioncustom y añadir la secciónplugins:
plugins: -serverless-offline -serverless-dynamodb-localcustom:tableName:'users-table-${self:provider.stage}'dynamodb:start:migrate:truestages: -${self:provider.stage}
También modificaremos el archivohandler.js para que en el caso en el que trabajemos en modo local la relación a la base de datos sea correcta.
constUSERS_TABLE=process.env.USERS_TABLE;constIS_OFFLINE=process.env.IS_OFFLINE;if(IS_OFFLINE==='true'){dynamoDB=newAWS.DynamoDB.DocumentClient({region:'localhost',endpoint:'http://localhost:8000'});}else{dynamoDB=newAWS.DynamoDB.DocumentClient();}
About
Resources
Uh oh!
There was an error while loading.Please reload this page.