Pourquoi Amazon SNS n’invoque-t-il pas de fonction Lambda lorsqu’il est déclenché par une alarme CloudWatch ?

Lecture de 6 minute(s)
0

Je souhaite qu’Amazon Simple Notification Service (Amazon SNS) invoque une fonction AWS Lambda lorsqu’il est déclenché par une alarme Amazon CloudWatch.

Brève description

Les scénarios suivants vous empêchent d’invoquer une fonction Lambda :

  • La stratégie de ressources d’une fonction Lambda ne vous autorise pas à invoquer la fonction à partir de la rubrique SNS. Pour ce scénario, suivez les étapes décrites dans la section Vérification du document de stratégie basée sur les ressources d’une fonction Lambda.
  • Les invocations de fonction Lambda sont différées. Pour ce scénario, suivez les étapes décrites dans la section Vérification des journaux d’envoi Amazon SNS.

Remarque : la résolution part du principe que vous pouvez appeler l’API Publish sur la rubrique SNS, mais que des erreurs se produisent entre l’intégration Amazon SNS et Lambda. Si vous ne voyez aucune activité sur la rubrique SNS, consultez la page Pourquoi n'ai-je pas reçu de notification SNS relative à mon déclencheur d'alarme CloudWatch ? Cette activité peut inclure les métriques CloudWatch suivantes : NumberOfMessagesPublished, NumberOfNotificationsDelivered ou NumberOfNotificationsFailed

Résolution

Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la page Résolution d’erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez la version la plus récente de l’AWS CLI.

Consultation du document de stratégie basée sur les ressources pour une fonction Lambda

Lorsqu’Amazon SNS invoque une fonction Lambda de manière asynchrone, Lambda lui renvoie un code d’état HTTP 202. Le code d’état indique que Lambda a accepté le message pour un traitement ultérieur. Pour en savoir plus, consultez la page Invocations asynchrones. Si vous recevez une réponse d’échec, consultez vos journaux d’envoi Amazon SNS afin d’obtenir plus d’informations.

Choisissez une résolution en fonction du scénario correspondant à votre compte.

Si la rubrique SNS et la fonction Lambda en question se trouvent dans le même compte :

1.    Ouvrez la console Lambda.

2.    Dans le volet de navigation, choisissez Fonctions, puis sélectionnez la fonction souhaitée.

3.    Sélectionnez l’onglet Configuration, puis choisissez Autorisations.

4.    Dans la section Stratégie basée sur les ressources, choisissez la déclaration de stratégie dans la colonne ID de déclaration pour afficher le document de stratégie. Le document de stratégie suivant s’affiche :

statement id
your-statement-id

principal:
sns.amazonaws.com

effect
allow

action
Lambda:InvokeFunction

conditions
{ "arnlike": { "aws:sourcearn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name" }

Remarque : pour afficher le document de stratégie au format JSON, choisissez Afficher le document de stratégie dans la section Stratégie basée sur les ressources.

S’il vous manque la stratégie de ressources Lambda qui autorise Amazon SNS à invoquer la fonction, ajoutez la fonction suivante au document de stratégie. Utilisez la console Lambda, l'AWS CLI ou le shell AWS CloudShell.

Utilisez la ligne de commande comme indiqué ci-dessous :

aws lambda add-permission \
--function-name your-lambda-function-name \
--statement-id triggerfromsns-statement-id \
--action lambda:invokefunction \
--principal sns.amazonaws.com \
--source-arn arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name

Remarque : remplacez your-lambda-function-name, your-aws-region, your-aws-account-id et your-sns-topic-name par vos valeurs. La commande de l’AWS CLI utilise la région AWS par défaut. Si la fonction Lambda se trouve dans une autre région, vous pouvez remplacer la région par défaut par l'indicateur --region.

Utilisez la console Lambda comme indiqué ci-dessous :

1.    Ouvrez la console Lambda.

2.    Dans le volet de navigation, choisissez Fonctions, puis sélectionnez la fonction en question.

3.    Sélectionnez l’onglet Configuration, puis choisissez Autorisations.

4.    Dans la section Stratégie basée sur les ressources, choisissez Ajouter des autorisations.

5.    Dans Principal, sélectionnez sns.amazonaws.com.

6.    Dans Actions, sélectionnez Lambda:InvokeFunction.

7.    Dans ID de déclaration, entrez un identifiant unique.

8.    Choisissez Enregistrer.

Si la rubrique SNS et la fonction Lambda se trouvent dans des comptes différents :

1.    Configurez des autorisations entre comptes.

2.    Dans les journaux CloudWatch, vérifiez qu’Amazon SNS a bien envoyé un message à Lambda à l’aide de la journalisation du statut de diffusion ou utilisez la métrique CloudWatch NumberOfNotificationsDelivered.

Exemple de réponse réussie entre Amazon SNS et Lambda :

{
    "notification": {
        "messagemd5sum": "your-md5-sum",
        "messageid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "topicarn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic",
        "timestamp": "2021-04-04 14:08:48.083"
    },
    "delivery": {
        "deliveryid": "your-sns-delivery-id",
        "destination": "arn:aws:lambda:your-aws-region:your-aws-account-id:function:your-function-name",
        "providerresponse": "{\ "lambdarequestid\":\ "your-lambda-request-id\"}",
        "dwelltimems": 92,
        "attempts": 1,
        "statuscode": 202
    },
        "status": "success"
}

Consultation des journaux d’envoi Amazon SNS

Consultez les journaux de diffusion de la rubrique SNS à laquelle la fonction Lambda est abonnée. Si la réponse est positive, un code d’état 202 s’affiche.

Pour consulter les journaux CloudWatch relatifs à la rubrique SNS, procédez comme suit :

1.    Ouvrez la console CloudWatch.

2.    Dans le volet de navigation, développez le menu Journaux, puis choisissez Groupes de journaux.

3.    Dans la zone de recherche du filtre, entrez le nom de la rubrique SNS. Deux groupes de journaux relatifs à la rubrique SNS s’affichent : un pour les réussites et l'autre pour les échecs.

4.    Choisissez le groupe de journaux des événements de réussite.

5.    Dans la section Flux de journaux, choisissez Rechercher tout.

Remarque : vous pouvez également vérifier l'horodatage de la demande dans la colonne Heure du dernier événement. Recherchez ensuite l’Amazon Resource Name (ARN) et le nom de la fonction Lambda.

6.    Dans la colonne Flux de journaux, choisissez le flux de journaux que vous souhaitez ouvrir.

Si aucun résultat ne s’affiche, procédez comme suit :

1.    Choisissez Groupes de journaux, puis les groupes de journaux des événements d’échec.

2.    Dans la section Flux de journaux, choisissez Rechercher tout.

3.    Dans la colonne Flux de journaux, choisissez le flux de journaux à ouvrir.

Pour résoudre les échecs figurant dans les groupes de journaux, procédez comme suit :

1.    Vérifiez si la trace X-Ray de la fonction Lambda en question présente un temps d’arrêt élevé. Si tel est le cas, à l’aide de la console CloudWatch, vérifiez que les fonctions Lambda dans cette région présentent le moins d’erreurs et de limitations. Assurez-vous de sélectionner toutes les fonctions, puis sélectionnez les métriques Erreurs et Limitations.

Remarque : la file d’attente Lambda interne peut être sauvegardée lorsque des centaines d’erreurs et de limitations entre les fonctions sont invoquées de manière asynchrone.  Cette sauvegarde peut retarder les appels de fonctions. Il est recommandé de maintenir le taux d’erreurs et de limitations au minimum afin d’éviter des retards indésirables. Pour en savoir plus, consultez la page Invocations asynchrones.

2.    Définissez une file d'attente Amazon Simple Queue Service (Amazon SQS) de destination ou une fonction Lambda pour une gestion distincte. Cela permet d’éviter la perte de messages, car l'âge maximum des événements asynchrones peut être de six heures pour une fonction Lambda.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 4 mois