AWS SQS + SNS + Lambda

11

Me preguntaba si puedo enviar un mensaje a la cola SQS y suscribirle un tema SNS para activar una lambda para enviar un correo electrónico.

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

Sé que los mensajes SNS se pueden enviar a SQS, pero tengo curiosidad por saber si es posible al revés

Chida
fuente

Respuestas:

11

Una cosa que hice fue crear una alarma CloudWatch activada ApproximateNumberOfMessagesVisible( >= 1 for 5 minutes) para la cola SQS. La alarma se publica en un tema de SNS que activa la función lambda. La función lambda se repite hasta que borra la cola.

La alarma puede tardar hasta 5 minutos en activarse, pero funciona fantásticamente para tareas programadas por lotes sin necesidad de sondear la cola. (La granularidad de la alarma es de 5 minutos para las colas activas).

calamares
fuente
Estoy pensando en hacer exactamente lo mismo. ¿Sabes si te cobran cada vez que Cloudwatch revisa tu cola? No es que estemos hablando mucho dinero con este tipo de cosas más curiosas.
Brian F Leighty
Además, supongo por lo que dice que la alarma sigue enviando SNS de la alarma una y otra vez. ¿A qué tiene configurado el tiempo de espera en su función lambda?
Brian F Leighty
Otra cosa. Perdón por todos los comentarios. Estaba un poco preocupado con la parte "aproximada". ¿Alguna vez ha tenido un mensaje esperando allí que no haya sido tratado ya que pensaba que solo había 0 elementos en lugar del 1 elemento?
Brian F Leighty
@BrianFLeighty los cheques son gratis. Pero no alarma continuamente; puede requerir una segunda alarma para los mensajes que se encuentran en la cola (agregados entre la finalización de la ejecución lambda y la próxima alarma). El sondeo puede ser una mejor solución; mina de obras para una cola normalmente muy tranquilo (por lo tanto no vale la votación.)
squidpickles
Perdí el comentario "aproximado". Eso parece funcionar bien, pero ymmv
squidpickles
7

No puedes ir SQS -> SNS, solo SNS -> SQS.

Lambda ahora admite la programación, por lo que una opción es implementar un sondeo SQS en una función Lambda y ejecutarlo con frecuencia.

Otra opción a considerar es si realmente necesita una cola. Lambda admite el procesamiento asincrónico (a través del modo de invocación de eventos) y debe escalar horizontalmente de forma transparente para manejar invocaciones paralelas. Si su función lambda no requiere acceso a un almacén de estado central que podría restringir la ejecución paralela, entonces probablemente podría ejecutar todas sus invocaciones en paralelo. Sin embargo, creo que hay un límite de ejecución simultánea de 100 por cuenta, por lo que es posible que deba agrupar sus mensajes para mantenerse por debajo de eso.

thexacre
fuente
3
tampoco hay nada de malo en usar trucos de sondeo de cola tradicionales con lambda: por ejemplo, si lambda retira un mensaje, durante la ejecución, luego vuelve a activar la función al final; de lo contrario dejar que ejecutar a continuación como estaba previsto
nik.shornikov
1

SQSla cola se puede suscribir al SNStema y así procesar los SNSmensajes recibidos . Actualmente, no es factible en otra dirección sin codificación adicional (ver, por ejemplo, LambdaPreguntas frecuentes ).

Diría que hay un par de opciones para hacerlo, pero no es tan elegante como usar un sistema más común basado en eventos AWS event->SQS->Lambda. De lo contrario, es posible que deba personalizar / implementar el código de cómo SQSse procesan las colas:

  1. puedes implementar tus propias fuentes de eventos
  2. puede tener alguna instancia EC2 intermedia para escuchar SQScolas y luego disparar Lambdaeventos SQS
dsmsk80
fuente
0

Esto fue preguntado y respondido hace un tiempo, pero habiendo pensado en esto yo mismo, pensé en agregar un enfoque.

Como se mencionó, las fuentes de eventos pueden ser la mejor apuesta aquí. Alternativamente, y no lo he probado ni lo he pensado (así que esto es algo académico), pero puede ser posible lograr esto a través de un patrón Fan-Out con SNS de la siguiente manera:

 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

Al usar esta configuración, enviar un mensaje al tema SNS lo pondrá en cola en la cola SQS mientras activa simultáneamente una función complementaria de Lambda. Esa función Lambda se escribiría para leer esa misma cola SQS pero con Long Polling habilitado (hasta 20 segundos) para que no lea la cola antes de que se complete la cola (es decir, condición de carrera).

En esencia, este esquema justo a tiempo invoca una función Lambda para cada mensaje SQS en cola. No sé cómo funcionan los lectores de Long Poll simultáneos en SQS (... ¿se cae uno?), Pero esta es solo otra forma de considerar resolver esto. = :)

NYCeyes
fuente