4 Marzo 2022 - News

Come implementare applicazioni in PHP sfruttando la potenza del Cloud

giancarlo_rossi_php_serverless

La vita del programmatore web è sempre piena di opportunità e oggi come oggi il Cloud mette a disposizione soluzioni molto interessanti e anche semplici da approcciare. 
Il concetto di Cloud è già ben noto agli addetti ai lavori, ma a volte ci sfugge qualcosa così ci è sembrato interessante scrivere qualche riga su una libreria PHP di recente costituzione. Parliamo di Bref una libreria PHP, creata da un collega francese, che ci permette di deployare facilmente le nostre applicazioni in modalità Serverless usando Amazon AWS Lambda.

La prima domanda che ci dovremmo fare è perché usare risorse in Cloud e soprattutto Serverless, ovvero senza l’ausilio di un server fisico. Dal punto di vista architetturale, quando pensiamo di creare un server per ospitare in modo efficiente un'applicazione, si deve fare i conti con le performance che vogliamo raggiungere e soprattutto sulle logiche di scaling che possiamo applicare in tempi rapidi. Difatti non è raro che le risorse possano saturarsi in tempi brevi o che le connessioni contemporanee possano portare blocchi o rallentamenti temporanei del servizio.
Il Cloud ci permette di superare questi limiti, mettendoci a disposizione strumenti di autoscaling in grado di soddisfare ogni carico e mantenere sempre attivi i servizi di rete e di storage. Oggi il Cloud ci permette di suddividere ogni risorsa in servizi con il vantaggio di scalarli in tempo reale, gestendo il tutto con minore impegno di uomini e tempo.

Esempi di servizi in Cloud possono essere:

  • Storage (AWS S3)
  • Database (AWS  RDS  o Dynamodb)
  • Authentication (AWS Cognito)
  • Search (AWS ElasticSearch - Algolia)
  • Cloud Function as Service (AWS Lambda)

Il concetto di Function as Service si concretizza nella parola Serverless. Le funzioni Lambda ci permettono di eseguire codice e di gestire i vari eventi solo quando una richiesta arriva al nostro endpoint. Usando le Lambda function difatti, le risorse del server vengono scalate dinamicamente in funzione delle richieste permettendo di non stressare un'unica risorsa.
Lambda scala il numero dei containers disponibili in modo automatico per evitare di saturare le risorse e lasciare che il computo della spesa economica sia dinamica e non fissa.

Questo approccio ci dà una serie di vantaggi tecnici evidenti, tra cui non gestire più il server fisico, non gestire le istanze Linux o effettuare la gestione di php-fpm, migliorando la concorrenza di richieste. Paradossalmente Amazon Lambda non supporta PHP e per questo probabilmente è la scelta migliore pensare al suo utilizzo per deployare applicazioni PHP. Per deployare applicazioni PHP tramite Lamba ci viene in soccorso PHP Bref che è un progetto open source che nasce con l’obiettivo di offrire tutti gli strumenti necessari per costruire e gestire applicazioni PHP in ambito Serverless semplificando sicuramente la vita dei programmatori.

Bref ci permette di far girare qualsiasi framework PHP senza distinzioni utilizzando Serverless Framework.
Oltre a questo offre una console di comandi per seguire ad esempio comandi Laravel Artisan o eseguire query tramite Doctrine.

Per utilizzare Bref è necessario ottenere un account Amazon AWS.

Oltre a questo è necessario installare in locale il Serverless Framework via nodejs eseguendo quindi il comando:

npm install -g serverless

A questo punto dobbiamo creare delle credenziali AWS:

 

credenziali_aws.png

Una volta creato l’account ed essersi autenticati sarà necessario aggiungere un utente raggiungendo la  sezione IAM:

Tutorial_1.png

Creiamo successivamente una policy utilizzando un profilo preesistente
(AdministratorAccess)

tutorial_2.png

alla fine scarichiamo le credenziali:

tutorial_3.png

Scaricate le credenziali è necessario salvarle su serverless in modo criptato usando il comando:

serverless config credentials --provider aws --key <key> --secret <secret>

Il terminale ci risponderà:

Profile "default" has been configured.

Siamo quindi pronti a usare Bref per deployare la nostra applicazione.

Installiamo Bref usando composer con il seguente comando:

composer require bref/bref

Al termine eseguiamo il comando di inizializzazione della librerie ovvero:

vendor/bin/bref init

Il terminale ci chiederà le seguenti informazioni:

Tutorial_5.png

In questo caso scegliamo web application usando l’opzione “0”.

Bref creerà un file index.php che rappresenta il nostro endpoint di base e un file chiamato serverless.yml.

Il file serverless.yml rappresenta il file di configurazione dei nostri servizi in Cloud.

tutorial_06

In questo caso abbiamo optato per ospitare l’applicativo in una regione Aws europea

region_eu_central

con una configurazione runtime creata dalla scelta dell’opzione “0” web application precedente sul terminale che rappresenta un runtime di tipo linux php-fpm

runtime_provided_a12

usando come provider aws

name_aws

definiamo quindi dove punteranno tutte le richieste della Lamba ovvero verso lo script index.php utilizzando Api-gateway di AWS (ricordiamo che api-gateway esegue quindi tutti gli script PHP senza l’ausilio di web server (Apache o Nginx) difatti è lo stesso api-gateway che funge da Web Server.)

api_handler_index_php

che utilizzerà un runtime Linux php-fpm con PHP 7.4

runtime_php-fpm_74

Sarà inoltre possibile definire eventuali eventi da automatizzare, nel nostro caso per diminuire il cold start di Lamba faremo in modo da eseguire ogni 5 minuti un evento warmer che eviterà di eliminare tutti i containers abilitati da Lambda per eseguire i processi.

warmer_events

Questo perché Lambda una volta effettuato il cold start mantiene per 10 minuti attivi i containers necessari ed eseguire il processo, dopo questo tempo normalmente distrugge tutti i containers.

Con questa istruzione evitiamo che ciò accada.

Ricordiamo che l’inizializzazione del cold start ci fa perdere circa 200 millisecondi.
Questo delay è in funzione delle risorse di memoria allocate (default 1024mb).

È anche possibile aggiungere funzioni Lambda in modalità event-driven.

Aggiungendo questa porzione di configurazione siamo in grado di eseguire una Lambda su uno script PHP nella nostra applicazione:

aws_lambda_script_php

aggiungendo un file di nome get_time.php nella root della nostra applicazione con il seguente contenuto:

get_time_php

Questo script ci ritornerà il timestamp e salverà una log direttamente su Cloudwatch usando il pacchetto specifico fornito da Bref ovvero bref/logger installabile eseguendo il comando :

composer require bref/logger

Al momento questa configurazione è sufficiente per verificarne il funzionamento, pertanto possiamo anche deployare utilizzando il comando:

serverless deploy
serverless_deploy

Se la procedura viene eseguita normalmente, aws avrà acquisito la configurazione e avrà uploadato i file necessari al funzionamento, Vendor incluso, e avrà creato le nostre funzioni.
Lambda functions permette di caricare 5 layers al massimo di un peso complessivo di 250 mb.
Come vedete ci darà anche un endpoint che rappresenta il nostro base endpoint in questo caso rappresentato da una pagina statica PHP statica. Ma potrebbe essere benissimo un applicazione laravel che gestisce microservizi.

tutorial_14.png

Diamo quindi un'occhiata a questo punto alla console aws per verificare cosa è successo lato Lamba:

tutorial_15.png

Di fatto esistono due nuove funzioni:

  • app-dev-api 
  • app-dev-hello

Nel dettaglio app-dev-api :

  • è esposta grazie al servizio api-gateway
  • è connessa al servizio events bridge che permette di salvare tutte le logs automaticamente su CloudWatch ed esegue il warmer per evitare che i containers vengano distrutti dopo 10 minuti di inutilizzo
  • contiene inoltre il codice dell’applicativo che permetterà di eseguire le funzioni PHP usando se necessario anche le classi legate al vendor.
tutorial_16.png

Nel dettaglio app-dev-hello :

  • non è esposta tramite api-gateway ed è consumabile tramite bref cli o usando gli sdk di aws o può essere usata come qualsiasi altra lamba
  • non è connessa a events bridge
  • contiene lo stesso pacchetto della funzione precedente.
tutorial_16.png

Nel nostro esempio vogliamo eseguirla usando i comandi bref quindi useremo:

vendor/bin/bref cli --region=eu-central-1 app-dev-hello

 

tutorial_17.png

La funzione ha risposto correttamente e ci ritorna il timestamp linux. In questo caso lo script ha anche salvato una logs su CloudWatch pertanto avremo la nostra log disponibile:

tutorial_18.png

In realtà nel nostro esempio abbiamo creato due funzioni Lambda con lo stesso codice che ritengo sia una cosa da evitare, ma per fare capire le potenzialità minime credo sia un esempio appropriato.

Nel nostro esempio abbiamo inoltre indicato di dare i permessi AdministratorAccess al momento di creare l’utente su AWS, ma vi suggeriamo di dare dei permessi minimi facendo riferimento a questo articolo.

Vi ricordiamo che Bref prevede una serie di pacchetti extra e add-on per configurare l'istanza virtuale Linux con usando pacchetti specifici e le sue estensioni e PHP layers. In alternativa, potete usare le estensioni offerte da serverless.com per eseguire particolari azioni.

Commenti finali

Il Cloud ormai è di uso comune e ci permette di avere molto controllo nel creare operazioni e routine complesse con bassi livelli di manutenzione ordinaria e altissima stabilità.

Bref ci aiuta a eliminare le mancanze di Lamba nei confronti di PHP e ci offre molteplici possibilità di lavorare in assenza di una istanza linux fisica.
Performance, scalabilità ed elasticità sono i suoi punti di forza.

Da valutare sicuramente la sicurezza usando magari strumenti come AWS SAM per evitare di dare autorizzazioni a terzi e lasciare gestire il tutto sempre ad AWS.

Per lo sviluppatore moderno sicuramente è uno strumento sul quale sperimentare per mantenere e creare funzioni Lambda con il minimo sforzo ed implementare applicazioni PHP con la potenza del Cloud a costi ridotti.

 

scritto da Giancarlo Rossi - Back End Developer 

Condividi questo articolo

Altre notizie dal blog.

Cantine Ermes.png

22 Aprile 2022 - News

Cantine Ermes, una nuova identità che unisce territorio e culture del vino

l progetto per Cantine Ermes si basa sul ruolo iconico dei suoi territori e prende forma attraverso la definizione dell’intero ecosistema digitale.

Leggi
img-immedia-albero.jpg

24 Dicembre 2021 - News

Un piccolo passo per promuovere la sostenibilità e aiutare l’ambiente

L’attenzione per l’ambiente passa anche dalle piccole cose, come per esempio dalla cura dei propri piccoli spazi verdi.

Leggi
fecarotta nuovo e-commerce

15 Novembre 2021 - News

Uno stile elegante e minimal per il nuovo e-commerce Fecarotta Gioielli

Fecarotta Gioielli rinnova la propria veste digitale e va online con il nuovo e-commerce. Un restyling che punta a raccontare l’identità e i valori di un’azienda made in Sicily in continua crescita ed evoluzione.

Leggi
Easy IM*MEDIA

23 Settembre 2021 - News

Nasce Easy IM*MEDIA

Da 25 anni accompagniamo le aziende nella trasformazione e nella crescita del proprio universo digitale e mai come adesso assistiamo a una sempre maggiore e costante digitalizzazione dei mercati e dei processi aziendali. 

Leggi