Creació d’un backend sense servidor amb AWS Lambda i Node.js

Obteniu informació sobre Function-as-a-Service (FaaS), implementeu una demostració en una plataforma AWS Lambda sense servidor, connecteu una base de dades MongoDB com a servei a una API REST sense servidor i molt més.

L’arquitectura sense servidor és un model d’execució de computació en núvol que utilitza un proveïdor de núvol com AWS, Azure o Google Cloud per proporcionar codi de back-end o de servidor. En comparació amb les aplicacions web implementades convencionalment, els desenvolupadors en una arquitectura sense servidor no han de mantenir ni el servidor ni la infraestructura. Tot el que heu de fer és pagar una subscripció al proveïdor extern, mentre que el proveïdor és responsable d’executar la lògica de back-end d’un servidor, així com de l’escalabilitat, fiabilitat i seguretat.

Hi ha dues maneres en què es pot implementar una arquitectura sense servidor per publicar el codi del servidor. El primer és Backend as a Service o BaaS. Un bon exemple d'això és Firebase, que sovint podeu veure juntament amb una aplicació web o mòbil per a una base de dades o per proporcionar autenticació d'usuari.

El que ens centrarem en aquest article es diu Funció com a servei o FaaS. Amb FaaS, el codi del servidor s’executa en contenidors que solen desencadenar-se per esdeveniments generals, com ara sol·licituds HTTP del client, operacions de base de dades, càrregues de fitxers, esdeveniments programats, etc. El codi del proveïdor de núvol que es desplega i s’executa pren la forma d’una funció.

A FaaS aquestes funcions es proporcionen de forma modular. Una funció correspon a qualsevol operació, que elimina la resta del codi i el temps que triga a escriure el codi boilerplate per configurar un servidor i models de dades. Aquestes funcions modulars es poden escalar de forma automàtica i independent. Això permet dedicar més temps a escriure la lògica de l’aplicació amb la qual un usuari potencial interactuarà. No cal escalar i pagar tota la sol·licitud. Els casos d’ús previs per a FaaS han estat tasques programades (o treballs cron), automatització, aplicacions web i xats.

Els proveïdors freqüents de plataformes de serveis FaaS són:

  • AWS Lambda
  • Funcions de Google Cloud
  • Funcions de Microsoft Azure
  • Apache OpenWhisk

Al següent tutorial, crearem una demostració per desplegar-la en un proveïdor d’infraestructura sense servidor com AWS Lambda.

Què és AWS Lambda?

Per crear i desplegar una funció de backend per a una operació concreta, primer configureu el proveïdor de serveis que vulgueu utilitzar per fer el seguiment d’aquest article. AWS Lambda admet diversos temps d'execució com Node.js, Java, Python, .NET Core i Go perquè pugueu executar una funció.

La funció s’executa en un contenidor amb una AMI de 64 bits d’Amazon Linux. Potser us preguntareu: "Per què us explico tot això?" Bé, utilitzar sense servidor per primera vegada pot ser una mica aclaparador. Si sabeu el que obteniu, sempre és bo! A continuació es detallen més coses frikis.

  • Memòria: 128 MB - 3008 MB
  • Espai d'emmagatzematge temporal: 512 MB
  • Temps màxim d'execució: 300 segons
  • Mida del paquet comprimit: 50 MB
  • Mida del paquet sense comprimir: 250 MB

El temps d'execució aquí significa que la vostra funció Lambda només es pot executar durant un màxim de 5 minuts. Això vol dir que no es pretén utilitzar per executar processos més llargs. L’espai d’emmagatzematge té la forma d’emmagatzematge temporal. La mida del paquet fa referència al codi necessari per activar la funció de servidor. En el cas de Node.js, això significa que totes les dependències importades al nostre servidor (per exemple, directori node_modules /).

Una funció Lambda típica en un servidor Node.js té aquest aspecte.

A la sintaxi anterior, handlerFunction és el nom de la nostra funció Lambda. L'objecte d'esdeveniment conté informació sobre l'esdeveniment que la funció Lambda genera quan s'executa. L'objecte context conté informació en temps d'execució. La resta del codi s’escriu a la funció Lambda i, finalment, es crida a una devolució de trucada amb un objecte d’error i un objecte resultat. Més endavant aprendrem més sobre aquests objectes quan els implementem.

Configuració d'AWS Lambda

Per configurar una funció Lambda a AWS, primer heu de registrar un compte per a les claus d'accés. Utilitzeu les vostres credencials per iniciar la sessió a console.amazon.com o per crear un compte nou. Un cop hàgiu completat el procés de verificació, us rebrà a la pantalla següent.

Per obtenir les claus i els permisos per proporcionar una funció, hem de passar a Identity and Access Management (IAM). A continuació, aneu a la pestanya Usuaris de la barra lateral esquerra i feu clic al botó Afegeix usuari. Empleneu les dades del formulari següent i activeu Tipus d’accés> Accés programàtic.

A continuació, a la pàgina següent, seleccioneu Afegeix directament polítiques existents i, a continuació, seleccioneu un nom de política, AdministratorAccess.

Feu clic al botó Següent: Revisa i, a continuació, feu clic al botó Crea un usuari si apareix. Si passeu al pas següent, veureu que l’usuari s’ha creat. Ara i ara només teniu accés a l’identificador de clau d’accés i a la clau d’accés secreta de l’usuari. Aquesta informació és exclusiva de cada usuari que creeu.

Creeu una funció sense servidor

Primer instal·larem una dependència de npm per seguir endavant i crear un projecte nou. Obriu el terminal i instal·leu el següent.

Un cop instal·lat, podem executar el framework sense servidor al terminal executant l'ordre següent:

O utilitzeu l’abreviatura sls per a servidor sense servidor. Aquesta ordre mostra totes les ordres disponibles que vénen amb el framework sense un servidor.

Ara que heu instal·lat la dependència sense servidor com a paquet global, és hora de crear la vostra primera funció. Per començar, heu de configurar les credencials d’usuari d’AWS registrades. AWS us proporciona un enllaç per baixar les claus d’accés quan creeu un usuari.

També podeu trobar el vostre nom d’usuari i la informació de seguretat a continuació.

Ara configurem AWS amb el paquet sense servidor.

Si l'ordre anterior s'executa correctament, rebrà un missatge d'èxit com el següent

El millor d’utilitzar el paquet npm sense servidor és que ve amb plantilles predefinides que podeu crear al vostre projecte amb una sola ordre. A més, es crea una configuració bàsica per a nosaltres, que és necessària per proporcionar la nostra funció Lambda. Per començar, utilitzaré la plantilla aws-nodejs en un directori nou.

El senyalador -p crea un nou directori anomenat aws-serverless-demo. El senyalador -t utilitza la caldera predefinida. El resultat d'això crearà tres fitxers nous al directori del vostre projecte.

  • Habitual .gitignore
  • Escrivim la nostra funció handle a handler.js
  • serverless.yml conté la configuració

El fitxer de controlador per defecte té aquest aspecte.

Al fitxer anterior, Hello és la funció que té dos paràmetres: esdeveniment i context. module.exports és la sintaxi bàsica del node, així com la resta del codi. Podeu veure clarament que també admet funcions ES6. Un esdeveniment és un objecte que conté totes les dades de sol·licitud necessàries. L'objecte context conté valors específics d'AWS. Ja ho hem comentat abans. Adaptem aquesta funció a les nostres necessitats i afegim un tercer paràmetre anomenat callback. Obriu el fitxer handler.js i editeu la funció hello.

La funció de devolució de trucada s'ha de cridar amb una resposta d'error com a primer argument. En el nostre cas, actualment és nul·la o és una resposta vàlida com a segon argument que actualment envia un missatge senzill de Hello World. Ara podem proporcionar aquesta funció de controlador amb l'ordre següent a la finestra del terminal.

El procés trigarà uns minuts a finalitzar-se. La nostra funció sense servidor està empaquetada en un fitxer ZIP. Tingueu en compte la informació següent sobre el servei. Conté tota la informació sobre quins punts finals estan disponibles, quines funcions tenim, on es proporcionen, etc.

Podeu provar l'atribut invoke de la següent manera per executar la funció i veure'n el resultat.

La sortida serà així.

Mireu la configuració a serverless.yml.

API REST amb pila sense servidor

En aquesta part del tutorial, us mostraré com connectar una base de dades MongoDB com a servei a una API REST sense servidor. Necessitarem tres coses per completar la nostra pila de tecnologia. Tu ets:

  • AWS Lambda
  • Node.js
  • Atlas de MongoDB

Ja tenim les dues primeres, tot el que hem de fer és configurar una base de dades en núvol MongoDB anomenada Atlas. MongoDB Atlas és una base de dades com a servei que va ser desenvolupada per l'equip que hi ha darrere de MongoDB. MongoDB Atlas no només ofereix un nivell gratuït / de pagament per emmagatzemar les vostres dades al núvol, sinó que també ofereix nombroses analítiques que són essencials per gestionar i controlar la vostra aplicació. MongoDB Atlas ofereix un nivell gratuït que utilitzarem amb la nostra pila sense servidor.

Creeu una base de dades a MongoDB Atlas

En primer lloc, creem una base de dades a l'Atlas de MongoDB. Inicieu la sessió al lloc web i creeu un compte si encara no en teniu cap. Només necessitem un entorn de caixa de sorra per tenir experiència pràctica, de manera que hem d’anar pel nivell gratuït. Un cop hàgiu configurat el compte, obriu la pàgina del compte i afegiu-ne una altra.

Ara continueu després d'introduir el nom i feu clic a Crea organització.

A continuació, se us demanarà la pantalla principal on podreu crear un projecte nou. Introduïu el nom del vostre projecte i continueu.

MongoDB Atlas està protegit per defecte. Cal que definiu els permisos abans que puguem utilitzar-lo a la nostra aplicació. Podeu anomenar la base de dades al camp que es mostra a continuació.

Ara podem afegir el nostre sandbox gratuït al nostre projecte. Es diu cúmul.

A continuació, només cal afegir un administrador del clúster i donar-los una contrasenya molt forta. Com podeu veure, el preu d’aquest clúster serà de 0,00 $ per sempre. Es triga uns minuts a subministrar el clúster. Mentrestant, per fi comencem a escriure codi.

API de compilació

A continuació, instal·larem totes les dependències necessàries per construir l'API.

Després, configurem serverless.yml i afegim les altres funcions de control que hem de proporcionar.

Les operacions CRUD que gestionen les funcions de l'API REST es troben al fitxer handler.js. Cada esdeveniment conté la informació de l'esdeveniment de l'esdeveniment actual, que és cridada per handler.js. Al fitxer de configuració anterior, hem definit cada operació CRUD juntament amb un esdeveniment i un nom. Tingueu en compte també que en definir els esdeveniments al fitxer anterior, estem associant una sol·licitud HTTP a un camí d'accés que serà el punt final de l'operació CRUD a l'API, el mètode HTTP i, finalment, l'opció cors.

Demostraré una senzilla aplicació per prendre notes a través de la nostra API REST. Aquestes operacions CRUD formaran el nucli. Com que la nostra API s’allotja de forma remota, hem d’habilitar l’ús compartit de recursos entre orígens. No cal instal·lar-hi cap altra dependència. El fitxer de configuració sense servidor ho admet. Només cal que especifiqueu esdeveniments com cors: true a la secció Esdeveniments. Per defecte, està malament.

Definiu les funcions del controlador

Si esteu familiaritzat amb Node.js i el framework Express, trobareu que hi ha poca diferència entre crear una funció de controlador que condueixi a la lògica de negoci d'una ruta. L'enfocament similar que utilitzarem per a cada funció de controlador.

El context conté tota la informació sobre la funció de controlador. Quant de temps dura, quanta memòria fa servir, entre altres coses? A la part superior, cada funció té el mateix valor per a context.callbackWaitsForEmptyEventLoop, que s’estableix en false, i comença amb la funció que crida connectToDatabase. Per defecte, el valor de la propietat de l'objecte context callbackWaitsForEmptyEventLoop s'estableix en true. Aquesta propietat s’utilitza per canviar el comportament d’una devolució de trucada.

Per defecte, la devolució de trucada espera fins que el bucle d'esdeveniments estigui buit abans de congelar el procés i retornar els resultats a la funció cridada. Si definiu el valor d’aquesta propietat com a fals, l’AWS Lambda congelarà el procés després d’invocar la devolució de trucada, fins i tot si hi ha esdeveniments al bucle d’esdeveniments. Per obtenir més informació sobre aquesta propietat de context, consulteu la documentació oficial de Lambda.

Connecteu MongoDB

Hem d’establir una connexió entre la base de dades i les nostres funcions sense servidor per aprofitar les operacions CRUD en temps real. Creeu un fitxer nou anomenat db.js al directori arrel i afegiu el següent.

La connexió habitual de Mongoose que potser heu vist en altres aplicacions de Nodejs quan utilitzeu MongoDB com a base de dades. L’única diferència és que exportem connectToDatabase per importar-lo a handler.js per a cada operació CRUD. Modifiqueu el fitxer handler.js i importeu-lo més amunt.

El següent pas és definir el model de dades que necessitem perquè les coses funcionin. Mongoose també ofereix aquesta funcionalitat. La pila sense servidor és independent de l’ODM o l’ORM que utilitzeu a la vostra aplicació. Creeu un fitxer nou anomenat notes.model.js i afegiu el següent.

Ara importeu aquest model a handler.js per obtenir les nostres devolucions de trucada a la part superior del fitxer.

Ús de variables de Dotenv i d’entorn

Protegir les nostres claus i altres elements importants és el primer pas cap a una aplicació de backend segura. Creeu un fitxer nou anomenat variables.env. En aquest fitxer afegim la nostra URL de connexió MONGODB, que ja hem utilitzat a db.js com a process.env.DB. El millor de les variables d'entorn és que són globals per a l'abast.

Per conèixer la nostra URL de MongoDB, hem de tornar a l’Atles de Mongodb per conèixer el clúster que hem creat anteriorment. Feu clic al botó Connecta i se us demanarà una pàgina on podeu triar com accedir a l'aplicació. Feu clic a Permet l'accés a qualsevol lloc.

Copieu l'URL Mongodb des de dalt i enganxeu-lo al fitxer variables.env.

Substituïu els camps d'usuari i contrasenya per les vostres credencials. Perquè funcioni ara, només cal afegir la següent línia al nostre handler.js.

compromís

Tot el que heu de fer és executar l'ordre deploy des del terminal.

Com que hem connectat la nostra funció lambda, aquesta ordre ens demana un punt final diferent. Cada funció de controlador es proporciona com a punt final REST separat.

Podeu provar la vostra API mitjançant l'ordre CURL del terminal de la manera següent.

El codi complet d’aquest article es pot trobar a l’ositori següent del dipòsit Github

Gràcies a William Wickey per l'ajuda amb el processament.

Voleu crear una web o una aplicació per a mòbils?

Crowdbotics és la forma més ràpida de construir, llançar i escalar una aplicació.

Desenvolupador? Proveu el creador d'aplicacions de Crowdbotics per configurar i desplegar aplicacions ràpidament mitjançant una gran varietat de marcs populars.

Està ocupat o no en tecnologia? Uniu-vos a centenars d’equips feliços que desenvolupen programari amb PM Crowdbotics i desenvolupadors experimentats. Mantingueu la programació i els costos gratuïts amb el desenvolupament d'aplicacions gestionades per Crowdbotics.