CloudWatch è il principale servizio di monitoraggio degli eventi nel Cloud AWS, con il quale è possibile raccogliere log e dati in tempo reale, questi dati vengono poi resi disponibili in un pannello di controllo nella console web, studiata per la manutenzione dell’infrastruttura e delle applicazioni in esecuzione. Con CloudWatch e le sue funzionalità di Log e Alarm, è possibile ridurre al minimo la logica da programmare per il monitoraggio, avendo a disposizione un sistema molto robusto e flessibilo.
Il servizio si basa su alcuni concetti:
- Log: un registro di log proveniente da tutti gli altri servizi, i dati vengono strutturati in Namespace e metriche
- Namespace: è un contenitore di metriche che risultano separate
- Metric: rappresenta un insieme di dati in ordine temporale pubblicati su CloudWatch, vengno rappresetnate come variabili da monitorare (a volte il termine Metric viene tradotto in italiano con la parola Parametro)
- Dashboard: nella console web è disponibile un pannello di controllo personalizzabile con il quale è possibile monitorare il sistema e gli eventi passati
- Alarm: dalle metriche si possono creare allarmi che generano eventi in base ad eventi. L’allarme più semplice consiste nell’avvisare persone inviando un messaggio quando si verifica un evento registrato in una metrica
- CloudWatch agent: sistema per inserire log in Metric provenienti da sistemi esterni al sistema Cloud AWS.
Nella documentazione ufficiale è presente uno schema che descrive il funzionamento del servizio:
Bisogna prestare attenzione quando viene usato questo servizio in quanto non è gratuito visto che alcune funzionalità sono a pagamento in base all’uso e in base a quante query vengono eseguite nel motore che gestire log ed eventi, è consigliato leggere attentamente la pagina ufficiale.
La CLI mette a disposizione una serie di comandi per la gestione di comandi, la documentazione ricca di esempi è sempre il punto di riferimento princpale. I comandi principali per gestire le metriche si basano sul comando:
aws cloudwatch list-metrics --namespace "AWS/Lambda"
Per gestire gli allarmi è possibile recupeare la lista con i comandi:
aws cloudwatch describe-alarms aws cloudwatch describe-alarms --alarm-names "nome-alarm"
Per scatenare un allarme è possibile usare lo stesso comando con dei parametri specifici:
aws cloudwatch set-alarm-state --alarm-name "nome-alarm" --state-value ALARM --state-reason "testing purposes"
La gestione dei log da riga di comando può essere scomoda a causa della numerosità dei log comunque esiste il comando per recuperare l’elenco dei gruppi di log e i singoli eventi salvati nel registro con la possibilità di filtrare per pattern e orario del log:
aws logs describe-log-groups aws logs filter-log-events --log-group-name /aws/lambda/nome-lambda aws logs filter-log-events --log-group-name /aws/lambda/nome-lambda --filter-pattern ERROR aws logs filter-log-events --log-group-name /aws/lambda/nome-lambda --start-time 1688977737000 --end-time 1688977738000 aws logs filter-log-events --log-group-name /aws/lambda/nome-lambda --output text
Con CloudFormation è possibile gestire i log e i permessi che le varie risorse devono avere per scrivere nei log, per esempio in un template per la creazione di una lambda, oltre alla creazione della Lambda, nella sua execution role creata come regola IAM è necessario aggiungere la policy per permettere alla funzione di creare il gruppo di log e a scriverci, un semplice e classico esempio è:
LambdaIamRole: Type: 'AWS::IAM::Role' Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - 'sts:AssumeRole' Path: / Policies: - PolicyName: root PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - 'logs:CreateLogGroup' - 'logs:CreateLogStream' - 'logs:PutLogEvents' Resource: 'arn:aws:logs:*:*:*'
Tramite CloudFormation è possibile anche creare Allarmi, Dashboard e Metriche, la documentazione ufficiale è completa e ricca di esempi, per la gestione dei log è disponibile una pagina dedicata.
La libreria SDK mette a disposizione una libreria per la gestione del servizio CloudWatch, dei log, degli alert e delle metriche tramite la solita libreria boto3. Le principali funzionalità sono recuperare la lista delle metriche disponibili ed eseguire una query su una metrica per recuperare la lista dei log degli eventi:
def get_metrics(profile_name): boto3.setup_default_session(profile_name=profile_name) cloudwatch = boto3.client('cloudwatch') lista=[] paginator = cloudwatch.get_paginator('list_metrics') for response in paginator.paginate( Dimensions=[{'Name': 'LogGroupName'}], MetricName='IncomingLogEvents', Namespace='AWS/Logs'): lista=lista+response['Metrics'] return lista def get_metric_group_log(profile_name,group_name): # Create CloudWatchLogs client boto3.setup_default_session(profile_name=profile_name) cloudwatch_logs = boto3.client('logs') # List subscription filters through the pagination interface paginator = cloudwatch_logs.get_paginator('describe_log_groups') lista=[] for response in paginator.paginate(logGroupNamePrefix=group_name): lista=lista+response['logGroups'] #for i in response['logGroups']: #print(i['logGroupName']) return lista def get_metric_log(profile_name,group_name,hours): boto3.setup_default_session(profile_name=profile_name) cloudwatch_logs = boto3.client('logs') query = "fields @timestamp, @message" start_query_response = cloudwatch_logs.start_query( logGroupName=group_name, startTime=int((datetime.today() - timedelta(hours=hours)).timestamp()), endTime=int(datetime.now().timestamp()), queryString=query, ) query_id = start_query_response['queryId'] response = None while response == None or response['status'] == 'Running': #print('Waiting for query to complete ...') time.sleep(1) response = cloudwatch_logs.get_query_results( queryId=query_id ) return response["results"]
L’icona del servizio è proprio il logo del sito