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

Ultimo aggiornamento: 10/08/2022

Ho creato una regola Amazon EventBridge utilizzando l’interfaccia della linea di comando AWS (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 crei una regola EventBridge con una funzione Lambda come destinazione, tieni presente quanto segue:

  • Quando si utilizza la console EventBridge per creare la regola, le autorizzazioni appropriate vengono aggiunte automaticamente alle policy delle risorse della funzione.
  • Quando si utilizza AWS CLI, l'SDK o AWS CloudFormation, è necessario applicare manualmente le autorizzazioni nella policy delle risorse per creare le stessa regola.

Le autorizzazioni concedono al servizio Amazon EventBridge l'accesso per richiamare la funzione Lambda.

Risoluzione

Nota: se ricevi un messaggio di errore durante l'esecuzione dei comandi di AWS CLI, assicurati di utilizzarne la versione più recente.

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 Destinazioni, seleziona Modifica, quindi espandi la sezione Impostazioni aggiuntive.
  3. In coda DLQ, scegli Seleziona una coda Amazon SQS nell'account AWS corrente da utilizzare come coda DLQ.
  4. Seleziona una coda SQS da usare come coda DLQ.
  5. Dopo aver assegnato il DLQ, completa i passaggi rimanenti nella sezione Modifica regola per salvare le modifiche.