Come avviare e arrestare un'istanza Aurora in maniera automatica con AWS Lambda
I costi della tua istanza Aurora aumentano facilmente, e non tutte le istanze del database hanno necessità di essere sempre operative: come risparmiare sulle ore di utilizzo delle istanze, sfruttando Lambda?
Vediamo quali sono i passaggi per consentire a una funzione AWS Lambda di avviare e/o arrestare un’istanza Amazon Aurora.
Crea una policy IAM
È necessario creare una policy IAM che conceda le autorizzazioni necessarie per avviare e arrestare le istanze Aurora. La policy deve includere le azioni rds:StartDBCluster
e rds:StopDBCluster
, che sono proprio quelle che ci permetteranno di avviare e arrestare le risorse.
Ecco un esempio di come potrebbe essere la policy per arrestare l’istanza del database del cluster:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds:StartDBCluster",
"rds:StopDBCluster"
],
"Resource": "arn:aws:rds:<region>:<account-id>:db:<db-cluster-name>"
}
]
}
Ovviamente, dobbiamo sostituire i campi <region>
, <account-id>
e <db-cluster-name>
con i dettagli dell’account e della region in cui si trova il cluster.
Crea un ruolo tramite IAM
A questo punto, avendo la policy pronta, dobbiamo permettere a Lambda di sfruttarla: creiamo un ruolo IAM affinché la funzione Lambda possa essere “delegata” ad eseguire queste operazioni.
- Apri la console IAM.
- Nel riquadro di navigazione, scegli Ruoli.
- Scegli Crea ruolo.
- Seleziona Servizio AWS come entità attendibile e scegli Lambda.
- Allega la policy creata nel passaggio precedente.
- Completa la creazione del ruolo.
Assegna il ruolo IAM alla funzione Lambda
Quando crei o aggiorni la tua funzione Lambda, assegna il ruolo IAM che hai creato:
- Nella console Lambda, vai alla tua funzione.
- In Configurazione, scegli Autorizzazioni.
- Scegli Modifica e seleziona il ruolo IAM che hai creato.
L’alternativa, è quella di associare la precedente policy a quello che è il ruolo di esecuzione della Lambda.
Scrivi il codice della funzione Lambda
Passiamo alla scrittura della Lambda: è possibile usare l’SDK AWS che supporta diversi linguaggi, tra cui Node.js e Python con le rispettive librerie. In questo caso, useremo boto3 per Python per avviare l’istanza Aurora.
Per farlo, sfruttiamo la funzione lambda_handler per creare una variabile che ospiterà il client necessario alla comunicazione con RDS e quindi Aurora. Poi, sfruttiamo le API di RDS per chiamare la funzione start_db_cluster che, tramite l’ID del Cluster, possa avviare il cluster:
import boto3
def lambda_handler(event, context):
rds_client = boto3.client('rds')
response = rds_client.start_db_cluster(
DBClusterIdentifier='your-db-cluster-name'
)
return response
E per arrestare un cluster? La procedura è del tutto simile:
import boto3
def lambda_handler(event, context):
rds_client = boto3.client('rds')
response = rds_client.stop_db_cluster(
DBClusterIdentifier='your-db-cluster-name'
)
return response
Testa la funzione
Dopo aver eseguito il deploy della funzione Lambda per avere la certezza che le modifiche siano state salvate correttamente, è possibile testarla per assicurarti che avvii l’istanza Aurora come previsto.
Se invece vuoi che l’avvio o lo spegnimento avvengano in maniera automatica, è possibile impostare CloudWatch Events o EventBridge per pianificare l’esecuzione della funzione Lambda. Un esempio di come creare una regola e la relativa schedulazione, puoi dare un’occhiata a questo post.