Introduzione

Se anche tu, come noi, hai un ambiente di sviluppo dove testare l’applicazione prima di rilasciarla in produzione, allora questo articolo fa per te.
Scopri come risparmiare il 60% dei costi dell’ambiente di sviluppo.

Il problema

Un ambiente di sviluppo (o ambiente di develop) è un ambiente parallelo a quello di produzione, dove si può testare che l’applicazione sia funzionante e che le nuove modifiche sviluppate non abbiano rotto nulla.

Tendenzialmente è un’ambiente che serve agli sviluppatori durante la giornata lavorativa. E qui può sorgere una domanda di per sé stupida, ha senso tenere attivo l’ambiente di sviluppo 24 ore su 24? E se lo si attiva solo durante la giornata lavorativa?

Soluzione

La risposta è semplice, se il team di sviluppo utilizza l’ambiente di develop nella stessa fascia oraria allora ha senso attivare l’ambiente di develop solo durante la giornata lavorativa, per esempio dalle 7 di mattina fino alle 19 di sera (rimanendo larghi, considerando che magari alcuni sviluppatori iniziano prima e altri finiscono dopo il classico orario di lavoro). Se la tua azienda non lavora il sabato e la domenica, allora si può spegnere l’ambiente anche in questi giorni.

Tra poco faremo un esempio su come farlo con AWS.

Ma quanto si risparmia concretamente?

Facciamo due conti semplici insieme: consideriamo un mese da 30 giorni, con 4 fine settimane (quindi 4 sabati e 4 domeniche) e supponiamo che l’ambiente di sviluppo costi 1€ al giorno (lasciato attivo 24 ore su 24).

Quindi senza la soluzione descritta sopra il costo mensile è pari a: 1 €/giorno * 30 giorni = 30 €

Ora supponiamo di attivare l’ambiente di sviluppo dalle 7 alle 19, quindi per un totale di 12 ore, esattamente la metà di un giorno. In questo caso il costo giornaliero dell’ambiente di sviluppo si abbatte a 0,50€.

Supponiamo di non attivare l’ambiente di sviluppo al sabato e alla domenica, visto che nessuno sviluppatore lavora. Quindi da 30 giorni al mese togliamo 4 sabati e 4 domeniche, per un totale di 22 giorni lavorativi.

Quindi il costo finale con la soluzione sopra descritta risulta: 0,50 €/giorno * 22 giorni = 11 €

Siamo passati da 30 € a 11 € con un risparmio del 63 %, risparmiando 19 €.

Lo voglio subito, come si fa?

Prendiamo in analisi AWS, la stessa soluzione è applicabile per tutti gli altri provider di servizi cloud utilizzando i rispettivi servizi equivalenti.

Di cosa abbiamo bisogno?

Facciamo la lista della spesa e vediamo cosa ci serve per realizzare questa soluzione:

  1. Sicuramente ci serve qualcosa per accendere i vari servizi su AWS e sicuramente qualcosa per spegnerli;
  2. Serve qualcosa per schedulare in automatico quanto creato al punto 1, quindi che ogni mattina accenda i servizi e che ogni sera spenga tutto.

Quali servizi posso utilizzare?

Per soddisfare le nostre richieste, ci servono solo due semplici servizi forniti da AWS:

  • Possiamo utilizzare AWS Lambda per accendere e spegnere i vari servizi;
  • Possiamo utilizzare Amazon EventBridge per schedulare le lambda function e quindi accendere i servizi alla mattina e spegnerli alla sera.

Basta chiacchiere, facciamo un esempio!

Facciamo un esempio supponendo di avere un’istanza EC2.

Per altri servizi di AWS cambia solo il codice relativo al singolo servizio, ma la logica che ci sta dietro è la stessa.

Autostart di EC2

Per prima cosa dobbiamo creare un ruolo che abbia i permessi per accedere all’istanza EC2 da assegnare poi alla lambda function.

Creazione di un ruolo per la lambda function

Una volta effettuato l’accesso alla console di AWS utilizziamo il servizio IAM e clicchiamo poi su Roles. Quindi su Create Role.

Dopodiché selezioniamo AWS Service come Trusted entity type e Lambda come Use Case. Quindi clicchiamo su Next.

Crea Ruolo IAM

Scegliamo poi AmazonEC2FullAccess come policy da associare al ruolo.

E infine associamo un nome al ruolo, per esempio example-role.

Finalizzazione ruolo

Creazione della lambda function

Utilizziamo il servizio AWS Lambda e creiamo una nuova funzione cliccando su Create Function. Creiamo una funzione con il template Author from scratch, quindi indichiamo un nome (per esempio example-lambda-autostart) e scegliamo Python 3.9 come runtime. Clicchiamo poi su Change default execution role e utilizziamo il ruolo creato in precedenza (nel nostro caso example-role). Infine clicchiamo su Create Function. Di seguito un’esempio:

Creazione Lambda

Quindi aggiungiamo il seguente codice:

import boto3
import os

def start_ec2():
    region=os.environ['REGION']
    dev_instance=os.environ['EC2_DEV_INSTANCE']
    
    client = boto3.client("ec2", region_name=region)
    
    # start dev instance
    client.start_instances(
        InstanceIds = [dev_instance]
    )

def lambda_handler(event, context):
    start_ec2()

E clicchiamo su Deploy.

Per poter configurare le variabili d’ambiente clicchiamo sulla tab Configuration e poi Environment variables. Quindi aggiungiamo le seguenti variabili:

  • REGION = [nome della tua regione]
  • EC2_DEV_INSTANCE = [id della tua istanza ec2 (Instance ID)]

Configurazione di EventBridge

Per poter eseguire in automatico la lambda function ad una certa ora di un certo giorno è possibile utilizzare EventBridge, aggiungendo una schedulazione.

Quindi andiamo al servizio EventBridge. Quindi clicchiamo su Create rule.

Inseriamo un nome e selezioniamo la modalità Schedule. Clicchiamo su Next.

Creazione regola Event Bridge

Definiamo ogni quanto eseguire la lambda function. Supponiamo di eseguire la funzione ogni mattina alle 7, solo nei giorni lavorativi (quindi da lunedì a venerdì). Quindi inseriamo in cron il seguente valore: 0 7 ? * MON,TUE,WED,THU,FRI *. Clicchiamo quindi su Next.

NB: Il cron verrà eseguito all’orario UTC, quindi considerate un eventuale fuso orario.

Schedulazione regola Event Bridge

Selezioniamo ora quale tipo di servizio eseguire ogni mattina alle 7. Nel nostro caso la lambda function creata in precedenza. Quindi selezioniamo il servizio Lambda Function e indichiamo il nome della nostra funzione. Quindi clicchiamo su Next.

Impostazione Lambda in regola Event Bridge

Nella sezione relativa ai tag clicchiamo su Next.

Impostazione tags regola Event Bridge

E infine clicchiamo su Create Rule.

Finalizzazione regola Event Bridge

Ottimo! A questo punto ogni mattina alle 7 da lunedì a venerdì verrà eseguita la lambda function che abbiamo indicato.

Autostop di EC2

Lambda function

Il processo è identico a quello appena descritto a meno del codice e dell’orario di EventBridge. Quindi creiamo una nuova lambda function (con lo stesso ruolo creato in precedenza). Il codice da eseguire è il seguente:

import boto3
import os

def stop_ec2():
    region=os.environ['REGION']
    dev_instance=os.environ['EC2_DEV_INSTANCE']
    
    client = boto3.client("ec2", region_name=region)
    
    # stop dev instance
    client.stop_instances(
        InstanceIds = [dev_instance]
    )

def lambda_handler(event, context):
    stop_ec2()

EventBridge

Creiamo quindi una nuova regola su EventBridge, questa volta invece impostiamo come orario la sera alle 19 da lunedì a venerdì. Quindi nel campo cron inseriamo: 0 19 ? * MON,TUE,WED,THU,FRI *.

Conclusioni

Abbiamo visto un semplice esempio su come accendere e spegnere un’istanza EC2 in modo da risparmiare soldi per quanto riguarda l’ambiente di sviluppo. Chiaramente è possibile applicare lo stesso concetto a tanti altri servizi di AWS, per esempio ECS, RDS, LoadBalancer, ElasticCache, ecc…

Se vuoi vedere altri esempi di altri servizi AWS scrivicelo nei commenti!

Scrivici anche cosa ne pensi e se hai provato anche tu a risparmiare il 60% dei costi dell’ambiente di sviluppo.

Extra

Se vuoi applicare lo stesso concetto visto sopra al servizio RDS, sul blog di AWS puoi trovare questo articolo dove spiegano molto bene come fare.

Il link è all’articolo è: Schedule Amazon RDS stop and start using AWS Lambda