Proyecto que ejecuta un servicio de invocación REST a la API de prueba SWAPI
- Node.js (https://nodejs.org)
- Serverless Framework (https://serverless.com/)
Instalar las siguientes herramientas y frameworks:
- Node.js 8.10 o superior
- Editor de código
- Postman
Recomendación de elementos extra a instalar :
- Visual Studio Code: https://code.visualstudio.com/
- nvm: https://github.com/creationix/nvm
- npm: https://www.npmjs.com/ (ver. 6.5.0)
Generales Nodejs
IMPORTANTE:
- Serverless se ejecuta en Node v4 o superior
- Nodejs 8.10 es el límite actual de AWS Lambda
- Instalar y Configurar Node.js (Documento git:vjmadrid/enmilocalfunciona-aprendiendo-serverless/doc/README-instalacion-configuracion-node.md)
- Instalar y Configurar NVM (Documento git:vjmadrid/enmilocalfunciona-aprendiendo-serverless/doc/README-instalacion-configuracion-nvm.md)
Generales
- Instalar y Configurar Serverless Framework (Documento git:vjmadrid/enmilocalfunciona-aprendiendo-serverless/doc/README-instalacion-configuracion-serverless.md)
- Instalar y Configurar Serverless-Offline (Documento git:vjmadrid/enmilocalfunciona-aprendiendo-serverless/doc/README-instalacion-configuracion-serverless-offline.md)
Específicos
- Preparar y Configurar un proyecto genérica (Documento git:vjmadrid/enmilocalfunciona-aprendiendo-serverless/doc/README-preparar-configurar-proyecto.md)
Este proyecto sigue los pasos básicos de construcción
- Creación de un directorio para el proyecto : demo-nodejs-invoke-api-serverless
- Ubicarse dentro de este directorio
- Ejecutar el comando de creación de un arquetipo básico
npm init -y
- Verificar la existencia del fichero package.json
NOTA : No aplicar más pasos del documento
{
"name": "demo-nodejs-invoke-api-serverless",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
- Crear directorios tipo (opcional)
- "src" : para incluir el código fuente
Añadir al fichero 'package.json':
"scripts": {
"clean": "rm -rf package-lock.json .serverless/ && npm install",
"node:version": "echo 'nodejs version: ' && node -v "
},
Tareas :
clean : Clean y install del proyecto:
$ npm run clean
Verificar que se genera el fichero "package-lock.json" y el directorio "node_modules"
node:version : Validación de versión de node con la que trabajar
$ npm run node:version
Instalar las siguientes dependencias :
-
request : Cliente de peticiones HTTP
-
boom : Gestiona de forma amigable los errores HTTP
-
cross-env : Facilita trabajar con variables de entorno en diferentes plataformas
Añadir al fichero 'package.json':
"dependencies": {
"request": "^2.88.0",
"boom": "^7.3.0"
},
"devDependencies": {
"cross-env": "5.2.0"
}
Añadir la tarea 'package.json':
"scripts": {
...
"profile:local": "cross-env-shell NODE_ENV=local",
...
},
profile:local : Permite crear/sobreescribir una variable de entorno con el valor indicado
En este caso facilitaría ciertas configuración para el entorno "local"
$ npm run profile:local
Por último ejecutar la carga de las dependencias añadidas
$ npm run clean
Seguir el documento workspace-serverless-framework-lab/doc/README-instalacion-configuracion-serverless.md
El cliente Serverless funciona a partir de la existencia de un fichero serverless.yml que contien la configuración de las operativas que utilizará.
Se ubica en el directorio raiz del proyecto y tiene un formato como el siguiente :
serverless.yml
service:
name: demo-nodejs-invoke-api-serverless
custom:
serverless-offline:
port: 3000
provider:
name: aws
runtime: nodejs8.10
functions:
createMessage:
handler: src/message.handler.createMessage
events:
- http:
path: message
method: get
plugins:
- serverless-offline
Seguir el documento workspace-serverless-framework-lab/doc/README-instalacion-configuracion-serverless-offline.md
Se tiene que crear una clase manejadora (por ejemplo : mensaje.handler.js) y una función de invocación que contenga la estructura de parametros : event, context, callback
Por ejemplo :
'use strict';
//Imports
const Boom = require('boom');
const MessageService = require('./message/message.service').MessageService;
//Attributes
let messageService = new MessageService();
//Handler Function
module.exports.createMessage = (event, context, callback) => {
messageService.generate(event.body)
.then((message)=> {
const response = {
statusCode: 200,
body: JSON.stringify(message),
};
callback(null, response);
})
.catch((err) => {
console.log('info', 'ERROR' );
throw Boom.badRequest(err);
});
};
Posteriormente mapear su invocación en el fichero : serverless.yml
service:
name: demo-nodejs-invoke-api-serverless
...
functions:
createMessage:
handler: src/message.handler.createMessage
events:
- http:
path: message
method: get
En caso de que no se haya hecho todavía ejecutar las dependencias : npm run clean
Ejecutar la tarea "start"
$ npm run start
Se debería e ver algo como esto
cross-env-shell NODE_ENV=local "sls offline start"
Serverless: Starting Offline: undefined/undefined.
Serverless: Routes for createMessage:
Serverless: GET /message
Serverless: Offline listening on http://localhost:3000