AWS SQS + SNS + Lambda

11

Eu queria saber se posso enviar uma mensagem para a fila do SQS e inscrever um tópico do SNS nela para acionar um lambda para enviar um email.

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

Eu sei que as mensagens do SNS podem ser enviadas para o SQS, mas estou curioso para saber se o contrário é possível

    
por Chida 23.12.2015 / 15:14

4 respostas

11

Uma coisa que fiz foi criar um alarme do CloudWatch em ApproximateNumberOfMessagesVisible ( >= 1 for 5 minutes ) para a fila do SQS. O alarme é publicado em um tópico do SNS que aciona a função lambda. A função lambda faz um loop até limpar a fila.

Pode demorar até 5 minutos para disparar a partir do alarme, mas funciona fantasticamente para tarefas agendadas por lotes sem precisar pesquisar a fila. (A granularidade do alarme é de 5 minutos para as filas ativas.)

    
por 19.03.2016 / 07:32
7

Você não pode ir em SQS -> SNS , apenas SNS -> SQS .

O Lambda agora suporta o agendamento , portanto, uma opção é implementar um Poller SQS em uma função do Lambda e executá-lo com freqüência.

Outra opção a considerar é se você realmente precisa de uma fila. O Lambda suporta processamento assíncrono (através do modo de invocação de evento) e deve escalar horizontalmente de forma transparente para lidar com invocações paralelas. Se sua função lambda não requer acesso a um armazenamento de estado central que possa restringir a execução paralela, você provavelmente poderia executar todas as suas chamadas em paralelo. Acredito que exista um limite de 100 execuções simultâneas por conta, portanto, talvez seja necessário agrupar suas mensagens para permanecer abaixo disso.

    
por 26.12.2015 / 20:34
1
A fila

SQS pode ser inscrita no tópico SNS e, assim, processar as mensagens SNS recebidas. Atualmente, não é possível em outra direção sem codificação adicional (ver, por exemplo, Lambda FAQ ).

Eu diria que há algumas opções de como fazer isso, mas não é tão elegante quanto usar o sistema mais comum baseado em eventos AWS event->SQS->Lambda . Caso contrário, talvez seja necessário personalizar / implementar o código como SQS filas são processadas:

  1. você pode implementar suas próprias origens de eventos
  2. você pode ter alguma instância intermediária do EC2 para ouvir SQS filas e depois acionar Lambda em eventos SQS
por 24.12.2015 / 00:54
0

Isso foi perguntado e respondido há algum tempo, mas tendo acabado de pensar sobre isso, pensei em acrescentar uma abordagem.

Como mencionado, Fontes de eventos pode ser a melhor aposta aqui. Alternativamente, e eu não testei isso nem pensei nisso (então isso é meio acadêmico), mas pode ser possível fazer isso através de um padrão de Fan-Out com SNS da seguinte forma:

 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

Usando essa configuração, o envio de uma mensagem ao tópico do SNS a enfileirará na fila do SQS enquanto, simultaneamente, acionar uma função do Lambda associada. Essa função Lambda seria gravada para ler a mesma fila SQS, mas com Long Polling ativada (até 20 segundos) para que ela não leia a fila antes que o enfileiramento seja concluído (isto é, condição de corrida).

Essencialmente, este esquema just-in-time invoca uma função do Lambda para cada mensagem SQS enfileirada. Eu não sei como os leitores Long Poll trabalham simultaneamente no SQS (... um é descartado?), Mas isso é apenas outra maneira de considerar a solução disso. =:)

    
por 03.11.2018 / 02:48