de Slobodan Stojanović

Express.js și AWS Lambda – o poveste de dragoste fără server

Dacă sunteți un dezvoltator Node.js sau ați creat un API cu Node.js, există mari șanse să le utilizați Express.js. Express este de facto cel mai popular cadru Node.js.

Aplicațiile Express sunt ușor de construit. Pentru o aplicație simplă, trebuie doar să adăugați câteva rute și manipulatoare de rute. Asta e.

Expressjs si AWS Lambda o poveste de dragoste fara
O aplicație Express.js simplă, găzduită în mod tradițional, cu o singură solicitare.

De exemplu, cea mai simplă aplicație Express arată ca următorul fragment de cod:

'use strict'
const express = require('express')const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
const port = process.env.PORT || 3000app.listen(port, () =>   console.log(`Server is listening on port ${port}.`))

Dacă salvați acel fragment de cod ca app.js într-un folder nou, sunteți la doar trei pași distanță de a avea o aplicație simplă Express:

  1. Creați un nou proiect Node.js. Pentru a face acest lucru, rulați npm init -y comandă în terminalul dvs. Asigurați-vă că ați navigat la dosarul care conține app.js primul.
  2. Instalați modulul Express de la NPM executând npm install express --save comanda de la terminal.
  3. Rulați node app.js și ar trebui să vedeți „Serverul ascultă pe portul 3000”. ca răspuns.

Voila! Aveți o aplicație Express. Accesați http: // localhost: 3000 în browserul dvs. și veți vedea un „Hello world!” mesaj.

Implementarea aplicației

Acum vine partea dificilă: cum o poți arăta prietenilor sau familiei? Cum să-l punem la dispoziția tuturor?

Implementarea poate fi un proces lung și dureros, dar să ne imaginăm că reușești să o faci rapid și cu succes. Aplicația dvs. este disponibilă pentru toată lumea și a trăit fericită pentru totdeauna.

Până într-o zi, o armată neașteptată de utilizatori a început să o folosească.

Serverul dvs. s-a luptat, dar a funcționat.

1611012605 646 Expressjs si AWS Lambda o poveste de dragoste fara
O aplicație Express.js simplă, găzduită în mod tradițional, sub încărcare.

Cel puțin de ceva timp. Și apoi a murit. ☠️

1611012605 806 Expressjs si AWS Lambda o poveste de dragoste fara
Un Express.js simplu, dar mort, găzduit în mod tradițional, care sa prăbușit deoarece prea mulți utilizatori au accesat-o.

O armată de utilizatori este supărată (cel puțin nu au plătit pentru aplicație – sau nu?) Sunteți disperat și încercați să soluționați Google. Norul poate ajuta?

1611012605 624 Expressjs si AWS Lambda o poveste de dragoste fara
Cloud ar trebui să remedieze problemele de scalare, nu?

Și ai întâlnit din nou unul dintre prietenii tăi enervanți. Vorbește din nou despre chestia asta fără server. Dar haide, aveți în continuare un server. Pur și simplu aparține altcuiva și nu aveți control asupra acestuia.

1611012605 886 Expressjs si AWS Lambda o poveste de dragoste fara
Dar, există servere!

Dar ești disperat, ai încerca orice, inclusiv magie neagră și chiar fără server. „Ce naiba e chestia aia fără server, oricum?”

Ați ajuns cu mai multe link-uri, inclusiv cel către primul capitol gratuit din „Aplicații fără server cu Node.js” de Manning Publications.

Acest capitol explică fără server cu mașinile de spălat !? Sună nebunesc, dar cam are sens. ? a lovit deja ventilatorul, deci decideți să-l încercați.

Aplicația Express.js devine fără server

Capitolul a fost despre serverless pe AWS. Și acum știți că API fără server constă dintr-un gateway API și funcții AWS Lambda. Dar cum puteți rămâne fără server cu aplicația dvs. Express?

Sună la fel de promițător ca și filmul despre Matt Damon care se micșorează …

1611012606 51 Expressjs si AWS Lambda o poveste de dragoste fara
Cum încadrați aplicația Express.js în AWS Lambda?

Claudia ar putea să vă ajute să implementați aplicația pe AWS Lambda – să îi cerem ajutorul!

Asigurați-vă că ați configurat acreditările de acces AWS așa cum este explicat în acest tutorial înainte de a rula comenzi Claudia.

Codul dvs. ar trebui să fie ușor modificat pentru a accepta AWS Lambda și implementarea prin Claudia. Trebuie să exportați fișierul app în loc să porniți serverul folosind app.listen. Ta app.js ar trebui să arate ca următoarea listare a codului:

'use strict'
const express = require('express')const app = express()
app.get('/', (req, res) => res.send('Hello world!'))
module.exports = app

Asta ar rupe un server Express local, dar puteți adăuga app.local.js fișier cu următorul conținut:

'use strict'
const app = require('./app')
const port = process.env.PORT || 3000app.listen(port, () =>   console.log(`Server is listening on port ${port}.`))

Și apoi rulați serverul local folosind următoarea comandă:

node app.local.js

Pentru ca aplicația dvs. să funcționeze corect cu AWS Lambda, trebuie să generați împachetarea AWS Lambda pentru aplicația dvs. Express. Cu Claudia, puteți face acest lucru executând următoarea comandă în terminal:

claudia generate-serverless-express-proxy --express-module app

Unde app este un nume al unui fișier de intrare al aplicației dvs. Express, doar fără .js extensie.

Acest pas a generat un fișier numit lambda.js, cu următorul conținut:

'use strict'const awsServerlessExpress = require('aws-serverless-express')const app = require('./app')const binaryMimeTypes = [  'application/octet-stream',  'font/eot',  'font/opentype',  'font/otf',  'image/jpeg',  'image/png',  'image/svg+xml']const server = awsServerlessExpress  .createServer(app, null, binaryMimeTypes)exports.handler = (event, context) =>  awsServerlessExpress.proxy(server, event, context)

Asta e! Acum trebuie doar să implementați aplicația Express (cu lambda.js fișier) către AWS Lambda și API Gateway folosind claudia create comanda.

claudia create --handler lambda.handler --deploy-proxy-api --region eu-central-1

După câteva momente, comanda a terminat și a imprimat următorul răspuns:

{  "lambda": {    "role": "awesome-serverless-expressjs-app-executor",    "name": "awesome-serverless-expressjs-app",    "region": "eu-central-1"  },  "api": {    "id": "iltfb5bke3",    "url": "https://iltfb5bke3.execute-api.eu-central-1.amazonaws.com/latest"  }}

Și dacă vizitați linkul din răspunsul respectiv în browserul dvs., acesta imprimă „Hello world!” A mers! ?

Expressjs si AWS Lambda o poveste de dragoste fara
Aplicație fără server Express.

Cu o aplicație fără server, armata dvs. de utilizatori poate continua să crească și aplicația dvs. va funcționa în continuare.

Este posibil, deoarece AWS Lambda va scala automat până la 1000 de execuții simultane în mod implicit. Funcțiile noi sunt gata la câteva momente după ce API Gateway primește cererea.

1611012606 108 Expressjs si AWS Lambda o poveste de dragoste fara
Aplicația Serverless Express.js sub sarcină mare.

Dar acesta nu este singurul dvs. beneficiu. De asemenea, ați economisit bani pe lângă faptul că aveți o aplicație stabilă sub o încărcare mai mare. Cu AWS Lambda, plătiți numai pentru solicitările pe care le-ați utilizat. De asemenea, primele milioane de solicitări în fiecare lună sunt gratuite, ca parte a unui nivel gratuit.

1611012606 228 Expressjs si AWS Lambda o poveste de dragoste fara
De asemenea, aplicația dvs. fără server vă economisește bani!

Pentru a citi mai multe despre modul în care beneficiază afacerea dvs. prin serverless, consultați acest articol.

Limitări ale aplicațiilor Express.js fără server

Aplicațiile fără server Express sună minunat, dar au unele limitări.

1611012606 969 Expressjs si AWS Lambda o poveste de dragoste fara
Fără server, ediția limitată.

Unele dintre limitările importante ale aplicațiilor Express fără server sunt următoarele:

  • Websockets nu lucrați cu AWS Lambda. Acest lucru se datorează faptului că serverul dvs. nu există atunci când nu există cereri. Unele asistențe limitate pentru websockets sunt disponibile prin Websockets AWS IOT peste protocolul MQTT.
  • Încărcare nici în sistemul de fișiere nu va funcționa, cu excepția cazului în care încărcați pe /tmp pliant. Asta pentru că funcția AWS Lambda este doar în citire. Chiar dacă încărcați fișiere în /tmp folder, vor exista pentru o perioadă scurtă de timp, în timp ce funcția este încă „caldă”. Pentru a vă asigura că funcția de încărcare funcționează bine, ar trebui să încărcați fișiere în AWS S3.
  • Limite de execuție poate afecta, de asemenea, aplicația Express fără server. Deoarece API Gateway are un timeout de 30 de secunde, iar timpul maxim de execuție al AWS Lambda este de 5 minute.

Acesta este doar începutul unei povești de dragoste fără server între aplicațiile dvs. și AWS Lambda. Așteptați mai multe povești în curând!

Ca întotdeauna, mulțumiri prietenilor mei Aleksandar Simović și Milovan Jovičić pentru ajutor și revenire la articol.

Toate ilustrațiile sunt create folosind Diagramele simple4 aplicație.

Dacă doriți să aflați mai multe despre aplicațiile fără server Express și aplicațiile fără server în general, consultați „Aplicații fără server cu Node.js”, cartea pe care am scris-o împreună cu Aleksandar Simovic pentru Manning Publications:

Aplicații fără server cu Node.js
O introducere convingătoare la implementările fără server folosind Claudia.js.www.manning.com

Cartea vă va învăța mai multe despre aplicațiile Express fără server, dar veți învăța și cum să construiți și să depanați un API fără server din lumea reală (cu DB și autentificare) folosind Node și Claudia.js. Și cum să construiești chatbots, pentru Facebook Messenger și SMS (folosind Twilio) și abilități Alexa.