Vamos a estar usando AWS Lambda y Amazon API Gateway para crear nuestro backend. AWS Lambda es un servicio computable que permite ejecutar tu código sin proveer o administrar servidores. Tú sólo pagas por el tiempo computable que consumes - no hay cargo alguno cuando tu código no se está ejecutando. Y el servicio API Gateway facilita a los desarrolladores crear, publicar, mantener, monitorear, y volver seguras las APIs. Trabajar directamente con AWS Lambda y configurar el servicio de API Gateway puede ser un poco complicado; por eso vamos a usar el Serverless Framework para ayudarnos.

El Serverless Framework permite a los desarrolladores desplegar aplicaciones backend como funciones independientes que serán desplegadas hacia AWS Lambda. También configura AWS Lambda para ejecutar tu código en respuesta a peticiones HTTP usando Amazon API Gateway.

En este capítulo vamos a configurar el Serverless Framework en nuestro ambiente local de desarrollo.

Instalando Serverless

Instalar Serverless globalmente.

$ npm install serverless -g

El comando anterior necesita NPM, un administrador de paquetes para JavaScript. Click aquí si necesitas ayuda para instalar NPM.

En tu directorio de trabajo; crea un proyecto usando Node.js. Vamos a repasar algunos detalles de este proyecto inicial en el siguiente capítulo.

$ serverless install --url https://github.com/AnomalyInnovations/serverless-nodejs-starter --name notes-api

Ve al directorio de nuestro proyecto api backend.

$ cd notes-api

Ahora, el directorio deberá contener algunos archivos incluyendo handler.js y serverless.yml.

  • El archivo handler.js contiene el código real para los servicios/funciones que van a ser desplegados hacía AWS Lambda.
  • El archivo serverless.yml contiene la configuración sobre que servicios AWS Serverless proporcionará y como deben ser configurados.

También tenemos el directorio tests/ donde podemos agregar nuestras pruebas unitarias.

Instalando paquetes Node.js

El proyecto inicial se basa en algunas dependencias listadas en el archivo package.json.

En la raíz del proyecto ejecuta.

$ npm install

A continuación, instalaremos un par de paquetes especificos para nuestro backend.

$ npm install aws-sdk --save-dev
$ npm install uuid@7.0.3 --save
  • aws-sdk nos permite comunicarnos con diferentes servicios AWS.
  • uuid genera ids únicos. Los necesitamos para guardar información en DynamoDB.

Actualizando el nombre del servicio

Cambiemos el nombre de nuestro servicio del que inicialmente teniamos.

Abre el archivo serverless.yml y reemplaza el contenido con lo siguiente.

service: notes-api

# Creando un paquete optimizado para nuestras funciones
package:
  individually: true

plugins:
  - serverless-bundle # Empaquetar nuestras funciones con Webpack
  - serverless-offline
  - serverless-dotenv-plugin # Cargar el archivo .env como variables de ambiente

provider:
  name: aws
  runtime: nodejs12.x
  stage: prod
  region: us-east-1

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get

El nombre del servicio (service) es muy importante. Vamos a llamar a nuestro servicio notes-api. Serverless Framework crea tu ambiente de trabajo en AWS usando este nombre. Esto significa que si cambias el nombre y despliegas tu proyecto, se va a crear un proyecto completamente nuevo!

Vamos a definir también una función Lambda llamada hello. Esta tiene un controlador llamado handler.hello y sigue el siguiente formato:

handler: {filename}-{export}

En este caso el controlador para nuestra función Lambda llamada hello es la función hello que se exporta en el archivo handler.js.

Nuestra función Lambda también responde a un evento HTTP GET con la ruta /hello. Esto tendrá más sentido una vez que despleguemos nuestro API.

Notarás que hemos incluido los plugins — serverless-bundle, serverless-offline, y serverless-dotenv-plugin. El plugin serverless-offline es útil para nuestro desarrollo local. Mientras que el plugin serverless-dotenv-plugin será usado después para cargar archivos .env como variables de ambiente Lambda.

Por otro lado, usaremos el plugin serverless-bundle para permitirnos escribir nuestras funciones Lambda usando un sabor de JavaScript que es similar a aquel que vamos a usar en nuestra aplicación frontend en React.

Veamos esto en detalle.