serverless.yml<\/em>:<\/p>\n\n\n\nservice: express-serverless\nprovider:\n name: aws\n runtime: nodejs12.x\n region: eu-west-1\n stage: ${env:NODE_ENV}\n environment:\n NODE_ENV: ${env:NODE_ENV}\n iamRoleStatements:\n - Effect: 'Allow'\n Action:\n - 'secretsmanager:GetSecretValue'\n Resource:\n - '*'\n\npackage:\n exclude:\n - node_modules\/**\n - defer\" defer\" defer\" defer\" defer\" defer\" defer\" defer\" defer\" defer\" defer\" defer\" defer\" defer\" defer\" src\/**\n\nlayers:\n nodeModules:\n path: layer\n compatibleRuntimes:\n - nodejs12.x\n\n\u2026..\n\nfunctions:\n app:\n handler: dist\/app.handler\n layers:\n - {Ref: NodeModulesLambdaLayer}\n events:\n - http:\n path: \/api\n method: ANY\n cors: true\n - http:\n path: \/api\/{proxy+}\n method: ANY\n cors: true\n vpc:\n securityGroupIds:\n - {Ref: LambdaSecurityGroup}\n subnetIds:\n - \"subnet-1\"\n - \"subnet-2\"\n - \"subnet-3\"\n\nplugins:\n - serverless-offline<\/pre>\n\n\n\nProprio qui stiamo andando a definire le parti essenziali dell\u2019infrastruttura, come il Cloud Provider su cui andremo a deployare la nostra Lambda function, il suo handler (il modulo che abbiamo esportato nel file app.ts<\/em>) e i Lambda Layer da agganciare alla function.<\/p>\n\n\n\nCon questa configurazione, infatti, andremo a creare un Lambda Layer contenente tutti i node modules. Cos\u00ec facendo, alleggeriremo notevolmente le dimensioni della nostra funzione ottenendo vantaggi in performance<\/strong> durante la sua esecuzione.<\/p>\n\n\n\nMa come verr\u00e0 invocata la Lambda function? Tramite gli events<\/em> di tipo http <\/em>definiti nel file di Serverless!<\/em> Questo permetter\u00e0 la creazione di un API Gateway con cui sar\u00e0 possibile richiamare la nostra funzione.<\/p>\n\n\n\nLa risorsa col path \/api\/{proxy+}<\/em> sar\u00e0 quella che far\u00e0 da proxy alle rotte di backend. Abbiamo cos\u00ec creato un\u2019unica risorsa lato API Gateway che ci permetter\u00e0 di invocare tutte le REST API.<\/p>\n\n\n\nLocal testing<\/h2>\n\n\n\n Vi piacerebbe poter testare le API senza doverle necessariamente rilasciare su AWS Lambda ad ogni modifica? Il pacchetto di Node.js serverless-offline <\/em><\/strong>\u00e8 ci\u00f2 che fa al caso nostro!<\/strong><\/p>\n\n\n\nServerless-offline<\/em><\/strong> \u00e8 un plugin di Serverless che emula AWS Lambda e API Gateway sulla nostra macchina per velocizzare le attivit\u00e0 di sviluppo.<\/p>\n\n\n\nPrima di poterlo usare, per\u00f2, sar\u00e0 necessario creare un database Postgres<\/strong> in locale e lanciare le migrazioni di Sequelize:<\/p>\n\n\n\nDalla root del progetto eseguiamo il comando<\/p>\n\n\n\n
docker-compose up -d<\/pre>\n\n\n\nE poi:<\/p>\n\n\n\n
npm run migrate-db-local<\/pre>\n\n\n\nOra che abbiamo il database in locale, non ci resta che provare le API! Lanciamo il comando npm run start <\/em>per compilare il nostro codice TypeScript in JavaScript ed emulare la Lambda tramite il plugin serverless-offline<\/em>.<\/p>\n\n\n\nNon appena il comando avr\u00e0 completato la sua esecuzione, otterremo il seguente output sul terminale:<\/p>\n\n\n\n <\/figure>\n\n\n\nA questo punto siamo pronti per testare le API col nostro tool preferito (Postman, Curl). Utilizzando, ad esempio, il comando curl <\/em>possiamo eseguire da terminale il comando: <\/p>\n\n\n\ncurl http:\/\/localhost:3000\/dev\/api\/book\/<\/em><\/p>\n\n\n\nDeploy <\/h2>\n\n\n\n Ci siamo: \u00e8 il momento di deployare l\u2019infrastruttura sul nostro account!<\/p>\n\n\n\n
Lanciando il comando npm run deploy-dev<\/em> inizier\u00e0 il processo di rilascio<\/strong>. La prima volta apparir\u00e0 il seguente output:<\/p>\n\n\n\n <\/figure>\n\n\n\nSull\u2019account AWS potremo vedere che \u00e8 stato generato uno stack Cloudformation contenente le risorse di cui abbiamo bisogno.<\/p>\n\n\n\n
Accedendo alla console, tra la lista delle Lambda functions troveremo anche quella appena creata:<\/p>\n\n\n\n <\/figure>\n\n\n\nPrima di poter testare le API sar\u00e0 necessario lanciare le migrazioni di Sequelize<\/em> per creare le tabelle sul database Aurora Serverless. Dobbiamo quindi poterci connettere al database su AWS. Creiamo una macchina bastion sull\u2019account e dirottiamo il traffico dalla nostra macchina al bastion. Utilizziamo il comando sshuttle:<\/em><\/p>\n\n\n\nsshuttle --dns -r ubuntu@EC2_BASTION_IP YOUR_VPC_CIDR --ssh-cmd 'ssh -i YOUR_PEM_KEY'<\/pre>\n\n\n\nA questo punto possiamo lanciare la migrazione tramite il comando:<\/p>\n\n\n\n
npm run migrate-dev<\/pre>\n\n\n\nUna volta completate le migrazioni su Aurora Serverless, proviamo le API attraverso API Gateway.<\/p>\n\n\n\n
Nell\u2019output del comando npm run deploy-dev <\/em>\u00e8 gia stato stampato l\u2019endpoint dell\u2019API Gateway, proviamolo subito:<\/p>\n\n\n\ncurl https:\/\/sxfd74jes5.execute-api.eu-west-1.amazonaws.com\/dev\/api\/book\/<\/em><\/p>\n\n\n\nIl rilascio dell\u2019infrastruttura Serverless sull\u2019account AWS \u00e8 finito!<\/p>\n\n\n\n
Conclusioni<\/h2>\n\n\n\n Per concludere, in questo articolo abbiamo visto come creare un\u2019applicazione Serverless su AWS Lambda utilizzando Node.js come runtime engine.<\/strong><\/p>\n\n\n\nPer scrivere il progetto abbiamo scelto TypeScript<\/strong> per avere il vantaggio di usare un linguaggio trascompilato, ampiamente supportato e conosciuto.<\/p>\n\n\n\nLa scelta di Node.js come runtime engine ci ha permesso di avere un Cold Start time<\/strong><\/a> molto contenuto<\/strong> in quanto JavaScript viene direttamente interpretato dall\u2019engine. Inoltre, grazie alla configurazione utilizzata, il codice sorgente \u00e8 stato separato dalle dipendenze, salvate su Lambda Layer, abbattendo drasticamente le dimensioni del nostro sorgente e migliorando ulteriormente le performance di avvio.<\/p>\n\n\n\nSoddisfatti? \ud83d\ude42<\/p>\n\n\n\n
A presto su #Proud2beCloud<\/a> per il prossimo articolo!<\/p>\n","protected":false},"excerpt":{"rendered":"Su Amazon Web Services il servizio computazionale Serverless per eccellenza rimane AWS Lambda, quasi immancabile in un\u2019architettura che utilizza questo […]<\/p>\n","protected":false},"author":14,"featured_media":1653,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[477],"tags":[255,395,356,263,387,385,389,397,267,393,391],"yoast_head":"\n
Costruiamo un backend Serverless con TypeScript, Node.js e AWS Lambda. - Proud2beCloud Blog<\/title>\n \n \n \n \n \n \n \n \n \n \n \n \n\t \n\t \n\t \n \n \n \n \n \n \n\t \n\t \n\t \n