Skip to content

Crear una API en Node.js con el framework Serverless para un despliegue en AWS.

Notifications You must be signed in to change notification settings

rojasuap/StarWars_API_reto

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

demo-nodejs-invoke-api-serverless

Proyecto que ejecuta un servicio de invocación REST a la API de prueba SWAPI

Stack Tecnológico

Prerrequisitos

Instalar las siguientes herramientas y frameworks:

  • Node.js 8.10 o superior
  • Editor de código
  • Postman

Recomendación de elementos extra a instalar :

Instalación

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

  1. Creación de un directorio para el proyecto : demo-nodejs-invoke-api-serverless
  2. Ubicarse dentro de este directorio
  3. Ejecutar el comando de creación de un arquetipo básico
npm init -y
  1. 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"
}
  1. Crear directorios tipo (opcional)
  • "src" : para incluir el código fuente

Preparación del proyecto

Definición de tareas iniciales del proyecto

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

Instalación de dependencias iniciales

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

Instalar y Configurar Serverless Framework

Seguir el documento workspace-serverless-framework-lab/doc/README-instalacion-configuracion-serverless.md

Configurar fichero "serverless.yml"

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

Instalar y Configurar Serverless Offline

Seguir el documento workspace-serverless-framework-lab/doc/README-instalacion-configuracion-serverless-offline.md

Creación del proyecto

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  

Ejecutar el proyecto

En caso de que no se haya hecho todavía ejecutar las dependencias : npm run clean

Arrancar el proyecto

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

About

Crear una API en Node.js con el framework Serverless para un despliegue en AWS.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published