Pubblicato il 07/10/2023 da alnao nella categoria AWS

EventBridge è il servizio AWS per la schedulazione di eventi nel Cloud, come un registro tecnico di eventi programmati prevede due tipi di eventi a frequenza oppure ad evento. Questo servizio è stato creato da pochi anni, precedentemente si trovata come funzionalità all’interno di CloudWatch infatti nella console web di è ancora presente il link “Events roles” che rimanda dal vecchio servizio alla nuova versione. Nella descrizione principale del servizio si indica che EventBridge è un servizi di tipo serverless che collega altri servizi AWS tramite l’esecuzione di eventi, in questo caso il termine serverless indica che non è necessario preoccuparsi del server dove è eseguito l’evento, a quello ci pensa AWS, l’unico onere dell’utente è creare la regola indicando il tipo di evento e la sua destinazione.

Semplificando al massimo il funzionamento del servizio, nel tipo di eventi ad evento si può impostare che venga eseguito ad orario prefissato con una certa frequenza attraverso una regola chiamata Cron (simile alle regole CronTab dei sistemi UniX/Linux). La descrizione completa del funzionamento del servizio è spiegato nell’immagine presa dal sito ufficiale dove è possibile identificare che gli eventi sono generati da una sorgente (crontab o da altri servizi), questi eventi vengono elaborati da un bus e inviati ad un servizio AWS di destinazione come funzioni Lambda, SNS o altri servizi AWS.

Tutte le esecuzioni degli eventi regolati con EventBridge vengono salvate come log nel servizio dedicato CloudWatch, attraverso la console web è possible recuperare l’elenco di tutti gli eventi e i dettagli di ogni esecuzione se il servizio è attivo. Due classici casi d’uso di uso di questo servizio che verranno esposti nei prossimi esempi di codice: eseguire una Lambda Function ogni giorno ad una certa ora e eseguire la Lambda Function ogni volta che viene caricato un file in un bucket S3. Se si vuole usare il servizio EventBridge per la gestione degli eventi di bucket S3 bisogna ricordare che c’è una configurazione da attivare nelle proprietà del singolo bucket, senza questa configurazione gli eventi non saranno trasmessi ad EventBridge e non ci sarà nessun log di errore (chi scrive ha perso ore per capire il motivo di eventi non scatenati senza errori), si rimanda alla documentazione ufficiale per maggiori informazioni.

Per gli eventi di tipo schedulato è necessario configurare la frequenza di lancio dell’evento, sono previsti due tipi: ogni X minuti oppure una regola specifica Cron:


Se si vuole gestire con EventBridge gli eventi generati dal servizio S3 è necessario abilitare il singolo bucket a inviare gli eventi a EventBridge con una opzione specifica, nella documentazione ufficiale sono spiegati i passi da eseguire: nella console web, nella pagina di dettaglio di un bucket è presente un opzione per abilitare o disabilitare il collegamento tra i due servizi.

Senza questa configurazione il bucket non invia ad EventBridge gli eventi e non ci sarà nessun log o errore a segnalare la cosa, chi scrive questi articoli ha perso molto tempo a causa di questo piccolo dettaglio, il consiglio è di attivare sempre questa opzione che purtroppo di default è disattivata quando un bucket viene creato.


Attraverso la CLI è possibile utilizzare la riga di comando per gestire gli eventi con il comando events. Il principale comando recupera l’elenco di tutte le regole create nel servizio

aws events list-rules --name-prefix "Alberto"
{
  "Name": "Alberto-regola-esempio",
  "Arn": "arn:aws:events:eu-west-1:xxx:rule/Alberto-regola-esempio",
  "EventPattern": "{\"detail-type\":[\"Object Created\"],\"source\":
    [\"aws.s3\"],\"detail\":{
      \"bucket\":{\"name\":[\"bucket-name\"]},
      \"object\":{\"key\":[{\"prefix\":\"path-base\"}]}}}",
  "State": "ENABLED",
  "EventBusName": "default"
},
{
  "Name": "Alberto-regola-esempio2",
  "Arn": "arn:aws:events:eu-west-1:xxx:rule/Alberto-regola-esempio2",
  "State": "ENABLED",
  "ScheduleExpression": "cron(10 06 ? * 1 *)",
  "EventBusName": "default"
},

Dalla risposta è possibile determinare il tipo (Trigger o Cron) e lo stato ma nella risposta non è disponibile l’informazione del target dell’evento recuperabile con una seconda chiamata:

aws events list-targets-by-rule --rule "Alberto-regola-esempio"
{ "Targets": [
  {
    "Id": "id1",
    "Arn": "arn:aws:lambda:eu-west-1:xxx:function:nome-lambda"
  }
]}

Sempre da riga di comando è possibile abilitare e disabilitare una regola con un semplice esempio:

aws events disable-rule --name "Alberto-regola-esempio"
aws events enable-rule --name "Alberto-regola-esempio"

Come per tutti i servizi, grazie alla libreria SDK boto3 è possibile gestire le regole degli eventi, i principali metodi sono:

def get_lista_regole(profile_name,prefix):
  boto3.setup_default_session(profile_name=profile_name)
  client = boto3.client('events')
  response = client.list_rules(
    NamePrefix=prefix,
    EventBusName='default',
    #NextToken='string',
    Limit=100
  )
  if "Rules" in response:
    return response['Rules']
  return []
def disable_role(profile_name,name):
  boto3.setup_default_session(profile_name=profile_name)
  client = boto3.client('events')
  response = client.disable_rule(
    Name=name,
    EventBusName='default'
  )
  return response
def enable_role(profile_name,name):
  boto3.setup_default_session(profile_name=profile_name)
  client = boto3.client('events')
  response = client.enable_rule(
    Name=name,
    EventBusName='default'
  )
  return response
def describe_rule(profile_name,name):
  boto3.setup_default_session(profile_name=profile_name)
  client = boto3.client('events')
  response = client.describe_rule(
    Name=name,
    EventBusName='default'
  )
  return response

Con CloudFormation è possibile creare regole, sempre molto utile in applicazioni serverless e event-driven, un semplice esempio per eseguire una lambda all’evento di carico di un oggetto in un bucket o eseguire la lambda ogni domenica:

EventBridgeTriggerRole:
  Type: AWS::Events::Rule
  Properties:
    EventBusName: default
    EventPattern: 
      source: 
      - "aws.s3"
      detail-type:
      - "Object Created"
      detail: 
        bucket:
          name: 
            - !Ref SourceBucket
        object:
          key:
            - prefix: !Ref SourcePath
    Targets:
      - Id: id1
        Arn: !GetAtt StartLambdaNewFile.Arn
EventBridgeCronRole:
  Type: AWS::Events::Rule
  Properties:
    EventBusName: default
    State: !RefStateTrigger
    ScheduleExpression: cron(00 09 ? * 1 *)
    #ogni domenica alle 9 di mattina (orario UDC)
    Targets:
      - Id: id1
        Arn: !GetAttLambdaDeleteFunction.Arn

Nel caso di evento che esegue una funzione lambda bisogna sempre ricordarsi di creare una regola specifica per permettere al servizio EventBridge di invocare funzioni Lambda, le famose “resource-based policy statements” del servizio Lambda, su CloudFormation il blocco da aggiungere è del tipo:

PermissionForEventsToInvokeLambda: 
  Type: AWS::Lambda::Permission
  Properties: 
    FunctionName: !Ref ExternalPyLambda
    Action: lambda:InvokeFunction
    Principal: events.amazonaws.com
    SourceArn: !GetAtt TriggerExternalPy.Arn

L’esempio completo con un tutti i dettagli del template è disponibile al solito repository:

github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio06eventBridge
MENU