AWS SQS + SNS + Lambda

11

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

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

Sei que as mensagens SNS podem ser enviadas para o SQS, mas estou curioso para saber o contrário.

Chida
fonte

Respostas:

11

Uma coisa que fiz foi criar um alarme do CloudWatch ativado ApproximateNumberOfMessagesVisible( >= 1 for 5 minutes) para a fila 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 levar até 5 minutos para disparar a partir do alarme, mas funciona de maneira fantástica para tarefas agendadas em lote sem a necessidade de pesquisar a fila. (A granularidade do alarme é de 5 minutos para filas ativas.)

squidpickles
fonte
Estou pensando em fazer exatamente a mesma coisa. Você sabe se é cobrado cada vez que o cloudwatch verifica sua fila? Não que nós estamos realmente falando muito dinheiro com esse tipo de coisa apenas mais curiosa.
Brian F Leighty
Além disso, estou assumindo pelo que você diz que o alarme continua enviando SNS do alarme repetidamente? A que tempo de espera da sua função lambda está definida?
Brian F Leighty
Mais uma coisa Desculpe por todos os comentários. Fiquei um pouco preocupado com a parte "Aproximada". Você já teve um tempo em que havia uma mensagem esperando lá que não era resolvida, pois pensava que havia apenas 0 itens em vez do item 1?
Brian F Leighty
@BrianFLeighty os cheques são gratuitos. Mas não alarma continuamente; pode ser necessário um segundo alarme para as mensagens na fila (adicionadas entre a conclusão da execução do lambda e o próximo alarme). A pesquisa pode ser uma solução melhor; meu trabalha para uma fila normalmente muito tranquila (daí não vale polling.)
squidpickles
Perdeu o comentário "aproximado". Isso parece funcionar bem, mas ymmv
squidpickles
7

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

O Lambda agora suporta agendamento, portanto, uma opção é implementar um pesquisador SQS em uma função 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 (por meio do modo de chamada de evento) e deve ser escalado horizontalmente de forma transparente para lidar com chamadas paralelas. Se sua função lambda não requer acesso a um armazenamento de estado central que pode restringir a execução paralela, provavelmente você pode executar todas as suas chamadas em paralelo. Porém, acredito que há um limite de execução simultânea de 100 contas por conta; portanto, você pode precisar agrupar suas mensagens para permanecer abaixo disso.

thexacre
fonte
3
também não há nada de errado em usar os truques tradicionais do pesquisador de filas com o lambda: por exemplo, se o lambda remove da fila uma mensagem, durante a execução, em seguida, reative a função no final; caso contrário, deixe-o executar como programado
nik.shornikov 26/04/16
1

SQSA fila pode ser inscrita no SNStópico e, assim, processar as SNSmensagens recebidas . Atualmente, não é possível em outra direção sem codificação adicional (consulte, por exemplo, LambdaFAQ ).

Eu diria que existem algumas opções de como fazê-lo, mas não é tão elegante quanto o uso de sistemas orientados a eventos mais comuns AWS event->SQS->Lambda. Caso contrário, pode ser necessário customizar / implementar o código de como as SQSfilas são processadas:

  1. você pode implementar suas próprias fontes de eventos
  2. você pode ter alguma instância intermediária do EC2 para ouvir SQSfilas e, em seguida, acionar Lambdaeventos SQS
dsmsk80
fonte
0

Isso foi perguntado e respondido há um tempo atrás, mas tendo acabado de pensar nisso, pensei em adicionar uma abordagem.

Como mencionado, as fontes de eventos podem ser a melhor aposta aqui. Como alternativa, e eu não testei isso nem pensei nisso (portanto, isso é meio acadêmico), mas pode ser possível fazer isso por meio de um padrão Fan-Out com o SNS da seguinte maneira:

 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 para o tópico do SNS enfileirará-a na fila do SQS enquanto aciona simultaneamente uma função complementar do Lambda. Essa função Lambda seria gravada para ler a mesma fila SQS, mas com a Pesquisa longa ativada (até 20 segundos) para que ela não leia a fila antes que o enfileiramento seja concluído (ou seja, condição de corrida).

Em essência, esse esquema just-in-time invoca uma função Lambda para cada mensagem SQS enfileirada. Não sei como os leitores simultâneos da Long Poll funcionam no SQS (... alguém é descartado?), Mas essa é apenas outra maneira de considerar a solução. = :)

NYCeyes
fonte