Perché la mia funzione Lambda non è stata attivata dalla mia regola EventBridge?

Ultimo aggiornamento: 15-02-2022

Ho creato una regola Amazon EventBridge utilizzando AWS Command Line Interface (AWS CLI), l'API o AWS CloudFormation. Tuttavia, la funzione AWS Lambda di destinazione non viene richiamata. Quando creo o aggiorno la stessa regola EventBridge tramite la Console di gestione AWS, la regola funziona correttamente. In che modo posso risolvere il problema?

Breve descrizione

Quando si crea una regola EventBridge con una funzione Lambda come destinazione utilizzando la console EventBridge, le autorizzazioni appropriate vengono aggiunte automaticamente nella policy delle risorse della funzione. Tuttavia, quando la stessa regola viene creata tramite AWS CLI, l'SDK o AWS CloudFormation, devi applicare manualmente le autorizzazioni nella policy delle risorse. Le autorizzazioni concedono al servizio Amazon EventBridge l'accesso per richiamare la funzione Lambda.

Risoluzione

Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi di AWS Command Line Interface (AWS CLI), assicurati di utilizzare la versione più recente di AWS CLI.

Revisione dei parametri CloudWatch per la regola EventBridge

  1. Apri la console CloudWatch.
  2. Dal pannello di navigazione a sinistra, in Parametri, seleziona Tutti i parametri.
  3. Seleziona lo spazio dei nomi AWS/Eventi.
  4. Seleziona i parametri Invocations e FailedInvocations per la regola che stai esaminando.

I datapoint di Invocations indicano che la destinazione è stata richiamata dalla regola. Se sono presenti punti dati FailedInvocations, allora è presente un problema con il richiamo della destinazione. FailedInvocations rappresenta un errore permanente e potrebbe essere il risultato di autorizzazioni errate o di una configurazione errata della destinazione.

Conferma delle autorizzazioni appropriate nella policy delle risorse della funzione Lambda

  1. Apri la console AWS Lambda.
  2. Seleziona la funzione di destinazione.
  3. Seleziona la scheda Configurazione, quindi scegli Autorizzazioni.
  4. Nella sezione Policy basata sulle risorse, rivedi il documento della policy.

Di seguito è riportata una policy di risorse di esempio che consente a EventBridge di richiamare la funzione Lambda:

{
  "Effect": "Allow",
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:region:account-id:function:function-name",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:events:region:account-id:rule/rule-name"
    }
  },
  "Sid": "InvokeLambdaFunction"
}

Nota: sostituisci l'ARN con la regione, l'ID account e il nome della risorsa appropriati prima dell’implementazione.

In alternativa, puoi utilizzare l'API GetPolicy per recuperare la policy delle risorse della funzione Lambda.

Se la policy delle risorse esistente non contiene le autorizzazioni necessarie, aggiorna la policy utilizzando i passaggi precedenti come riferimento. Puoi aggiornare la policy anche utilizzando il comando AddPermission in AWS CLI. Di seguito è riportato un esempio del comando AddPermission:

aws lambda add-permission \
--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule

Aggiungi una coda DLQ di Amazon SQS alla destinazione

EventBridge utilizza le DLQ di Amazon Simple Queue Service (Amazon SQS) per archiviare eventi che non è stato possibile recapitare a una destinazione. Una DLQ di SQS può essere collegata alla destinazione che restituisce l'errore FailedInvocations. Gli eventi possono essere recuperati dalla DLQ e analizzati per ottenere più contesto sul problema. Una volta completata la correzione, gli eventi precedentemente non riusciti possono essere inviati nuovamente alla destinazione per l'elaborazione.

  1. Apri la regola pertinente nella console di EventBridge.
  2. In Seleziona destinazioni seleziona Policy ripetizione e coda DLQ.
  3. Seleziona una coda SQS da usare come coda DLQ