Pubblicato il 16/09/2023 da alnao nella categoria AWS

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

MENU