Pourquoi ma fonction Lambda n'a-t-elle pas été déclenchée par ma règle EventBridge ?

Dernière mise à jour : 15/02/2022

J'ai créé une règle Amazon EventBridge à l'aide de l'AWS Command Line Interface (AWS CLI), de l'API ou d'AWS CloudFormation. Cependant, la fonction AWS Lambda cible n'est pas appelée. Lorsque je crée ou mets à jour la même règle EventBridge via la console de gestion AWS, elle fonctionne correctement. Comment puis-je résoudre ce problème ?

Brève description

Lorsque vous créez une règle EventBridge avec une fonction Lambda comme cible à l'aide de la console EventBridge, les autorisations appropriées sont automatiquement ajoutées dans la politique de ressources de la fonction. Toutefois, lorsque la même règle est créée via l'AWS CLI, le kit SDK ou AWS CloudFormation, vous devez appliquer manuellement les autorisations dans la politique de ressources. Les autorisations permettent au service Amazon EventBridge d'accéder à la fonction Lambda pour l'invoquer.

Solution

Remarque : si vous recevez des messages d'erreurs lors de l'exécution de commandes AWS Command Line Interface (AWS CLI), vérifiez que vous utilisez la version la plus récente de l'AWS CLI.

Passer en revue les métriques CloudWatch pour la règle EventBridge

  1. Ouvrez la console CloudWatch.
  2. Dans le panneau de navigation de gauche, sousMétriques, sélectionnezToutes les métriques.
  3. Sélectionnez l'espace de noms AWS/Events (AWS/Événements).
  4. Sélectionnez les métriques Invocations et FailedInvocations pour la règle que vous êtes en train de passer en revue.

Les points de données Invocations indiquent que la cible a été appelée par la règle. Si des points de données FailedInvocations sont présents, il y a un problème lors de l'appel de la cible. FailedInvocations représente un échec permanent et peut être le résultat de mauvaises autorisations ou d'une mauvaise configuration de la cible.

Confirmer les autorisations appropriées dans la politique de ressources de la fonction Lambda

  1. Ouvrez la console AWS Lambda.
  2. Sélectionnez la fonction cible.
  3. Sélectionnez l'onglet Configuration, puis Permissions (Autorisations).
  4. Dans la section Resource-based policy (Politique basée sur les ressources), passez en revue le document de politique.

Voici un exemple de politique de ressources qui permet à EventBridge d'appeler la fonction 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"
}

Remarque : remplacez l'ARN par la région, l'ID de compte et le nom de ressource appropriés avant le déploiement.

Vous pouvez également utiliser l'API GetPolicy pour récupérer la politique de ressources de la fonction Lambda.

Si la politique de ressources existante ne contient pas les autorisations nécessaires, mettez-la à jour en utilisant les étapes précédentes comme référence. Vous pouvez également mettre à jour la politique à l'aide de la commande AddPermission dans l'AWS CLI. Voici un exemple de commande 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

Ajout d’une file d'attente de lettres mortes Amazon SQS à la cible

EventBridge utilise les files d’attente de lettres mortes (DLQ) Amazon Simple Queue Service (Amazon SQS) pour stocker les événements qui n'ont pas pu être transmis à une cible. Une DLQ SQS peut être jointe au rapport cible FailedInvocations. Il est possible de récupérer des événements à partir de la DLQ et de les analyser pour en savoir plus sur le problème. Une fois la correction terminée, les événements ayant échoué précédemment peuvent être renvoyés à la cible pour traitement.

  1. Ouvrez la règle appropriée dans la console EventBridge.
  2. Sous Select targets (Sélectionner les cibles), sélectionnez Retry policy and dead-letter queue (Politique de nouvelle tentative et file d’attente de lettres mortes).
  3. Sélection d’une file d'attente SQS à utiliser comme DLQ