AWS SQS + SNS + Lambda


11

Je me demandais si je pouvais envoyer un message à la file d'attente SQS et y abonner une rubrique SNS pour déclencher un lambda pour l'envoi d'un e-mail.

SQS -> SNS -> (Lambda) -> SES

Je sais que les messages SNS peuvent être envoyés à SQS mais je suis curieux de savoir si l'inverse est possible

Réponses:


11

Une chose que j'ai faite a été de créer une alarme CloudWatch sur ApproximateNumberOfMessagesVisible( >= 1 for 5 minutes) pour la file d'attente SQS. L'alarme est publiée dans une rubrique SNS qui déclenche la fonction lambda. La fonction lambda boucle jusqu'à ce qu'elle efface la file d'attente.

Cela peut prendre jusqu'à 5 minutes pour se déclencher à partir de l'alarme, mais cela fonctionne de manière fantastique pour les tâches planifiées par lots sans avoir besoin d'interroger la file d'attente. (La granularité des alarmes est de 5 minutes pour les files d'attente actives.)


Je pense faire exactement la même chose. Savez-vous si vous êtes facturé à chaque fois que cloudwatch vérifie votre file d'attente? Pas que nous parlions vraiment de gros sous avec ce genre de chose juste plus curieuse.
Brian F Leighty

De plus, je suppose que d'après ce que vous dites, l'alarme continue d'envoyer des SNS de l'alarme encore et encore? À quoi avez-vous défini le délai d'expiration de votre fonction lambda?
Brian F Leighty

Une autre chose. Désolé pour tous les commentaires. J'étais un peu inquiet avec la partie "approximative". Avez-vous déjà eu un moment où il y avait un message en attente qui n'a pas été traité car il pensait qu'il n'y avait que 0 élément au lieu du 1 élément là-bas?
Brian F Leighty

@BrianFLeighty les chèques sont gratuits. Mais cela n'alarme pas continuellement; il peut nécessiter une deuxième alarme pour les messages se trouvant dans la file d'attente (ajoutée entre la fin de l'exécution de lambda et la prochaine alarme). Le vote peut être une meilleure solution; la mienne fonctionne pour une file d'attente généralement très calme (donc ne vaut pas la peine d'être
sondée

Vous avez manqué le commentaire "approximatif". Cela semble bien fonctionner, mais ymmv
squidpickles

7

Tu ne peux pas y aller SQS -> SNS, seulement SNS -> SQS.

Lambda prend désormais en charge la planification , une option consiste donc à implémenter un poller SQS dans une fonction Lambda et à l'exécuter fréquemment.

Une autre option à considérer est de savoir si vous avez réellement besoin d'une file d'attente. Lambda prend en charge le traitement asynchrone (via le mode d'invocation d'événement) et doit évoluer de manière transparente horizontalement pour gérer les invocations parallèles. Si votre fonction lambda ne nécessite pas l'accès à un magasin d'état central qui pourrait limiter l'exécution parallèle, vous pouvez probablement simplement exécuter toutes vos invocations en parallèle. Je pense cependant qu'il y a une limite d'exécution simultanée de 100 par compte, vous devrez donc peut-être regrouper vos messages pour rester en dessous.


3
il n'y a rien de mal à utiliser les astuces de poller de file d'attente traditionnelles avec lambda: par exemple, si lambda retire la file d'attente d'un message, pendant l'exécution, puis redéclenchez la fonction à la fin; sinon laissez-le s'exécuter ensuite comme prévu
nik.shornikov

1

SQSla file d'attente peut être abonnée au SNSsujet et ainsi traiter les SNSmessages reçus . Actuellement, il n'est pas possible dans une autre direction sans codage supplémentaire (voir par exemple la LambdaFAQ ).

Je dirais qu'il y a quelques options pour le faire, mais ce n'est pas aussi élégant que d'utiliser un système événementiel plus courant AWS event->SQS->Lambda. Sinon, vous devrez peut-être personnaliser / implémenter le code de SQStraitement des files d'attente:

  1. vous pouvez implémenter vos propres sources d'événements
  2. vous pouvez avoir une instance EC2 intermédiaire pour écouter les SQSfiles d' attente, puis pour déclencher des Lambdaévénements SQS

0

Cela a été demandé et répondu il y a un certain temps, mais après y avoir pensé moi-même, j'ai pensé ajouter une approche.

Comme mentionné, les sources d'événements peuvent être le meilleur pari ici. Alternativement, et je n'ai pas testé cela ni réfléchi (c'est donc un peu académique), mais il peut être possible de le faire via un modèle de fan-out avec SNS comme suit:

 1. Create a SNS topic.............................: SNS-topic-01
 2. Subscribe a SQS queue to that topic............: SQS-queue-01
 3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01

En utilisant cette configuration, la soumission d'un message à la rubrique SNS le mettra dans la file d'attente SQS tout en déclenchant simultanément une fonction Lambda associée. Cette fonction Lambda serait écrite pour lire cette même file d'attente SQS mais avec l'interrogation longue activée (jusqu'à 20 secondes) afin qu'elle ne lise pas la file d'attente avant la fin de la mise en file d'attente (c'est-à-dire la condition de concurrence critique).

En substance, ce schéma appelle juste à temps une fonction Lambda pour chaque message SQS mis en file d'attente. Je ne sais pas comment fonctionnent les lecteurs simultanés Long Poll sur SQS (... est-ce que l'un d'eux est supprimé?), Mais ce n'est qu'une autre façon d'envisager de résoudre ce problème. = :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.