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
11. Case study Architecture
Web portal
Subscription Management
● Lambda
● API Gateway
● Bucket S3
● Cloudfront
● RDS
12. 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.
13. 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.
14. 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…
16. 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
17. 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
18. 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
21. 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)
22. 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)
23. 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)
24. 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!
25. 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?
26. Alessandro P.
Ok, fantastico… Ma in un’applicazione reale io ho
bisogno di gestire anche caching, code, file storage…
Come faccio con serverless?
28. 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)
29. 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 ½
30. 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
31. 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
32. 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',
],
],
33. 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'),
...
34. 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
35. 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
36. 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.