Successfully reported this slideshow.
Your SlideShare is downloading. ×

[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 36 Ad

[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf

Download to read offline

Grazie a Serverless e Bref.sh è possibile mettere (facilmente) online una web-app in Laravel su AWS. Vedremo come è possibile dar vita ad un’architettura complessa (con web server, object storage, code, database, cache e CDN) ad alta disponibiltà e scalabile, mantenendo un costo basso ed utilizzando esclusivamente servizi fully-managed.

Francesco Liuzzi

Grazie a Serverless e Bref.sh è possibile mettere (facilmente) online una web-app in Laravel su AWS. Vedremo come è possibile dar vita ad un’architettura complessa (con web server, object storage, code, database, cache e CDN) ad alta disponibiltà e scalabile, mantenendo un costo basso ed utilizzando esclusivamente servizi fully-managed.

Francesco Liuzzi

Advertisement
Advertisement

More Related Content

Recently uploaded (20)

Advertisement

[Laravel Day 2022] Deploy di Laravel su AWS Lambda (from Zero to Hero).pdf

  1. 1. Deploy di Laravel su AWS Lambda from Zero to Francesco Liuzzi Verona, 17 Novembre 2022
  2. 2. ● Francesco Liuzzi ● 28 anni ● Locorotondo (BA) Chi sono?
  3. 3. My way Zuora Dev/Cons ● Billing automation ● Payment ● Integration Back-end Dev ● Magento ● Laravel ● CakePHP ● E-commerce platform Chief Architect ● AWS Serverless Solutions Architect ● E-commerce Solutions Architect Nov 2017 2018 Aug 2021 Salesforce Dev/Cons ● CRM ● Marketing Automation 2020 Il mio primo Laravel Day
  4. 4. The Company MarTech Consulting ~150 persone felici Silver Sponsor di Laravel Day 2022
  5. 5. Oggi parliamo di
  6. 6. Case study Web portal Subscription Management
  7. 7. Case study Architecture Web portal Subscription Management ● Lambda ● API Gateway ● Bucket S3 ● Cloudfront ● RDS
  8. 8. I servizi AWS Lambda: è un servizio di calcolo basato su eventi serverless che ti permette di eseguire codice senza effettuare il provisioning o gestire server. API Gateway: è un servizio completamente gestito che semplifica la creazione, la pubblicazione, la manutenzione, il monitoraggio e la protezione delle API.
  9. 9. I servizi AWS S3: Simple Storage Service è un servizio di archiviazione di oggetti che offre scalabilità, disponibilità dei dati, sicurezza e prestazioni all'avanguardia. Cloudfront: è la rete di distribuzione di contenuti (CDN) di AWS. Essa, grazie ad una rete di edge locations, consente di distribuire asset statici in modo efficace e proxare contenuti dinamici facendo tendere a zero latenza di rete.
  10. 10. I servizi AWS RDS: Amazon Relational Database Service è una raccolta di servizi gestiti che rende semplice impostare, operare e scalare i database nel cloud. Supporta i principali engine (open e non) ed ha una propria implementazione (Aurora) compatibile con Mysql e Postgres che può essere utilizzata in modalità serverless. DynamoDB: è un servizio serverless di AWS che eroga un database di tipo key-object a bassa latenza. Utilizzi tipici sono come dispositivo per salvare dati non strutturati, fare caching…
  11. 11. Let’s code!
  12. 12. Al fine di creare la prima applicazione serverless, sono necessari alcuni step preliminari di configurazione: 1. Creare un account AWS 2. Creare un utente IAM con ruolo Administrator che useremo per l’accesso programmatico via CLI. Setup AWS 1/2
  13. 13. 3. Copiare Access Key ID e Secret Key 4. Installare la CLI AWS 5. Da terminale, digitare il comando in blu ed a seguire le credenziali copiate 6. Per verificare la corretta configurazione, digitare della cli Setup AWS 2/2
  14. 14. Setup Serverless Una volta configurata la CLI di AWS con le giuste credenziali, installiamo la CLI del framework serverless: 0. Pre-requisito: node e npm installati 1. Installa serverless con il comando $ npm install -g serverless 2. Verifica che sia installato correttamente con
  15. 15. Sls - Primo progetto
  16. 16. Sls - Primo deploy
  17. 17. Per utilizzare Serverless con il runtime PHP (e far girare quindi un applicativo Laravel) utilizzeremo il package bref.sh Bref.sh è un package composer che consente di utilizzare PHP come runtime custom per le funzioni AWS lambda. Bref.sh è idoneo per molteplici casi d’uso: ● Creazione di APIs ● Workers ● Processi in batch ● Hosting di siti web dinamici Vediamo ora come utilizzarlo su un progetto Laravel: 1. Installiamo il package principale e il bridge per laravel $ composer require bref/bref bref/laravel-bridge --update-with-dependencies 2. Pubblichiamo il serverless.yml $ php artisan vendor:publish --tag=serverless-config E per PHP? (⅓ install)
  18. 18. Apportiamo qualche piccola modifica al file serverless.yml Cambio nome al servizio Aggiungo il profile AWS da utilizzare Aggiungo le variabili d’ambiente Rimuovo il file .env dal package di deploy E per PHP? (⅔ setup)
  19. 19. Infine, possiamo già effettuare il primo deploy. 1. Per evitare che la cache generata in locale venga deployata nella lambda cancelliamo la configurazione cachata $ php artisan config:clear 2. $ sls deploy L’output è di facile interpretazione: URL pubblicamente raggiungibile E per PHP? (3⁄3 deploy)
  20. 20. Spesso è indispensabile l’utilizzo della CLI per invocare comandi di artisan, oppure per invocare comandi custom che noi stessi abbiamo realizzato. Riprendendo l’output del deploy precedente Usiamo la sintassi $ vendor/bin/bref cli <function-name> -- <command> Nel nostro caso useremo ad esempio: $ vendor/bin/bref cli laravelday-2022-sls-demo-dev-artisan -- migrate:fresh --force I’m an artisan!
  21. 21. Il package bref/laravel-bridge registra il BrefServiceProvider che: ● Configura ”stderr” come log driver di default al fine di inviare i log a CloudWatch (i log generati dal runtime lambda finiscono qui) ● Configura “cookie” come session driver di default ○ Se state implementando un’API stateless e non avete bisogno della sessione potete settare SESSION_DRIVER=array come variabile d’ambiente ○ È possibile utilizzare anche altri driver come database o redis ● Usa come directory di cache la cartella /tmp (nel contesto di esecuzione della lambda, tutto il filesystem è read-only ad eccezione della cartella /tmp) Why laravel-bridge?
  22. 22. Alessandro P. Ok, fantastico… Ma in un’applicazione reale io ho bisogno di gestire anche caching, code, file storage… Come faccio con serverless?
  23. 23. Serverless lift
  24. 24. Serverless lift È un plugin di serverless che facendo leva sulla CDK di AWS espande le funzionalità del framework. Si installa come un plugin di serverless, ovvero lanciando nella cartella di progetto il comando: $ serverless plugin install -n serverless-lift Una volta installato, si possono utilizzare i costrutti di Lift nel file serverless.yml. In particolare approfondiremo: ● Server-side website (per hostare tramite AWS S3 il front-end della nostra web app) ● DynamoDB Table (che useremo come dispositivo di caching) ● Queue (Useremo il servizio AWS SQS per gestire in modo semplice comportamenti il dispatch ed il work di job)
  25. 25. Al fine di servire anche le componenti statiche della nostra web app, aggiungiamo sul file serverless.yml il seguente snippet e rieseguiamo il deploy con $ serverless deploy Serverless lift - Server-side website ½
  26. 26. Dopo il deploy (sono necessari diversi minuti), l’output è il seguente: Abbiamo quindi effettuato il deploy di una distribuzione di cloudfront, ottenendo un URL del tipo https:/ /<variable-part>.cloudfront.net In questa doc possiamo vedere come usare il nostro dominio invece di quello di cloudfront. Serverless lift - Server-side website 2/2
  27. 27. DynamoDB è un servizio gestito di AWS che consente di fruire facilmente di un DB key-object. Utilizzeremo tale servizio come dispositivo di caching. Aggiungiamo sul file serverless.yml i seguenti snippet Serverless - DynamoDB Table 1/2
  28. 28. Modifichiamo quindi il file config/cache.php come segue: Effettuiamo infine il deploy (ricordandoci di svuotare la cache). Siamo ora in grado di utilizzare la cache senza problemi. Serverless - DynamoDB Table 2/2 'dynamodb' => [ 'driver' => 'dynamodb', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'token' => env('AWS_SESSION_TOKEN'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'table' => env('DYNAMODB_CACHE_TABLE'), 'endpoint' => env('DYNAMODB_ENDPOINT'), 'attributes' => [ 'key' => 'id', 'expiration' => 'ttl', ], ],
  29. 29. Simple Queue Service (SQS) è un servizio gestito di AWS che consente di configurare facilmente una coda con il relativo worker. A tal fine eseguiamo il seguente comando per pubblicare il worker $ php artisan vendor:publish --tag=serverless-worker Aggiungiamo poi sul file serverless.yml gli snippet di fianco. Bisogna inoltre modificare il file config/queue.php come segue: Effettuiamo infine il deploy (ricordandoci di svuotare la cache). Siamo ora in grado di utilizzare il dispatch dei job senza problemi. Serverless lift - Queues provider: ... environment: ... QUEUE_CONNECTION: sqs SQS_QUEUE: ${construct:jobs.queueUrl} functions: ... constructs: jobs: type: queue worker: handler: worker.php layers: - ${bref:layer.php-81} 'sqs' => [ 'driver' => 'sqs', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'token' => env('AWS_SESSION_TOKEN'), ...
  30. 30. Ricapitolando… Oggi abbiamo: ● Esplorato il framework Serverless ed il package Bref.sh ● Effettuato il deploy di una web app Laravel in una AWS Lambda ● Aggiunto alla nostra web app grazie a Serverless Lift: ○ l’hosting delle componenti statiche con AWS S3 e Cloudfront (via server-side website) ○ Un dispositivo di caching tramite AWS DynamoDB ○ Un gestore di code tramite AWS SQS
  31. 31. CREDITS: This presentation template was created by Slidesgo, including icons by Flaticon, infographics & images by Freepik Thanks Domande? Feedback? https:/ /joind.in/talk/88a1b Please keep this slide for attribution
  32. 32. Approfondimento: Come funziona serverless Per approfondire cosa c’è “sotto il cofano” di serverless (e di bref.sh) vi rimando ad uno speech di Gianfranco Castro al Laravel Day 2018.

×