La crescente offerta di prodotti e servizi tecnologici crea una forte e sana competizione tra le aziende del settore. Dietro le quinte, Big Tech e piccole startup sono quotidianamente protagoniste di una gara all’ultima release per garantire nuove funzionalità, una migliore user experience e maggiore sicurezza per le loro applicazioni. Ma proviamo a metterci nei panni di uno sviluppatore: come fare a garantire time-to-market rapidi e release stabili in modo continuo? A questo scopo, da qualche tempo si è diffusa una metodologia di lavoro che prende il nome di DevOps, un approccio programmatico che permette ai team di orchestrare l’intero di processo di sviluppo, testing e rilascio delle applicazioni in modo schematico ed automatizzato. Scopriamo insieme di cosa si tratta.

DevOps: una definizione

L’approccio DevOps è un’evoluzione del modello Agile, da cui trae alcune caratteristiche come l’essere iterativo e automatizzato, ed è focalizzato sulla collaborazione tra i team di sviluppo (Dev) e quello delle operazioni (Ops). Nelle parole di Donovan Brown, Cloud Advocate Manager of Methods and Practices di Microsoft Azure, DevOps è:

“L’unione di persone, processi e prodotti che permette una continua distribuzione di valore agli utenti finali”

E continua:

Sono molto preciso nei termini utilizzati in questa definizione. Ho scelto valore e non software. DevOps non è soltanto automatizzare una pipeline in modo da distribuire velocemente il software. Il nostro obiettivo è distribuire valore. Anche il termine utenti è stato scelto accuratamente. Il valore che produciamo deve raggiungere i nostri utenti […]

Ricapitolando, i concetti chiave sono:

  • Persone;
  • Processi;
  • Prodotti;
  • Valore.

Dunque, le persone (i team Dev e Ops) devono collaborare ed avere gli stessi obiettivi; i processi (sviluppo, test, release, monitoring) devono essere pianificati e automatizzati; i prodotti (GitHub, Visual Studio Code ecc…) sono tecnologie che permettono alle persone di collaborare e ai processi di essere automatizzati. Il valore, infine, è ciò che arriva agli utenti finali (nuove feature, maggiore sicurezza, UI migliorata etc.) ed è l’elemento che conta di più, in quanto senza quel valore aggiunto lo stesso approccio DevOps non avrebbe senso di esistere.

Ma quali sono le fasi dell’approccio DevOps?

Le fasi DevOps in un circolo continuo

Le fasi DevOps

L’approccio DevOps è suddiviso in diverse fasi, ognuna propedeutica all’altra in un flusso continuo di lavoro. Nonostante sia un approccio ben strutturato, esistono diversi modi e strumenti per metterlo in pratica. Qui di seguito viene descritto l’approccio e gli strumenti che utilizziamo qui a CTMobi.

Le fasi DevOps sono:

  1. Infrastruttura come codice (Infrastructure as Code);
  2. Integrazione continua (Continuous Integration);
  3. Testing continuo (Continuous Testing);
  4. Distribuzione Continua (Continuous Delivery);
  5. Monitoraggio Continuo (Continuous Monitoring);

Analizziamole singolarmente nel dettaglio per capire come funzionano.

Infrastructure as code

Uno dei pilastri del DevOps è sicuramente l’infrastructure as code. Per infrastructure as code si intende “trattare l’infrastruttura allo stesso modo in cui viene trattato il codice di un’applicazione“. Ma cosa vuol dire concretamente? Facciamo un esempio: il codice di un’applicazione possiede determinate caratteristiche:

  • Formato: ha un formato ed una sintassi definita e se non è scritto rispettando le regole del linguaggio di programmazione, l’applicazione non può funzionare.
  • Versioning: il codice viene conservato in un sistema di controllo versione che conserva la cronologia delle modifiche al codice.
  • Affidabilità: quando il codice viene compilato ci aspettiamo che l’applicazione venga creata coerentemente al codice, e che la build sia ripetibile ed affidabile.

Praticare l’infrastructure as code vuol dire applicare queste stesse regole al provisioning delle infrastrutture. Ma in che modo? Attraverso la costruzione di documenti che contengono una descrizione delle risorse cloud da utilizzare ed i loro eventuali collegamenti.

Ecco un esempio concreto di Infrastructure as Code in formato YAML per AWS CloudFormation:

Questo semplice file di testo crea uno stack CloudFormation che contiene un’istanza EC2 (cos’è un’istanza EC2? Scoprilo in questo articolo dedicato) con un volume EBS attaccato. Immaginate adesso di poter fare la stessa cosa per architetture molto più complesse: ambienti di test, staging o produzione, tutto in modo pressoché istantaneo.

Quali sono i vantaggi dell’infrastructure as code:

  • Riduzione degli errori: creare un’infrastruttura cloud manualmente può comportare tutta una serie di errori umani che impediscono all’infrastruttura stessa di funzionare come dovrebbe. L’infrastructure as code elimina questo problema perché permette di creare infrastrutture partendo da un documento ben definito, come quello che abbiamo visto sopra.
  • Versioning dell’infrastruttura: analogamente al codice di un’app, l’infrastructure as code permette di avere un controllo versione sull’infrastruttura, grazie al quale possiamo rivedere o ripristinare tutte le modifiche fatte nel corso del tempo.
  • Velocità: costruire un’infrastruttura cloud complessa in modo manuale può essere molto dispendioso in termini di tempo. Macchine EC2, Database, Storage: tutto deve essere collegato nel modo corretto. Con l’infrastructure as code, il provisioning dell’infrastruttura viene eseguito con un semplice click.

Alcuni strumenti dell’infrastructure as code:

CloudFormation

CloudFormation è un servizio AWS che utilizza template per automatizzare il setup di risorse AWS. I template, che possono essere scritti in JSON o YAML, richiedono una sintassi specifica che dipende dai tipi di risorse create e gestite. Puoi scrivere le risorse in qualsiasi editor di codice, controllarlo in un sistema di controllo versione e CloudFormation creerà quegli specifici servizi in modo sicuro e ripetibile.

Come funziona AWS CloudFormation

Alcuni vantaggi di CloudFormation:

  • Automazione: l’approccio IaC garantisce tempi di deploy molto più rapidi rispetto ad un setup manuale tramite CLI (Command Line Interface) o l’AWS Console. Crea un file con la tua infrastruttura e lanciala tutte le volte che vuoi, in pochi secondi ed in tutto il mondo (l’infrastruttura globale di AWS: scopri cosa sono Region e Availability Zone).
  • Affidabilità: quando usi i template di CloudFormation per definire e distribuire risorse AWS, puoi utilizzare la stessa configurazione ripetutamente. I template ti garantiscono che tutte le tue applicazioni e servizi saranno identici, indipendentemente dal numero di architetture che crei.
  • Sicurezza: quando crei risorse AWS manualmente è sempre possibile incorrere in errori umani, ad esempio lasciare dei dati esposti al pubblico o dimenticare di impostare il controllo degli accessi. I template di CloudFormation ti permettono di avere un livello di sicurezza in più automatizzando la creazione delle risorse ed utilizzando sempre le giuste impostazioni (a patto che tu abbia creato il template in modo corretto 🙂 )

CDK: Cloud Development Kit

AWS Cloud Development Kit (CDK) è un framework per la creazione e distribuzione delle risorse AWS che usa i linguaggi di programmazioni comuni, ad esempio TypeScript, Python, Java e .NET. Grazie a CDK i developer possono utilizzare i loro IDE preferiti, sfruttando strumenti come l’autocompletamento e la documentazione in-line per accelerare lo sviluppo di infrastrutture cloud su AWS.

Come funziona AWS CDK

Alcuni vantaggi di CDK:

  • Semplicità: puoi creare risorse AWS senza abbandonare il tuo IDE, utilizzando il tuo linguaggio di programmazione preferito. Grazie a queste caratteristiche diventa semplicissimo, anche per i meno esperti, creare e configurare risorse AWS.
  • Velocità: Le funzioni familiari come oggetti, cicli e condizioni ti permetteranno di configurare più velocemente la tua architettura. E dato che puoi usare CDK dal tuo IDE, puoi sempre sfruttare tutti i tool di produttività ed framework che usi di solito.

SAM: Serverless Application Model

AWS Serverless Application Model (SAM) è un framework open source per costruire applicazioni serverless. Grazie alle sue direttive per esprimere funzioni, API, database e mappature di origini eventi, permette di distribuire applicazioni serverless risparmiando molte righe di codice. Durante la distribuzione, SAM trasforma ed espande la sintassi SAM nella sintassi di CloudFormation, consentendoti di creare applicazioni serverless più velocemente.

AWS SAM: Serverless Application Model

Alcuni vantaggi di SAM:

  • Semplifica e velocizza: AWS SAM rende più semplice la distribuzione di applicazioni serverless. Ad esempio, possiamo inserire la path locale di una funzione lambda (cos’è una funzione Lambda? Scoprilo in questo articolo dedicato) ed il payload (il codice da eseguire) viene automaticamente distribuito su un bucket S3 e referenziato all’interno della funzione lambda. Dunque semplifica e velocizza lo sviluppo, il testing e la distribuzione delle applicazioni serverless.
  • Integrato con CloudFormation: AWS SAM è un’estensione di AWS CloudFormation, dunque puoi utilizzare le stesse funzionalità di distribuzione affidabili di CloudFormation.
  • Configurazione single-deployment: AWS SAM semplifica l’organizzazione di componenti e risorse correlate e l’operatività su un unico stack. Puoi utilizzare AWS SAM per condividere la configurazione (come memoria e timeout) tra le risorse e distribuire tutte le risorse correlate insieme come un’unica entità con versione.

Passiamo adesso ad analizzare la prossima fase dell’approccio DevOps, la Continuous Integration.

Continuous Integration

La Continuous Integration è la pratica di automatizzare l’integrazione dei cambiamenti del codice, ovvero eseguire merge dei cambiamenti regolari (più volte al giorno) in una repository centrale. Ogni modifica deve superare un processo di build e test prima di essere pronta alla distribuzione. Grazie a questo approccio diventa molto più semplice trovare e gestire i bug, migliorare la qualità del codice e ridurre il tempo necessario a validare e rilasciare gli aggiornamenti software.

Quali sono i vantaggi della Continuous Integration:

  • Migliora la qualità del software: gli aggiornamenti continui e misurati permettono di identificare errori, inefficienze e vulnerabilità in anticipo. Questo garantisce una qualità del codice complessivamente maggiore rispetto al tradizionale approccio di sviluppo.
  • Riduce i rischi: gli aggiornamenti piccoli e incrementali, definiti anche atomic coding, permettono di verificare con maggiore facilità se il nuovo codice funziona come dovrebbe ed in caso contrario permette di eliminarlo facilmente.
  • Aumenta la produttività: la continuous integration permette di avere una più chiara comprensione del progetto da parte dei team e grazie ai sistemi di automazione in campo i developer possono focalizzarsi sulle cose importanti, diventando più produttivi ed efficienti.
  • Aumenta la fiducia: implementare una pipeline di continuous integration aumenta il livello di fiducia dei tuoi clienti perché i processi standardizzati di sviluppo e rilascio ti permettono di garantire time-to-market rapidi per tutte le nuove feature richieste.

Alcuni strumenti della Continuous Integration:

AWS CodeCommit

AWS CodeCommit è un sistema di controllo sorgente sicuro, altamente scalabile e gestito che consente l’hosting delle repository git private. Con AWS CodeCommit elimini la necessità di installare, configurare e gestire il tuo sistema di controllo sorgente. 

Uno screenshot di AWS CodeCommit

Alcuni vantaggi di AWS CodeCommit sono:

  • Collaborazione: CodeCommit è pensato per lo sviluppo collaborativo del codice. Puoi esegure facilmente commit, branch e fare il merge del codice mantenendo un totale controllo sui progetti del tuo team;
  • Cifratura: Puoi trasferire i tuoi file da e verso AWS CodeCommit utilizzando HTTPS o SSH. Le repository sono inoltre automaticamente cifrate attraverso l’AWS Key Management Service (KMS);
  • Controllo degli accessi: CodeCommit utilizza AWS Identity and Access Management (IAM) per controllare e monitorare chi può accedere ai tuoi dati oltre che come, quando e dove possono accedere;
  • Alta Disponibilità e Durabilità: CodeCommit conserva i tuoi repository in Amazon S3 ed DynamoDB. I tuoi dati cifrati sono conservati in modo ridondante attraverso più datacenter;
  • Notifiche: Puoi ricevere delle notifiche per eventi che riguardano le tue repository. Le notifiche vengono fornite dal servizio Amazon Simple Notification Service (SNS), ed ogni notifica conterrà un messaggio di status con un link alla risorsa che ha generato la notifica.

AWS CodeBuild

AWS CodeBuild è un sistema di Continuous Integration completamente gestito che compila il codice sorgente, esegue test e produce pacchetti software pronti da distribuire. Non hai bisogno di pianificare, gestire e scalare i tuoi build server: CodeBuild scala automaticamente e può processare più build contemporaneamente. CodeBuild può anche creare dei report per unit, functional o integration test. Questi report ti permettono di avere una panoramica visiva di quanti test sono stati eseguiti e quanti sono passati e falliti.

Come funziona AWS CodeBuild

Alcuni vantaggi di CodeBuild:

  • Pagamento on-demand: anziché pagare per un build server spesso inattivo, con CodeBuild paghi esclusivamente per i minuti di utilizzo del servizio.
  • Build parallele: CodeBuild scala automaticamente in base all’uso. Questo vuol dire che puoi processare più build contemporaneamente senza aspettare che vengano messe in coda.

Passiamo adesso alla prossima fase DevOps, il Continuous Testing.

Continuous Testing

Nel Continuous Testing il software sviluppato viene testato continuamente grazie ad alcuni tool di automazione che permettono di identificare bug e difetti del codice in anticipo.

Quali sono i vantaggi del Continuous Testing:

  • Review rapida: l’automazione del testing, componente essenziale di una pipeline Continuous Integration/Continuous Delivery (CD/CI), facilita il lavoro dei reviewer permettendo loro di capire quali sono le porzioni di codice da rivedere.
  • Feedback azionabili: questo approccio permette di avere dei feedback azionabili per ogni stage della pipeline di rilascio.

Passiamo adesso alla quarta fase DevOps.

Continuous Delivery

La Continuous Delivery è il processo automatizzato che porta le modifiche all’applicazione in un ambiente (di produzione, staging etc.). Quando viene eseguita nel modo corretto, i Developer hanno sempre una build pronta che è passata attraverso una serie di test standardizzati. Questi test possono includere unit testing, load testing, integration testing, API reliability testing solo per citarne alcuni.

Alcuni vantaggi del Continuous Delivery:

  • Velocità: il delivery automatizzato aiuta le aziende ai rispondere più velocemente ai cambiamenti di mercato, permettendo di introdurre nuove feature rapidamente.
  • Produttività: la produttività aumenta nel momento in cui puoi automatizzare la maggior parte delle attività ripetitive, come compilare un bug report o testare uno specifico aspetto di una build.
  • sostenibilità: questo approccio permette di lavorare in modo intelligente delegando il lavoro ripetitivo alle macchine. In questo modo le aziende possono risparmiare tempo e denaro concentrandosi sugli aspetti fondamentali dei loro prodotti e servizi.

Alcuni strumenti del Continuous Delivery:

AWS CodeDeploy

AWS CodeDeploy è un servizio di deployment completamente gestito che automatizza la distribuzione del software ad una varietà di servizi di computing come Amazon EC2, AWS Fargate, AWS Lambda, o i tuoi server on-premise. CodeDeploy rende più semplice rilasciare nuove feature, ti aiuta ad evitare il downtime durante il deployment delle applicazioni e gestisce la complesse attività di update delle tue applicazioni.

Come funziona AWS CodeDeploy

Alcuni vantaggi di CodeDeply sono:

  • Controllo centralizzato: CodeDeploy ti permette di lanciare e tracciare facilmente lo stato dei tuoi deployment attraverso l’AWS Management Console o l’AWS CLI.
  • Downtime minimizzato: CodeDeploy aiuta a massimizzare la disponibilità della tua applicazione durante il processo di deployment. Introduce i cambiamenti in modo incrementale e traccia la salute dell’applicazione in base a regole configurabili. I deployment possono essere facilmente fermati e riportati indietro se ci sono errori.
  • Semplice da adottare: CodeDeploy funziona con qualsiasi applicazione e ti assicura la stessa esperienza attraverso diverse piattaforme e linguaggi. CodeDeploy può anche integrarsi con i tuoi processi di release software o continuous delivery toolchain (ad es. AWS CodePipeline, GitHub, Jenkins).

CodePipeline

AWS CodePipeline è un servizio che ti permette di orchestrare tutto il processo di Continuous Integration/Continuous Delivery della tua applicazione, eseguendo i test e rilasciandola nei vari ambienti. Puoi integrare gli strumenti degli APN Partner o i tuoi strumenti personalizzati in qualunque stage del processo di release per formare una soluzione end-to-end di continuous delivery.

Come funziona AWS CodePipeline

Alcuni vantaggi di CodePipeline:

  • Distribuzione rapida: AWS CodePipeline automatizza il tuo processo di release software, permettendoti di rilasciare nuove feature molto più rapidamente.
  • Migliore qualità: automatizzando le build, i test ed il processo di release, CodePipeline ti permette di aumentare la velocità e la qualità dei tuoi update facendo passare i cambiamenti attraverso un preciso set di controllo qualità.
  • Semplice da integrare: AWS CodePipeline può estendersi per adattarsi alle tue necessità. Puoi utilizzare i plugin preinstallati o i tuoi plugin personalizzati in ogni step del processo di release.

Ultima ma non meno importante fase DevOps, il Continuous Monitoring.

Continuous Monitoring

Nel paradigma DevOps, il continuous monitoring è quell’insieme di processi e tecnologie che permettono ai team di Developer e Operations di monitorare costantemente il corretto funzionamento di applicazioni e servizi. A differenza del passato, in cui si svolgevano test periodici e mirati, nel DevOps il processo di monitoring è continuo grazie ad alcuni software che permettono di verificare ed informare in tempo reale gli addetti ai lavori rispetto a criticità e malfunzionamenti.

Alcuni vantaggi del Continuous Monitoring:

  • Rapidità: grazie agli strumenti del continuous monitoring, i team di developer e operations possono essere informati istantaneamente sulle criticità delle loro applicazioni ed agire rapidamente.
  • Performance tracking: gli strumenti del continuous monitoring permettono di tracciare le performance delle applicazioni e comprendere in tempo reale se tutto va come pianificato.
  • Sicurezza: grazie agli strumenti di continuous monitoring, possiamo identificare in tempo reale se vi è in corso una violazione di sicurezza o un attacco hacker ai sistemi dell’applicazione, attivando una risposta immediata dei diversi team per mitigare gli eventuali danni.

Alcuni strumenti del Continuous Monitoring:

CloudWatch

Amazon CloudWatch è un servizio che permette di controllare in tempo reale lo stato delle tue applicazioni. Può essere utilizzato per impostare degli allarmi che avvisano gli addetti ai lavori di comportamenti anomali o performance al di sotto delle aspettative o per monitorare i costi AWS (come tenere sotto controllo i Costi AWS: leggi l’articolo dedicato). Grazie a questi allarmi, i team di developer e operations possono essere sempre al corrente di ogni evento che impatta significativamente il funzionamento delle app.

Come funziona AWS CloudWatch

Alcuni vantaggi di CloudWatch:

  • Allarmi: puoi impostare degli allarmi basati sulle metriche raccolte da Amazon CloudWatch. Gli allarmi possono inviare una notifica tramite Amazon SNS o avviare azioni di autoscaling.
  • Dashboard: CloudWatch offre delle potenti Dashboard che permettono di visualizzare le prestazioni e l’utilizzo delle risorse cloud in un’unica piattaforma. Questo ti permette di agire in tempo reale su ciò che non va e di avere una panoramica complessiva dell’uso delle risorse sempre a portata di mano.

CloudTrail

Amazon CloudTrail è un servizio che crea dei file di log di tutte le chiamate API alle tue risorse AWS. In questo modo puoi tracciare chi fa le richieste, quali sono i servizi usati, quali azioni ha eseguito, i relativi parametri e le risposte restituite dal servizio. I file di log vengono conservati su un bucket S3 e sono sempre accessibili tramite la console di CloudTrail o l’AWS CLI. Grazie alla cronologia delle attività, i team possono rilevare attività sospette, monitorare le modifiche alle risorse e fare rapide analisi di sicurezza.

Come funziona AWS CloudTrail

Alcuni vantaggi di CloudTrail:

  • Log: CloudTrail crea dei log di ogni attività che ti permettono di avere una panoramica sullo stato di sicurezza e sull’integrità delle tue risorse AWS e delle tue applicazioni. I log sono facilmente accessibili tramite la console dedicata di CloudTrail o l’AWS CLI.
  • Automazione: grazie all’integrazione con CloudWatch, puoi impostare delle automazioni che ti permettono di eseguire determinate azioni in base ad eventi specifici tracciati da CloudTrail. In questo modo aumenti il livello di sicurezza delle tue applicazioni perché hai un controllo in tempo reale degli eventi legati alle tue risorse.

Conclusione

L’approccio DevOps permette ai team di avere una visione olistica dei progetti, e dunque un controllo totale su tutte le fasi che li riguardano. Le aziende sono quindi in grado di garantire nuove feature, bug fix e update di sicurezza con time-to-market rapidi, rimanendo sempre al passo con il panorama costantemente mutevole della tecnologia.

CTMobi è AWS Partner

Costruiamo insieme il tuo successo

[mautic type=”form” id=”3″]

[mautic type=”focus” id=”17″]

Ascolta l'articolo

CTMobi s.r.l.

P.IVA 05039070874